@Configuration详解
一、@Configuration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
可以看到在@Configuration
注解中是包含@Component
注解的,被@Configuration
修饰的类被定义为一个Spring容器(应用上下文)
@Configuration
就相当于Spring配置文件中的<beans />
标签,里面可以配置bean
二、@Bean
@Bean相当于Spring配置文件中的<bean />
标签可以在Spring容器中注入一个bean
@Configuration
public class TestConfiguration {
@Bean
public TestBean testBean() {
return new TestBean();
}
}
上述代码相当于实例化一个TestBean并交给Spring容器管理
ps:
1、@Bean注解在返回实例的方法上,如果未通过@Bean指定bean的名称,则默认与方法名相同
2、@Bean注解默认作用域为单例singleton作用域
,可通过@Scope(“prototype”)设置为多例
三、依赖注入
@Configuration
public class TestConfiguration {
@Bean
public TestBean testBean() {
return new TestBean();
}
@Bean
public DIBean diBean() {
return new DIBean(testBean());
}
}
如上述代码,通过在@Bean方法中调用其他@Bean注解的方法来实现依赖注入
ps:
当需要强制指定实例化bean的顺序
,可以通过@Order或@DependsOn注解来实现
除此之外我们还能使用@Component声明Spring Bean
@Configuration和@Component区别
public class Car {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Driver {
private int id;
private String name;
private Car car;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;