spring源码分析-spring上下文的初始化
来源:互联网 发布:淘宝的nike官方旗舰店 编辑:程序博客网 时间:2024/04/29 12:27
下面是上下文初始化的核心方法
public void refresh() throws BeansException, IllegalStateException { Object var1 = this.startupShutdownMonitor; synchronized(this.startupShutdownMonitor) {// 准备工作 this.prepareRefresh();// 获取beanFactory,此方法会读取解析application.xml,得到Bean的定义,注册到beanFactory ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();// 配置beanFactory this.prepareBeanFactory(beanFactory); try {//提供扩展,配置beanFactory this.postProcessBeanFactory(beanFactory);//执行beanFactoryPostProcessorsthis.invokeBeanFactoryPostProcessors(beanFactory);//注册beanPostProcessors this.registerBeanPostProcessors(beanFactory); this.initMessageSource(); this.initApplicationEventMulticaster(); this.onRefresh(); this.registerListeners();//bean的实例化和初始化 this.finishBeanFactoryInitialization(beanFactory); this.finishRefresh(); } catch (BeansException var5) { this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt", var5); this.destroyBeans(); this.cancelRefresh(var5); throw var5; } }}
spring配置解析:
https://www.cnblogs.com/leftthen/p/5615066.html
我们来详细说明一下核心方法
invokeBeanFactoryPostProcessors
从beanDefinitionNames得到实现了BeanFactoryPostProcessor的类,实例化之后执行其核心方法,
这个操作发生在业务bean的实例化之前,这是一个容器级别的processor,主要是为了在bean实例化之前进行一些处理,目前项目中有两处有两处用到,一个是替换配置文件中的变量,我们在spring的配置文件中配置一个bean,实现BeanFactoryPostProcessor,从zk上读取一些值。另一个是配置了一个扫描mapper的bean,这个也实现了BeanFactoryPostProcessor,负责将mapper托管给bean工厂
registerBeanPostProcessors
从beanDefinitionNames得到实现了BeanPostProcessor的类,实例化之后注册到beanFactory,关于beanPostProcessor的作用不做赘述(网上的资料已经把这个讲烂了)
finishBeanFactoryInitialization
这个方法的核心是对bean的实例化
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException { if(this.logger.isDebugEnabled()) { this.logger.debug("Creating instance of bean \'" + beanName + "\'"); } this.resolveBeanClass(mbd, beanName, new Class[0]); try { mbd.prepareMethodOverrides(); } catch (BeanDefinitionValidationException var5) { throw new BeanDefinitionStoreException(mbd.getResourceDescription(), beanName, "Validation of method overrides failed", var5); } Object beanInstance; try { beanInstance = this.resolveBeforeInstantiation(beanName, mbd); if(beanInstance != null) { return beanInstance; } } catch (Throwable var6) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var6); } beanInstance = this.doCreateBean(beanName, mbd, args); if(this.logger.isDebugEnabled()) { this.logger.debug("Finished creating instance of bean \'" + beanName + "\'"); } return beanInstance;}
resolveBeforeInstantiation:这步操作会判断是否需要执行 InstantiationAwareBeanPostProcessor,这是一种非常特殊的BeanPostProcessor,通常的BeanPostProcessor都是发生在bean实例化之后,对bean的初始化进行前后干预,而这个InstantiationAwareBeanPostProcessor是对bean的实例化前后干预
doCreateBean:创建bean的实例,然后初始化bean,初始化bean前后执行对应的postProcessor
下图描述了bean的实例化和初始化过程
依赖注入:
实例化后
this.populateBean(beanName, mbd, instanceWrapper);
使用AutowiredAnnotationBeanPostProcessor进行依赖注入,具体是里面的AutowiredFieldElement中的inject方法
- spring源码分析-spring上下文的初始化
- Spring源码分析【1】-Tomcat的初始化
- Spring mvc 上下文初始化过程
- Spring Security3源码分析-FilterChainProxy初始化
- Spring Security3源码分析-FilterChainProxy初始化
- Spring Security3源码分析-FilterChainProxy初始化
- Spring Security3源码分析-FilterChainProxy初始化
- Spring源码分析(六)IOC初始化
- Spring 初始化过程详细分析[源码](一)
- Spring 初始化过程详细分析 [源码] (二)
- Spring IOC容器bean初始化源码分析
- Spring MVC初始化部分源码分析
- Spring Security3源码分析-FilterChainProxy初始化
- Spring初始化过程源码分析(1)
- Spring源码分析3----Web环境中的SpringMVC(Web容器中的上下文的设计)
- 【Spring mvc】Spring MVC源码分析——初始化过程
- Spring源码分析4 — spring bean创建和初始化
- Spring源码分析3 — spring bean创建和初始化
- 图像处理入门教程
- HBase详细概述
- Codeforces Round #333 (Div. 2)-D Lipshitz Sequence(单调栈)
- Pandas学习笔记:文件I/O
- uva 1622 贪心
- spring源码分析-spring上下文的初始化
- 调试LocalFree(NULL)
- STL-仿函数
- Hadoop生态系统
- Java 基础(7)—— super
- VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT
- Intel芯片架构中TEE的实现技术之SGX初探
- 手动升级ubuntu openssh-server
- 【51nod】1101 换零钱