【知识库】--spring AbstractAutowireCapableBeanFactory 创建bean(240)
来源:互联网 发布:各大电商平台比价软件 编辑:程序博客网 时间:2024/05/17 06:29
写在前:
前面bean加载部分中,经过resolveBeforeInstantiation方法后,如果创建了代理(即重写了InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法并且在方法中改变了bean)直接返回即可,否则进行常规bean的创建。
常规的创建是在doCreateBean中完成的
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args){ //Instantiate the bean BeanWrapper instanceWrapper = null; if(mbd.isSingleton()){instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if(instanceWrapper == null){ instanceWrapper = createBeanInstance(beanName,mbd,args);//使用对应的策略创建新的实例:工厂方法,构造函数自动注入,简单初始化 } final Object bean = (instanceWrapper!=null?instanceWrapper.getWrapperInstance():null); Class beanType = (instanceWrapper!=null?instanceWrapper.getWrapperClass():null); //allow post-processors to modify the merged bean definition synchronized (mbd.postProcessingLock){ if(!mbd.postProcessed){ //使用MergedBeanDefinitionPostProcessor applyMergedBeanDefinitionPostProcessors(mbd,beanType,beanName); mbd.postProcessed = true; } } //是否需要提前曝光:单例&允许循环依赖&bean正在创建 boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); if(earlySingletonExposure){ addSingletonFactory(beanName, new ObjectFactory(){public Object getObject() throws BeansException{ //对bean再一次依赖引用,主要应用SmartInstantiationAwareBeanPostProcessor, //其中我们熟悉的AOP就是在这里将advice动态织入bean中,若没有直接返回bean. return getEarlyBeanReference(beanName,mbd,bean); }}); } //Initialize the bean instance Object exposedObject = bean; try{ //对bean进行填充,将各个属性值注入,可能存在依赖于其他bean的属性,递归依赖bean populateBean(beanName,mbd,instanceWrapper); if(exposedObject !=null){//调用初始化方法 如 init-method exposedObject = initializeBean(beanName,exposedObject,mbd); } }catch(Throwable ex){ //… } if(earlySingletonExposure){ Object earlySingletonReference = getSingleton(beanName,false);if(earlySingletonReference != null){// 有循环依赖//没有被增强if(exposedObject == bean){ exposedObject = earlySingletonReference;}else if(!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)){String[] dependentBeans = getDependentBeans(beanName);Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length);for(String dependentBean : dependentBeans){ //检测依赖if(!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)){actualDependentBeans.add(dependentBean);}}//如果actualDependentBeans不为空表示当前bean创建后其依赖的bean却没有创建完,说明存在循环依赖if(!actualDependentBeans.isEmpty()){//抛出BeanCurrentlyInCreationException}}} } try{//注册为一次性可销毁的bean registerDisposableBeanIfNecessary(beanName,bean,mbd); }catch(){}return exposedObject;}
阅读全文
0 0
- 【知识库】--spring AbstractAutowireCapableBeanFactory 创建bean(240)
- 【知识库】--spring 记录创建bean(单例)的ObjectFactory(240)
- 【知识库】--spring 创建bean的实例-createBeanInstance方法解析(240)
- Spring Bean的生命周期之我的理解(四)------AbstractAutowireCapableBeanFactory
- Spring源码之AbstractAutowireCapableBeanFactory
- 【知识库】--spring --bean的加载简介(226)
- 【知识库】--spring 之循环依赖(240)
- spring中的BEAN创建
- spring 动态创建bean
- Spring-工厂创建Bean
- Spring-创建bean
- spring无法创建Bean
- Spring Bean 创建过程
- Spring bean创建
- spring bean创建细节
- 2、Spring Bean创建
- spring 动态创建bean
- spring bean创建
- jsp 中select 下拉选择框 el 三元运算符 如何选中与不选中
- 海牛简介
- 017. Spring 声明式事务管理(XML)
- POJ 2303 Russian Dolls 笔记
- 物理渲染学习笔记(一) —— 前置知识
- 【知识库】--spring AbstractAutowireCapableBeanFactory 创建bean(240)
- java中的异常
- Elasticsearch 5.1.1 head 插件安装指南
- 浅析RPC远程过程调用基本原理
- 考研逻辑整理
- 初见CSDN
- Hadoop 学习研究(十): 自定义输入输出
- LeetCode#448. Find All Numbers Disappeared in an Array LeetCode#442. Find All Duplicates in an Array
- SpringMvc+MyBatis+MySQL+Maven+Redis搭建一个基础的web项目