Spring基本执行过程解析

来源:互联网 发布:js调用微信分享sdk 编辑:程序博客网 时间:2024/06/01 09:14


一。基本过程

1.当创建一个上下文:

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");

2.进入ClassPathXmlApplicationContext.java

public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)throws BeansException {super(parent);//2-1setConfigLocations(configLocations);//2-2if (refresh) {refresh();//2-3}}

2-1 :解析super(parent)

主要功能是获取 ResourcePatternResolver

经过层层调用,在AbstractApplicationContext.java中:

this.resourcePatternResolver = getResourcePatternResolver();

getResourcePatternResolver经过查看为:

new PathMatchingResourcePatternResolver(this);


结论:主要作用是设置applicationContext对象的resourcePatternResolver 属性为new PathMatchingResourcePatternResolver(this)


2-2 :setConfigLocations(configLocations)

替换配置文件名称中的占位符


2-3 :见下一节 refresh()详解


二。refresh()详解

进入AbstractApplicationContext # refresh()

synchronized (this.startupShutdownMonitor) {// 1prepareRefresh();// 2ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 3prepareBeanFactory(beanFactory);try {// 4postProcessBeanFactory(beanFactory);// 5invokeBeanFactoryPostProcessors(beanFactory);// 6registerBeanPostProcessors(beanFactory);// 7initMessageSource();// 8initApplicationEventMulticaster();// 9onRefresh();// 10registerListeners();// 11finishBeanFactoryInitialization(beanFactory);// 12finishRefresh();}catch (BeansException ex) {logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex);// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}}

1、prepareRefresh()

进入此方法,可以看到两个比较重要的步骤

 initPropertySources();   //初始化属性源,比如从properties文件中读取,从url读取....这个方法一般交给子类实现

getEnvironment().validateRequiredProperties();    //验证资源中的占位符是否在必要的属性源中都存在,若不存在则抛出异                              常MissingRequiredPropertiesException


2.ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()

进入方法 ,比较重要的一段为↓

refreshBeanFactory();    //*****初始化beanDefinitionMap---->加载xml中的<bean>beanDefinition

此时可以 看到alreadyCreated属性数量小于beanDefinitionMap长度


3.prepareBeanFactory(beanFactory);

初始化这个上下文中beanFactory的一些特性


4.postProcessBeanFactory(beanFactory);

对这个beanFactory进行后处理,由子类实现


5.invokeBeanFactoryPostProcessors(beanFactory);

调用beanFactory的处理器(如果有的话)

BeanFactoryPostProcessor接口实现类可以在当前BeanFactory初始化后,bean实例化之前对BeanFactory做一些处理

注解处理器:可以载入beanDefinitionMap()

SpringBoot中:读取属性处理器:读取property文件到Enviroment中

SpringBoot中:


6.registerBeanPostProcessors(beanFactory);

如果BeanPostProcessors接口的某个实现类被注册到某个容器,那么该容器的每个受管Bean在调用初始化方法之前,都会获得该接口实现类的一个回调


7.initMessageSource(); 国际化使用



8.initApplicationEventMulticaster();    //初始化上下文 监听广播器


9.onRefresh(); 

//初始化一些特殊的bean


10.registerListeners();


11 finishBeanFactoryInitialization(beanFactory);

//初始化其他的bean
可以查看alreadyCreated 

12 finishRefresh();

1 0
原创粉丝点击