springBoot中Bean注解全解析

@Bean 基础声明

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

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

@Bean的基本构成

@Target({
          
   ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
          
   
    @AliasFor("name")
    String[] value() default {
          
   };

    @AliasFor("value")
    String[] name() default {
          
   };

    /** @deprecated */
    @Deprecated
    Autowire autowire() default Autowire.NO;

    boolean autowireCandidate() default true;

    String initMethod() default "";

    String destroyMethod() default "(inferred)";
}

@Bean不仅可以作用在方法上,也可以作用在注解类型上,在运行时提供注册。

value: name属性的别名,在不需要其他属性时使用,也就是说value 就是默认值

name: 此bean 的名称,或多个名称,主要的bean的名称加别名。如果未指定,则bean的名称是带注解方法的名称。如果指定了,方法的名称就会忽略,如果没有其他属性声明的话,bean的名称和别名可能通过value属性配置

autowire : 此注解的方法表示自动装配的类型,返回一个Autowire类型的枚举,autowire的默认值为No,默认表示不通过自动装配。

initMethod: 这个可选择的方法在bean实例化的时候调用

InitializationBean接口允许bean在合适的时机通过设置注解的初始化属性从而调用初始化方法,InitializationBean 接口有一个定义好的初始化方法。不推荐使用InitializationBean 来调用其初始化方法,因为它将不必要的代码耦合到Spring

destroyMethod: 方法的可选择名称在调用bean示例在关闭上下文的时候,例如JDBC的close()方法,或者SqlSession的close()方法。DisposableBean 接口的实现允许在bean销毁的时候进行回调调用

@Bean的用法

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

@Configuration
public class UserConfig {
          
   
    @Bean(name = "userbean1")
    public User getUser1(){
          
   
        return new User(1, "韩梅梅1", "北京市");
    }
}

这个配置就等同于之前在xml里的配置

<bean id="userbean1" class="com.fmj.springboot.model.User">
	<property name="id" value="1"></property>
	<property name="name" value="韩梅梅1"></property>
	<property name="address" value="北京市"></property>
</bean>

@bean 也可以依赖其他任意数量的bean,可以通过方法参数实现依赖,如下

@Configuration
public class UserConfig {
          
   
    @Bean(name = "userbean1")
    public User getUser1(){
          
   
        return new User(1, "韩梅梅1", "北京市");
    }
    
    @Bean(name = "userbean2")
    public User setUser2(@Qualifier("userbean1") @Autowired User user){
          
   
        user.setId(1000);
        return user;
    }
}
经验分享 程序员 微信小程序 职场和发展