尚硅谷springboot2day1

今天是2021-1-18
看完springboot1.x几个月后,在今天开始看雷神的springboot2,第一天看就学到了以前没学过的知识,果然还是自己学的太浅了。
一。spring配置类的两种模式
没有深入源码,就从最终效果简单说一下吧,spring的配置类有两种模式,full模式以及lite模式。
full模式:
1.一般我们习惯在类上标注@Configuration,在里面写标注@bean的方法,这样来实现一个配置类给容器中注入组件。这样的写法被成为full模式,而在spring5.2以后,官方这样描述:标注有@Configuration或者@Configuration(proxyBeanMethods = true)的类被称为Full模式的配置类。
2.使用了上述写法以后,在full模式的配置类中,标注了@bean的方法间可以相互调用,如果一个方法被调用了多次,调用者们得到的都是同一个对象,即单例模式的bean。
3.这样的原因是full模式的配置类本身会使用cglib生成一个代理对象,将代理对象注册到容器中,调用类中的@bean方法时,获取的都是ioc容器中单例集合中缓存的bean。
4.配置类本身被代理的要求就是,类本身不能是final类,因为cglib通过继承目标类生成代理对象,类中的@bean方法不能是private或者final,因为要重写。
5.full模式的配置类需要生成代理对象注入容器,所以会消耗一定的性能。
lite模式:
1.对比full模式来看,类上没有@Configuration或者@Configuration(proxyBeanMethods = false),但类内有@bean的方法,这种就是lite模式配置类
2.在lite模式下,配置类本身不会被cglib代理,直接把真实对象注册到容器中,此时@bean方法之间不能相互调用来指定依赖关系,因为此时方法返回的对象不再从ioc容器的单例集合中取,会重新创建一个新实例。而且因为没有被代理,所以@bean方法可以为private或者final,类本身也可以是final
3.lite模式下不会代理配置类,所以提高了启动时间,自Spring5.2(对应Spring Boot 2.2.0)开始,内置的几乎所有的@Configuration配置类都被修改为了@Configuration(proxyBeanMethods = false),目的何为?答:以此来降低启动时间,为Cloud Native继续做准备。

猜你喜欢

转载自blog.csdn.net/qq_44727091/article/details/112796837