文章目录
@Configuration注解
1. @Configuration注解什么作用?
被@Configuration注解修饰表示当前的类是一个配置类。看一下@Configuration注解源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
// 此值标记与@Component注解一样的功能。所以@Configuration与@Component一样觉有注册的功能。
@AliasFor(annotation = Component.class)
String value() default "";
// 是否针对当前的配置类生产CGLIB的代理对象结合@Bean注解来使用,如果生成代理对象的话,每次对象注入的时候,会先去容器中获取一把。
boolean proxyBeanMethods() default true;
}
1.1 value值验证,与@Component一样的功能
创建一个model类,加上@Configuration注解
@Configuration
public class Bean {
private String name = "bean";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试一下
public class SpringDemo {
public static void main(String[] args) {
// 注册Bean类
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Bean.class);
// 获取Bean对象
Bean bean = applicationContext.getBean(Bean.class);
// 输出name值
System.out.println(bean.getName());
}
}
结果:
由上面的测试,可以看出@Configuration是具备@Component的功能的。
1.2 proxyBeanMethods值验证,是否生产CGLIB代理类
注解的意思是proxyBeanMethods配置类是用来指定@Bean注解标注的方法是否使用代理,
1.2.1 proxyBeanMethods 值为true
创建model类
public class Screen {
public Screen() {
System.out.println("Screen bean 被创建了");
}
}
public class Phone {
private Screen screen;
public Screen getScreen() {
return screen;
}
public void setScreen(Screen screen) {
this.screen = screen;
}
}
编写配置类
// Cglib 开启状态
@Configuration(proxyBeanMethods = true)
public class Config {
@Bean
public Phone getPhone(){
Phone phone = new Phone();
phone.setScreen(getScreen());
return phone;
}
@Bean
public Screen getScreen(){
Screen screen = new Screen();
return screen;
}
}
测试一下:可知Screen对象被创建了一次。
1.2.1 proxyBeanMethods 值为false
其他保持不变,配置类改一下
// Cglib 关闭状态
@Configuration(proxyBeanMethods = false)
public class Config {
@Bean
public Phone getPhone(){
Phone phone = new Phone();
phone.setScreen(getScreen());
return phone;
}
@Bean
public Screen getScreen(){
Screen screen = new Screen();
return screen;
}
}