• spring源码-bean之增强初始化-3


      一、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在做容器初始化的时候做了很多工作,所以我这里会形成一个目录,来讲解剩下的部分。

      1)spring源码-增强容器xml解析-3.1

      2)spring源码-BeanFactoryPostProcessor-3.2

      3)spring源码-BeanPostProcessor-3.3

      4)spring源码-Aware-3.4

      5)spring源码-国际化-3.5

      6)spring源码-事件&监听3.6

  • 相关阅读:
    MyBatis 学习笔记
    JavaEE路径陷阱之getRealPath
    Java路径问题最终解决方案—可定位所有资源的相对路径寻址
    Hibernate4.3.10通过slf4j使用log4j
    Hibernate关联关系映射
    SpringMVC 学习笔记
    Spring 学习笔记
    Hibernate 学习笔记
    Struts2 学习笔记
    vue element tree组件,根据不同的状态显示不同的字体颜色
  • 原文地址:https://www.cnblogs.com/ll409546297/p/9493086.html
Copyright © 2020-2023  润新知