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 实例被创建之后便被传给了客户端,容器失去了对它们的引用。



  • 相关阅读:
    svn cleanup failed–previous operation has not finished 解决方法
    开源SNS社区系统推荐
    从网络获取图片本地保存
    MS SQL Server 数据库连接字符串
    KeepAlive
    Configure Git in debian
    sqlserver query time
    RPi Text to Speech (Speech Synthesis)
    SQL Joins with C# LINQ
    search or reseed identity columns in sqlserver 2008
  • 原文地址:https://www.cnblogs.com/shuchen007/p/9173147.html
Copyright © 2011-2022 走看看