zoukankan      html  css  js  c++  java
  • Spring Framework启动详解

    之前一直对Spring启动的过程很迷糊,所以这次国庆梳理一下。

    Spring启动一言以蔽之:创建一个根应用上下文。(因为其他的所有的应用上下文都可以通过各种方式继承它)

    (一)了解应用上下文

    Spring Framework容器以一个或多个应用上下文的形式存在,由org.springframework.context.ApplicationContext接口表示。每一个应用上下文管理着一组bean、执行业务逻辑的Java对象、执行任务、持久化和获取持久化数据、响应HTTP请求等。由Spring管理的bean可以自动进行依赖注入、消息通知、定时方法执行、bean验证和执行其他关键的Spring服务。

    在多个应用上下文组成的层次结构中,任何由Spring管理的bean都可以访问相同的应用上下文、父亲应用上下文、父亲的父亲应用上下文的bean(依次类推)。但是它们不能访问兄弟或孩子应用上下文的bean。这对于定于一组共享应用模块来说非常有用,它可以将应用模块彼此隔开。

     

    有许多接口都继承了ApplicationContext,也有许多类实现了它:

    a)ConfigurableApplicationContext接口是可配置的,而基本的ApplicationContext是只读的;

    b)org.springframework.web.context.WebApplicationContext和ConfiguableWebApplicationContext接口被设计用于Servlet容器中运行的Java EE Web应用程序,它们提供了对底层ServletContext和ServletConfig的访问;

    c)具体类ClassPathXmlApplicationContext和FileSystemXmlApplicationContext被设计用于在独立运行的应用程序中从XML文件加载Spring配置,而XmlWebApplicationContext被设计用于在Java EE Web应用程序中实现相同的目标;

    d)如果需要使用Java而不是使用XML以编程的方式对Spring进行配置,那么AnnotationConfigApplicationContext和AnnotationConfigWebApplicationContext类分别可用于独立运行的应用程序和Java EE Web应用程序中。

    (二)启动Spring Framework

    配置和启动Spring Framework是两个不同的任务,并且相互独立,都可以通过多种不同的方式实现。当配置告诉Spring如何运行它所包含的应用程序时,启动进程将启动Spring并将配置指令传递给它。

    在Java SE应用程序中,只有一种方式启动Spring:通过应用程序中的public static void main(String ...)方法以编程的方式启动;

    在Java EE应用程序中,有两种选择:可以使用XML创建部署描述符启动Spring,也可以在javax.servlet.ServletContainerInitializer中通过编程的方式启动Spring。

    a)使用部署描述符启动Spring

    <context-param>                <!--Spring上下文配置-->
       <param-name>contextConfigLocation</param-name>              
       <param-value>/WEB-INF/rootContext.xml</param-value>        <!--指定配置文件地址及文件名称-->
    </context-param>
    <listener>         <!--上下文初始化监听器-->
       <listener-class>org.springframework.web.context.ContextloadListener</listener-class>
    </listener>
    
    <servlet>        <!--配置Servlet-->
        <servlet-name>springDispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/servletContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springDispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    ContextLoaderListerner将在Web应用程序启动时被初始化(因为它实现了ServletContextListerner,所有它将在所有的Servlet之前初始化),然后从contextConfigLocation上下文初始化参数指定的/WEB-INF/rootContext.xml文件中加载根应用上下文,并启动根应用上下文。

    其中出现了两个contextConfigLocation,两者并不冲突,前者作用于整个Servlet上下文,而后者只作用于它所指定的Servlet。

    b)在初始化器中使用编程的方式启动Spring

    public class Bootstrap implements WebApplicationInitializer{
        @overvide
        public void onStartup(ServletContext container){
            XmlWebApplicationContex rootContext = new XmlWebApplicationContex();
            rootContext.setConfigLocation("/WEB-INF/rootContext.xml");
            container.addListener(new ContextLoaderListerner(rootContext));
    
            XmlWebApplicationContex servletContext = new XmlWebApplicationContex();
            servletCOntext.setConfigLocation("/WEB-INF/servletContext.xml");
            ServletRegistration.Dynamic dispatcher = container.addServlet(
                "springDispatcher", new DispatcherServlet(servletContext)
                );
            dispatcher.setLoadOnStartup(1);
            dispatcher.addMapping("/");
    
        }
    }

    这个启动类等同于之前使用的部署描述符,方便理解;当然也还存在使用纯Java的方式启动和配置Spring。

    (三)配置Spring Framework与注释

    Spring的配置一般可以完全在XML文件的<beans>空间中配置完成,但是在庞大的企业应用程序中,可能会定义数百个bean,显然这种方式是很难基于Spring源码去调试的,所以基于这个考虑出现了混合配置的概念。

    混合配置的核心是组件扫描和注解配置。通过使用组件扫描,Spring将扫描通过特定注解指定的包查找类,标注了@Component(@org.springframework.stereotype.Component)、@Controller、@Repository、@Service的类将成为Spring管理的bean,其中也可以创建自己的组件注释;注解配置的一个关键注解是:@org.springframework.beans.factoryannotation.Autowired,@Autowired声明了Spring应该在实例化之后注入的依赖。

    Warnning:组件扫描默认将扫描所有的@Component注解,要想做到分离bean,使得根应用上下文保存服务、仓库和其他业务逻辑片段,而DispatcherServlet的应用上下文只包含Web控制器,可以通过filter增加黑白名单来实现

    applicationContext.mxl中:
     <context:component-scan base-package="com.wrox">
          <context:exclude-filter expression="org.springframework.stereotype.Controller"    type="annotation" /> 
     </context:component-scan>
     
    spring-mvc.xml中:
      <context:component-scan base-package="com.wrox"   use-default-filters="false"> 
          <context:include-filter expression="org.springframework.stereotype.Controller"    type="annotation" /> 
     </context:component-scan>

    参考目录:

    1. 《Java Web高级编程》 王肖峰版 清华大学出版社——第十二章

    2.  Spring Framework的API文档:https://docs.spring.io/spring/docs/4.0.x/javadoc-api/

    说明:所有内容仅做学习记录
  • 相关阅读:
    RedHat Linux-配置YUM仓库
    04、管道符、重定向与环境变量
    03、新手必须掌握的Linux命令
    size_t
    decltype关键字
    python numpy使用笔记
    Huffman编码
    动态规划(dynamic programming)
    Prim算法
    Kruskal算法
  • 原文地址:https://www.cnblogs.com/jayinnn/p/9747039.html
Copyright © 2011-2022 走看看