@Configuration这个注解相信大家都不陌生,配置类注解。
在SpringBoot2中,@Configuration中可以如下使用
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
/**
* Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
* @return
*/
@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user01(){
User zhangsan = new User("zhangsan", 18);
//user组件依赖了Pet组件
zhangsan.setPet(tomcatPet());
return zhangsan;
}
@Bean("tom")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
proxyBeanMethods注意到这个属性了吧,我们知道,在上图中,@Bean是用来注册组件到容器之中的,如下图,我们从容器中连续取俩次Pet,取到的是否相等呢,我们知道,当是单例模式时取到的必然相等。那我们回到proxyBeanMethods这个属性,当他为true时,表示注册到容器中的Myconfig这个类是一个代理类,而Myconfig这个类可以调用tomcatPet()这个方法,容器每次获取Pet对象都会调用tomcatPet()这个方法,当容器中的myconfig是一个代理类时,每次调用方法之前都会检查springboot容器中是否有Pet对象,如果有就会直接从容器中取出,没有才调用方法创建对象。而当proxyBeanMethods这个属性为false时,表示注册到容器中的Myconfig这个类不是一个代理类,那么每次调用tomcatPet()方法之前不会检查springboot容器中是否有Pet对象,而是直接调用方法创建一个对象,那么两个Pet对象便不会相同。
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.atguigu.boot")
public class MainApplication {
public static void main(String[] args) {
//1、返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
//3、从容器中获取组件
Pet tom01 = run.getBean("tom", Pet.class);
Pet tom02 = run.getBean("tom", Pet.class);
System.out.println("组件:"+(tom01 == tom02));
因此
配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断,也就是让@Configuration(proxyBeanMethods = false)
配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式,也就是@Configuration(proxyBeanMethods = true)