一、ApplicationContext的中文意思是“应用上下文”,它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持、资源访问(如URL和文件)、事件传播等方面进行了良好的支持,被推荐为Java EE应用之首选,可应用在Java APP与Java Web中。
二、ApplicationContext相对于XmlBeanFactory做了很多是拓展的功能,而这些拓展的功能,不管是在容器初始化,还是中间需要处理的过程,都做了很大的改善以及深入。
三、先看一下ApplicationContext的继承关系图,了解一下和XmlBeanFactory的区别
注意:这是一张ClassPathXmlApplicationContext的继承关系图,目前是为了更好的呈现,当前bean在加载的时候做的那些事情。
四、可能有人会问,为什么没有DefaultListableBeanFactory的相关属性了呢,这个在源码的讲解部分会细说。
五、源码解析
1)增强性的bean容器初始化实现方式
public static void main(String[] args) { //增强性的bean容器初始化化 ApplicationContext context = new ClassPathXmlApplicationContext("spring-bean.xml"); }
2)实现过程
public ClassPathXmlApplicationContext(String configLocation) throws BeansException { this(new String[]{configLocation}, true, (ApplicationContext)null); } public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException { super(parent); //设置需要加载的xml文件 this.setConfigLocations(configLocations); if (refresh) { //容器的整个初始化过程都在这里实现 this.refresh(); } }
3)refresh
public void refresh() throws BeansException, IllegalStateException { Object var1 = this.startupShutdownMonitor; synchronized(this.startupShutdownMonitor) { //前期准备工作 this.prepareRefresh(); //xml解析过程 ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory(); //beanFactory的准备过程 this.prepareBeanFactory(beanFactory); try { //BeanFactoryPostProcessor接口拓展 this.postProcessBeanFactory(beanFactory); this.invokeBeanFactoryPostProcessors(beanFactory); //注册BeanPostProcessor的实现接口,实际调用在getBean的时候 this.registerBeanPostProcessors(beanFactory); //国际化 this.initMessageSource(); //初始化应用广播器 this.initApplicationEventMulticaster(); //子类应用 this.onRefresh(); //监听部分 this.registerListeners(); //完成初始化 this.finishBeanFactoryInitialization(beanFactory); //完成刷新 this.finishRefresh(); } catch (BeansException var4) { this.destroyBeans(); this.cancelRefresh(var4); throw var4; } } }
六、因为ApplicationContext在做容器初始化的时候做了很多工作,所以我这里会形成一个目录,来讲解剩下的部分。
2)spring源码-BeanFactoryPostProcessor-3.2