@Configuration
基本介绍
@Configuration是Spring3.0以后提供的注解,代替xml配置文件。从源码可以看出,使用了@Component,说明被@Configuration标注的类本身也是组件。
@Target(TYPE)
@Retention(RUNTIME)
@Documented
@Component
public @interface Configuration
@Bean
配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的。@Bean给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
@Bean
public User user01(){
return new User("张三",18);
}
@Bean("tom")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
测试:
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//查看容器里的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
//从容器中获取组件
Pet tom01 = run.getBean("tom",Pet.class);
Pet tom02 = run.getBean("tom",Pet.class);
//结果为true,说明是同一个实例
System.out.println("组件:"+(tom01 == tom02));
}
Full模式与Lite模式
proxyBeanMethods是Spring5.2以后加入到@Configuration中的属性,用于代理bean的方法。有true和false两种取值,代表两种模式:
- Full模式:proxyBeanMethods = true,使用CGLib代理生成代理对象,代理对象调用方法。SpringBoot总会检查是否在容器中,保持组件单实例
- Lite(轻量)模式:proxyBeanMethods = false,不会被代理,每次调用都会返回一个新的Bean对象
使用场景:
- 配置类组件之间无依赖关系用Lite模式,加速容器启动过程,减少判断
- 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
验证proxyBeanMethods属性
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
MyConfig bean = run.getBean(MyConfig.class);
System.out.println(bean);
User user = bean.user01();
User user1 = bean.user01();
System.out.println(user == user1);
}
}
配置MyConfig为 @Configuration(proxyBeanMethods = true)
配置MyConfig为 @Configuration(proxyBeanMethods = false)