Spring配置类的Full模式和Lite模式

1,613 阅读1分钟

原文链接:zhuanlan.zhihu.com/p/157679528

Spring配置类的Full模式和Lite模式

Lite模式

官方定义为:在没有标注@Configuration的类里面有@Bean方法就称为Lite模式的配置类。 透过源码再看这个定义是不完全正确的,而应该是如下case均认为是Lite模式的配置类。

  1. 类上没有标注@Configuration,但有@Component@ComponentScan@Import@ImportResource
  2. 类上没有注解,但类内方法存在@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());
    }
    ...
}