Spring中beanDefinition合并操作分析
2021/11/3 6:11:24
本文主要是介绍Spring中beanDefinition合并操作分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在Spring中,beanDefinition加载后会被放置beanDefinitionMap,当Spring容器进行bean对象创建时,这个过程中会先进行beanDefinition的合并;
对于单例对象流程大致如下:
AbstractBeanFactory#doGetBean
在进行bean对象创建前会先进行beanDefinition的合并操作;
对于子beanDefinition是可以继承父beanDefinition的;
例子如下:
将父beanDefinition设置为多例类型;
@Test public void childBeanDefinitionTest1() { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); // 作为一个父类,也可以是一个普通类 RootBeanDefinition beanADefinition = new RootBeanDefinition(BeanA.class); beanADefinition.setScope(AbstractBeanDefinition.SCOPE_PROTOTYPE); ChildBeanDefinition childBeanDefinition = new ChildBeanDefinition("beanA"); childBeanDefinition.setBeanClass(BeanB.class); context.registerBeanDefinition("beanA", beanADefinition); context.registerBeanDefinition("beanB", childBeanDefinition); context.refresh(); }
此时BeanA,BeanB都没有被实例化,BeanA的beanDefinition的scope为prototype类型,说明BeanA的beanBeanDefinition被BeanB的beanDefinition继承了;
从上面的例子可以看出,beanDefinition具有继承性;
例子如下:
将子beanDefinition设置为多例类型;
@Test public void childBeanDefinitionTest1() { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); // 作为一个父类,也可以是一个普通类 RootBeanDefinition beanADefinition = new RootBeanDefinition(BeanA.class); ChildBeanDefinition childBeanDefinition = new ChildBeanDefinition("beanA"); childBeanDefinition.setBeanClass(BeanB.class); childBeanDefinition.setScope(AbstractBeanDefinition.SCOPE_PROTOTYPE); context.registerBeanDefinition("beanA", beanADefinition); context.registerBeanDefinition("beanB", childBeanDefinition); context.refresh(); }
此时只有一个BeanA进行实例化,BeanA的beanDefinition作为父beanDefinition,默认为单例,BeanB的beanDefinition设置为多例,因此BeanB不能被显示实例化;
getMergedLocalBeanDefinition最终会调用到下面方法;
AbstractBeanFactory#getMergedBeanDefinition(java.lang.String, org.springframework.beans.factory.config.BeanDefinition, org.springframework.beans.factory.config.BeanDefinition)
而对于beanDefinition为parent类型的会执行cloneBeanDefinition方法,clone意思是克隆,常见于原型模式,如下:
而这个this表示原始的beanDefinition,beanDefinitionMap中的beanDefinition;
为何需要进行beanDefinition合并的操作?
对于Spring来说,spring不知道当前bean的beanDefinition是否存在继承,因此父子beanDefinition都需要进行merge操作;
这篇关于Spring中beanDefinition合并操作分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-07如何利用看板工具优化品牌内容创作与审批,确保按时发布?
- 2025-01-07百万架构师第十一课:源码分析:Spring 源码分析:Spring源码分析前篇|JavaGuide
- 2025-01-07质量检测标准严苛,这 6 款办公软件达标了吗?
- 2025-01-07提升品牌活动管理的效率:看板工具助力品牌活动日历的可视化管理
- 2025-01-07宠物商场的精准营销秘籍:揭秘看板软件的力量
- 2025-01-07“30了,资深骑手” | 程序员能有什么好出路?
- 2025-01-07宠物公园的营销秘籍:看板软件如何帮你精准触达目标客户?
- 2025-01-07从任务分解到资源优化:甘特图工具全解析
- 2025-01-07企业升级必备指南:从传统办公软件到SaaS工具的转型攻略
- 2025-01-07一文告诉你IT项目管理如何做到高效