原文链接:zhuanlan.zhihu.com/p/157679528
Spring配置类的Full模式和Lite模式
Lite模式
官方定义为:在没有标注@Configuration的类里面有@Bean方法就称为Lite模式的配置类。
透过源码再看这个定义是不完全正确的,而应该是如下case均认为是Lite模式的配置类。
- 类上没有标注
@Configuration,但有@Component、@ComponentScan、@Import、@ImportResource; - 类上没有注解,但类内方法存在
@Bean注解。
在Spring 5.2之后,新增了一种case也算作Lite模式:
标注有@Configuration(proxyBeanMethods = false)的类,注意:此值默认是true。
自Spring 5.2(对应Spring Boot 2.2.0)开始,内置的几乎所有的
@Configuration配置类都被修改为了@Configuration(proxyBeanMethods = false),目的是:降低启动时间,为Cloud Native做准备。
Lite模式优缺点
优点:
- 运行时不再需要给对应类生成CGLIB子类,放进IoC容器内的就是本尊,提高了运行性能,降低了启动时间;
- 不用生成代理意味着该配置类可以是private、final的。
缺点:
- 不能通过方法调用来依赖其它Bean,即不能通过方法调用声明@Bean之间的依赖(可以通过作为入参规避)。
Full模式优缺点
优点:
- Full模式下,交叉方法引用会被重定向到容器的生命周期管理,可以方便地管理Bean依赖。
缺点参照Lite模式的优点。
关于“通过方法调用声明Bean之间的依赖”例子
如下,transactionManager通过dateSource()声明了它依赖dataSource。
而且dateSource()方法只会被调用一次。
@Configuration
public class DataSourceConfig {
...
@Bean
public DataSource dataSource() {
...
return dataSource;
}
@Bean(name = "transactionManager")
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
...
}