ToB企服应用市场:ToB评测及商务社交产业平台

标题: Spring配置类为什么要分Full和Lite模式 [打印本页]

作者: 兜兜零元    时间: 2023-4-4 14:10
标题: Spring配置类为什么要分Full和Lite模式
本文基于Spring 5.2.15-RELEASE
关于Spring配置类的Full模式和Lite模式,如果没有仔细阅读过源码或者官方文档的话,估计很多人都不知道这个概念。所以我们先来解释下这两个概念。

概念解释
  1. @Configuration
  2. public class DataSourceConfig {
  3.         ...
  4.         @Bean
  5.     public DataSource dataSource() {
  6.             ...
  7.         return dataSource;
  8.     }
  9.     @Bean(name = "transactionManager")
  10.     public DataSourceTransactionManager transactionManager() {
  11.         return new DataSourceTransactionManager(dataSource());
  12.     }
  13.         ...
  14. }
复制代码
DataSourceConfig就是一个在Spring中非常常见的配置类,这个配置类本身也会被注册成Spring容器中的一个Bean。上面这种配置方式默认的就是Full模式。为什么默认是Full模式呢?其实秘密就藏在@Configuration这个注解中。
  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Component
  5. public @interface Configuration {
  6.         @AliasFor(annotation = Component.class)
  7.         String value() default "";
  8.     // 默认会通过Cglib对产生Bean的方法进行增强
  9.         boolean proxyBeanMethods() default true;
  10. }
复制代码
这个注解有一个属性proxyBeanMethods。这个属性的值默认是true,会通过Cglib对这个配置类进行增强,增强后这个配置类就显得比较“重”,因此叫Full模式。如果我们将这个属性设置成false的话,这个配置类产生的Bean就是原始的对象,比较“轻量级”,叫Lite模式。因此,Full模式和Lite模式最本质的区别是:配置类本身的Bean对象会不会被Cglib增强。
这里再强调一个概念:Full模式和Lite模式都是说DataSourceConfig这个配置类是Full模式或者Lite模式。
Lite模式

上面提到,将@Configuration的proxyBeanMethods属性设置成false就Lite模式的配置类,其实还有很多其他的场景也属于Lite模式。整理下来,大致有以下这些场景:
自Spring5.2(对应Spring Boot 2.2.0)开始,内置的几乎所有的@Configuration配置类都被修改为了@Configuration(proxyBeanMethods = false),以此来降低启动时间,为Cloud Native继续做准备。
优点
缺点
  1. @Configuration(proxyBeanMethods = false)
  2. public class DataSourceConfig {
  3.         ...
  4.         @Bean
  5.     public DataSource dataSource() {
  6.             ...
  7.         return dataSource;
  8.     }
  9.     @Bean(name = "transactionManager")
  10.     public DataSourceTransactionManager transactionManager() {
  11.         // 此处的dataSource()调用就是一次普通的方法调用,不会引用Spring IOC容器中的单列Bean
  12.         return new DataSourceTransactionManager(dataSource());
  13.     }
  14.         ...
  15. }
复制代码
这个问题可以这样解决
  1. @Configuration(proxyBeanMethods = false)
  2. public class DataSourceConfig {
  3.         ...
  4.         @Bean
  5.     public DataSource dataSource() {
  6.             ...
  7.         return dataSource;
  8.     }
  9.     @Bean(name = "transactionManager")
  10.     // 通过方法参数引用Spring容易中的Bean
  11.     public DataSourceTransactionManager transactionManager(DataSource dataSource) {
  12.         return new DataSourceTransactionManager(dataSource;
  13.     }
  14.         ...
  15. }
复制代码
Full模式

标注有@Configuration或者@Configuration(***proxyBeanMethods = true***)的类被称为Full模式的配置类。
优点
缺点
简单总结

Spring的配置类分成Full和Lite两种模式。
在Lite模式下
在Full模式下
从上面的介绍可以看出来,Lite模式很大程度上是为了减少启动开销,提升程序的启动速度。所以如果你对程序的启动速度很敏感,就使用Lite模式,但是一定要记住此时的配置类已经不是经过Cglib增强过的类了。
参考


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4