Spring Boot注解全攻略(一):@Bean

8,754 阅读1分钟

前言

Bean可以说是Spring当中最为重要的概念之一了。简单来说,Bean就是一个对象,只不过这个对象是由Spring容器来初始化,装配,管理的,因此也可以叫做Spring Bean。这个术语是从delphiVB继承过来的。SpringIoCAOP相关概念就从其他文章去了解,我们这里就直接从Bean的装配开始,探索Spring注解的使用。

要做好Java, 需要将Bean(豆子)注入Container(咖啡壶)

源码

@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)";
}

注:当注解中只传入value一个属性的时候,value属性的名称可以省略;即:@Bean(value="myBean")等同于@Bean("myBean");Alias是别名的意思,因此使用@Bean(name="myBean")也是一样的效果。

使用

通常,@Bean方法在@Configuration类中声明。

@Configuration
public class AppConfig {
    @Bean
    public FooService fooService() {
        return new FooService(fooRepository());
    }

    @Bean
    public FooRepository fooRepository() {
        return new JdbcFooRepository(datasource());
    }
    
    // ...
}

在上面的代码中,我们向Spring容器中注入了两个Bean,当没有显式命名时,自动注册的名称为方法名。

使用name属性显式命名如下:

@Bean({"b1", "b2"}) // Bean可以用'b1'或者'b2'取到,而非'myBean'
public MyBean myBean() {
    // 此处初始化和配置MyBean对象
    return obj;
}  

补充说明

一些注解可以和@Bean组合使用:

  • @Profile允许选择性包含某些bean
  • @Scope将bean的范围从单例更改为指定的范围
  • @Lazy在使用是才创建bean
  • @DependsOn会在创建此bean前创建特定的其他bean,以及该bean通过直接引用表示的任何依赖关系
  • @Primary用于在注入点级别解决歧义性