【知识库】--spring 记录创建bean(单例)的ObjectFactory(240)
来源:互联网 发布:朋友圈砍价软件 编辑:程序博客网 时间:2024/05/21 14:53
ObjectFactory作用:单例提前曝光--singleton循环依赖
doCreateBean中代码片段
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName));//在创建的单例允许循环依赖
if(earlySingletonExposure){
//在bean初始化完成之前将创建的ObjectFactory加入工厂--循环依赖
addSingletonFactory(beanName,new ObjectFactory(){// 注册回调
public Object getObject() throws BeansException{
//主要应用SmartInstantiationAwareBeanPostProcessor, AOP将advice动态织入bean中
return getEarlyBeanReference(beanName,mbd,bean);
}
});
}
回调代码:
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean){
Object exposedObject = bean;
if(bean!=null && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()){
//增强处理 AOP动态织入
for(BeanPostProcessor bp : getBeanPostProcessors()){
if(bp instanceof SmartInstantiationAwareBeanPostProcessor){
SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
exposedObject = ibp.getEarlyBeanReference(exposedObject,beanName);
if(exposedObject == null){
return exposedObject;
}
}
}
}
return exposedObject;
}
注意:1.this.allowCircularReferences 可以通过硬编码方式进行设置或者自定义命名空间进行配置,硬编码格式:
ClassPathXmlApplicationContext cnx = new ClassPathXmlApplicationContext("app.xml");
cnx.setAllowCircularReferences(false);
2. 如何标记某个单例正在创建中呢?
singleton记录属性的函数是在:DefaultSingletonBeanRegistry中的函数:
public Object getSingleton(String beanName, ObjectFactory singletonFactory)中:
beforeSingletonCreation(beanName) , afterSingletonCreation(beanName)中:
this.singletonsCurrentlyInCreation.add(beanName),this.singletonsCurrentlyInCreation.remove(beanName);
2.1 DefaultSingletonBeanRegistry 单例注册中心,各种缓存。
3.回调什么时候会触发? A-->B-->C-->A
循环依赖的末尾C会通过:getBean(A)触发回调,结束递归创建。--解决依赖
- 【知识库】--spring 记录创建bean(单例)的ObjectFactory(240)
- bean的加载(九)记录创建bean的ObjectFactory
- 【知识库】--spring AbstractAutowireCapableBeanFactory 创建bean(240)
- 【知识库】--spring 创建bean的实例-createBeanInstance方法解析(240)
- 【知识库】--spring --bean的加载简介(226)
- spring创建单例bean和非单例bean的方式
- Spring学习笔记 关于Spring创建Bean的模式-Singleton(单例模式)和Prototype
- Spring学习笔记 关于Spring创建Bean的模式-Singleton(单例模式)和Prototype
- Spring创建单例bean
- 关于Spring创建Bean的模式-Singleton(单例模式)和Prototype
- spring源码:创建单例对象时用到了ObjectFactory匿名类
- Spring单例Bean
- 【知识库】--spring 之循环依赖(240)
- Spring管理Bean的生命周期,Spring创建的Bean是单实例还是多实例?
- Spring的原型Bean与单例Bean的设置
- Spring的原型Bean与单例Bean的设置
- 使用Spring的单例创建Struts2 action Bean的问题
- 1.spring bean的作用域(是否单例):bean
- Java多线程中Synchronized和Lock的区别
- 【note】the swift programming language Swift教程笔记
- Ubuntu一键安装BBR脚本
- AndroidStudio安装kotlin插件及其配置过程
- Gradle version 2.10 is required. Current version is
- 【知识库】--spring 记录创建bean(单例)的ObjectFactory(240)
- Leangoo英文版来了~
- 统计学习方法之感知机(Perception Mechine)
- Homework_1
- 分布式开发技术
- 为什么接口中的成员变量非得是public static final?
- SQL Server联机丛书
- 初来乍到
- javascript发展史和入门教程