前言
Bean可以说是Spring当中最为重要的概念之一了。简单来说,Bean就是一个对象,只不过这个对象是由Spring容器来初始化,装配,管理的,因此也可以叫做Spring Bean。这个术语是从delphi和VB继承过来的。Spring的IoC和AOP相关概念就从其他文章去了解,我们这里就直接从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用于在注入点级别解决歧义性