zoukankan      html  css  js  c++  java
  • Spring源码分析

    核心组件:

    bean,context,core。

    加载方式:(策略模式)

    1、ApplicationContext

    ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统加载文件。

    2、AnnotationConfigApplicationContext。ApplicationContext ac=new AnnotationConfigApplicationContext(Beans.class); 

    3、

    WebApplicationContext wac=(WebApplicationContext)servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

    1、直接加载ClassPathXmlApplicationContext>AbstractApplicationContext

    1
    2
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    Hello hello = (Hello)context.getBean("h4");

    2、监听器加载

    ContextLoaderListener>ContextLoader>AbstractApplicationContext

    1
    2
    3
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    加载xml就做了三件事:

      1、super(parent)

        没什么太大的作用,设置一下父级ApplicationContext,这里是null

      2、setConfigLocations(configLocations)

        代码就不贴了,一看就知道,里面做了两件事情:

        (1)将指定的Spring配置文件的路径存储到本地

        (2)解析Spring配置文件路径中的${PlaceHolder}占位符,替换为系统变量中PlaceHolder对应的Value值,System本身就自带一些系统变量比如class.path、os.name、user.dir等,也可以通过System.setProperty()方法设置自己需要的系统变量

      3、refresh() 都在AbstractApplicationContext刷新上下文信息。

        这个就是整个Spring Bean加载的核心了,它是ClassPathXmlApplicationContext的父类AbstractApplicationContext的一个方法,顾名思义,用于刷新整个Spring上下文信息,定义了整个Spring上下文加载的流程。

    1、方法是加锁的,这么做的原因是避免多线程同时刷新Spring上下文

      2、尽管加锁可以看到是针对整个方法体的,但是没有在方法前加synchronized关键字,而使用了对象锁startUpShutdownMonitor,这样做有两个好处:

        (1)refresh()方法和close()方法都使用了startUpShutdownMonitor对象锁加锁,这就保证了在调用refresh()方法的时候无法调用close()方法,反之亦然,避免了冲突

        (2)另外一个好处不在这个方法中体现,但是提一下,使用对象锁可以减小了同步的范围,只对不能并发的代码块进行加锁,提高了整体代码运行的效率

    BeanFactory:

    BeanFactory 只能管理单例(Singleton)Bean 的生命周期。它不能管理原型(prototype,非单例)Bean 的生命周期。这是因为原型 Bean 实例被创建之后便被传给了客户端,容器失去了对它们的引用。



  • 相关阅读:
    python自动化测试(2)--读取excel中的测试用例并使用列表进行存放
    Numpy学习记录
    Tensorflow环境安装记录--无法识别GPU的问题
    Tensorflow框架学习(1)--CNN的实现
    IDEA创建springboot项目总是创建失败问题的解决
    java_集合知识点小结
    java易错知识点汇总_1
    struts2 中文件的位置问题
    struts2 action中的私有变量
    span 标记 width 设置
  • 原文地址:https://www.cnblogs.com/shuchen007/p/9173147.html
Copyright © 2011-2022 走看看