zoukankan      html  css  js  c++  java
  • 详细讲解Spring中的@Bean注解

    随着SpringBoot的流行,我们现在更多采用基于注解式的配置从而替换掉了基于XML的配置,所以本篇文章我们主要探讨基于注解的@Bean以及和其他注解的使用;

    @Bean 基础概念

    1. @Bean:Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中;

    2. SpringIOC 容器管理一个或者多个bean,这些bean都需要在@Configuration注解下进行创建,在一个方法上使用@Bean注解就表明这个方法需要交给Spring进行管理;

    3. @Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名;

    4. 使用Bean时,即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;

    5. 注册Bean时,@Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装;

    6. @Configuration与@Bean结合使用:@Configuration可理解为用spring的时候xml里面的标签,@Bean可理解为用spring的时候xml里面的标签;

    快速搭建一个maven项目并配置好所需要的Spring 依赖

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.13.RELEASE</version>
    </dependency>
    
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.3.13.RELEASE</version>
    </dependency>
    
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.3.13.RELEASE</version>
    </dependency>
    
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.3.13.RELEASE</version>
    </dependency>

    在src根目录下创建一个AppConfig的配置类,这个配置类也就是管理一个或多个bean 的配置类,并在其内部声明一个myBean的bean,并创建其对应的实体类

    @Configuration
    public class AppConfig {
    
        // 使用@Bean 注解表明myBean需要交给Spring进行管理
        // 未指定bean 的名称,默认采用的是 "方法名" + "首字母小写"的配置方式
        @Bean
        public MyBean myBean(){
            return new MyBean();
        }
    }
    
    public class MyBean {
    
        public MyBean(){
            System.out.println("MyBean Initializing");
        }
    }

    然后再创建一个测试类SpringBeanApplicationTests,测试上述代码的正确性

    public class SpringBeanApplicationTests {
    
        public static void main(String[] args) {
            ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
            context.getBean("myBean");
        }
    }

    深入了解@Bean注解的源代码

    @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Bean {
        @AliasFor("name")
        String[] value() default {};
        @AliasFor("value")
        String[] name() default {};
        Autowire autowire() default Autowire.NO;
        String initMethod() default "";
        String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;
    }

    @Bean的属性:

    1. value:bean别名和name是相互依赖关联的,value,name如果都使用的话值必须要一致;

    2. name:bean名称,如果不写会默认为注解的方法名称;

    3. autowire:自定装配默认是不开启的,建议尽量不要开启,因为自动装配不能装配基本数据类型、字符串、数组等,这是自动装配设计的局限性,并且自动装配不如依赖注入精确;

    4. initMethod:bean的初始化之前的执行方法,该参数一般不怎么用,因为完全可以在代码中实现;

    5. destroyMethod:默认使用javaConfig配置的bean,如果存在close或者shutdown方法,则在bean销毁时会自动执行该方法,如果你不想执行该方法,则添加@Bean(destroyMethod="")来防止出发销毁方法;

    https://mp.weixin.qq.com/s/iCwycZ9ZfWzjMqaz5BxspA

    故乡明
  • 相关阅读:
    每日一题:用一个SQL语句交换两条数据某一列的值
    String value(); String[] value(); 比较
    java.sql.SQLException: Unknown system variable 'tx_isolation'
    return; 用法
    Linux和UNIX的关系及区别(详解版)
    404
    Centos 7 修改YUM镜像源地址为阿里云镜像地址
    JVM面试必备
    秒杀优化迭代
    电商秒杀基础构建项目笔记2(优化效验准则和商品模型创建)
  • 原文地址:https://www.cnblogs.com/luweiweicode/p/15103335.html
Copyright © 2011-2022 走看看