@Configuration注解Full模式和Lite模式

本文深入解析Spring框架中的两种配置模式——Full模式与Lite模式。详细介绍了两种模式的应用场景、优缺点,并探讨了如何选择合适的模式以提高应用性能。

Full模式和Lite模式均是针对于Spring配置类而言的,和xml配置文件无关。

Full模式

标注有@Configuration或者@Configuration(proxyBeanMethods = true)的类被称为Full模式的配置类,proxyBeanMethods默认为TRUE。在常见的场景中,@Bean方法都会在标注有@Configuration的类中声明,以确保总是使用“Full模式”,这么一来,交叉方法引用会被重定向到容器的生命周期管理,所以就可以更方便的管理Bean依赖。

优点:可以支持通过常规Java调用相同类的@Bean方法而保证是容器内的Bean,这有效规避了在“Lite模式”下操作时难以跟踪的细微错误。

缺点:1.运行时会给该类生成一个CGLIB子类放进容器,有一定的性能、时间开销(这个开销在Spring Boot这种拥有大量配置类的情况下是不容忽视的,这也是为何Spring 5.2新增了proxyBeanMethods属性的最直接原因)

    2.正因为被代理了,所以@Bean方法 不可以是private、不可以是final

Lite模式

当@Bean方法在没有使用@Configuration注释的类中声明时,它们被称为在Lite模式下处理。它包括:在@Component中声明的@Bean方法,甚至只是在一个非常普通的类中声明的Bean方法,都被认为是Lite版的配置类。@Bean方法是一种通用的工厂方法(factory-method)机制。

  和Full模式的@Configuration不同,Lite模式的@Bean方法不能声明Bean之间的依赖关系。因此,这样的@Bean方法不应该调用其他@Bean方法。每个这样的方法实际上只是一个特定Bean引用的工厂方法(factory-method),没有任何特殊的运行时语义。

  以下配置属于Lite模式:

  • 类上标注有@Component注解
  • 类上标注有@ComponentScan注解
  • 类上标注有@Import注解
  • 类上标注有@ImportResource注解
  • 若类上没有任何注解,但类内存在@Bean方法
  • 注有@Configuration(proxyBeanMethods = false)

  自Spring5.2(对应Spring Boot 2.2.0)开始,内置的几乎所有的@Configuration配置类都被修改为了@Configuration(proxyBeanMethods = false),目的是以此来降低启动时间,为Cloud Native继续做准备。

优点:1.运行时不再需要给对应类生成CGLIB子类,提高了运行性能,降低了启动时间
   2.可以该配置类当作一个普通类使用喽:也就是说@Bean方法 可以是private、可以是final

缺点:不能声明@Bean之间的依赖,也就是说不能通过方法调用来依赖其它Bean(可以用其它方式“弥补”,比如:把依赖Bean放进方法入参)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值