再看下ProxyConfiguration配置的情况:
public class Tests { @Test public void runConfig() { log.info("configuration: {}", proxyConfiguration); // 1、CGLIB代理的对象 log.info("Configuration中的Bean: {}", proxyConfiguration.dogCage() == proxyConfiguration.dogCage()); // 2、两次结果相同 log.info("容器中的Bnea: {}", beanFactory.getBean(DogCage.class) == beanFactory.getBean(DogCage.class));// 3、从Spring容器中取值都是一样的 animalCage.cages.forEach(cage -> { if (cage instanceof DogCage) { log.info("dogCage : {} ", cage == dogCage); // 和上面的对象不一致,非单例 } }); }}
会得到这样的现象:
- proxyBeanMethods = true时,从Spring容器中取出的Configuration是一个Cglib代理配置,否则是一个原始类型配置
- proxyBeanMethods = true时 , 多次调用Bean方法,每次都是一个新对象 , 否则都是同一个对象
- 从Spring容器中取出Bean,不管多少次,都是同一个对象,也就是单例的
lite模式包含:
- 被@Component修饰的类
- 通过@ComponentScan扫描的类
- 通过@Import导入的配置类
- 通过@ImportResource导入的Spring配置文件
- 没有任何Spring相关注解,类里面有@Bean修饰的方法
- 被@Configuration修饰,但proxyBeanMethods = false
- 被@Configuration修饰,且属性proxyBeanMethods = true(默认)
- full模式下的配置类会被Cglib代理生成代理类取代原始类型保存到在容器中
- full模式下的@Bean方法不能是private和final,因为方法会被重写
- 单例scope下不同@Bean方法可以互相引用,实现单实例的语义
- lite模式下的配置类不生成代理,原始类型进入容器
- lite模式下的@Bean方法可以是private和final
- 单例scope下不同@Bean方法引用时无法做到单例,通过@Bean方法生成的对象都是新的实例
【Configuration源码,你了解多少?】
推荐阅读
- 让你起飞的五个Prompt框架模型
- 苹果QQ聊天记录导出的3个方法你知道吗?
- 语音通话也能录音?你可能不知道
- 如何给微信上锁?教你三种方法,保护微信资金安全
- 一个简单的动作,比散步还简单!每天10分钟,帮你减肥缓解颈椎病
- 工作忙碌也能搬的搬砖游戏,这几款你一定爱!
- 黄碧云经典语录,我爱你似鲸入海似鸟投林
- 40岁之后,提升气质的12个小习惯,快来看,你占了几个?
- 搞笑有趣,越看越开心,每天好心情
- 被禁的6部高质量网剧,你有幸看过几部?