之前一直对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/

Spring Framework启动详解的更多相关文章

  1. spring事务管理(详解和实例)

    原文地址: 参考地址:https://blog.csdn.net/yuanlaishini2010/article/details/45792069 写这篇博客之前我首先读了<Spring in ...

  2. (转)Spring JdbcTemplate 方法详解

    Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...

  3. Spring Boot异常处理详解

    在Spring MVC异常处理详解中,介绍了Spring MVC的异常处理体系,本文将讲解在此基础上Spring Boot为我们做了哪些工作.下图列出了Spring Boot中跟MVC异常处理相关的类 ...

  4. spring事务配置详解

    一.前言 好几天没有在对spring进行学习了,由于这几天在赶项目,没有什么时间闲下来继续学习,导致spring核心架构详解没有继续下去,在接下来的时间里面,会继续对spring的核心架构在继续进行学 ...

  5. Spring的lazy-init详解

    1.Spring中lazy-init详解ApplicationContext实现的默认行为就是在启动服务器时将所有singleton bean提前进行实例化(也就是依赖注入).提前实例化意味着作为初始 ...

  6. spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途

    Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...

  7. (转)Spring事务管理详解

    背景:之前一直在学习数据库中的相关事务,而忽略了spring中的事务配置,在阿里面试时候基本是惨败,这里做一个总结. 可能是最漂亮的Spring事务管理详解 https://github.com/Sn ...

  8. 深入浅出mybatis之启动详解

    深入浅出mybatis之启动详解 MyBatis功能丰富,但使用起来非常简单明了,今天我们来追踪一下它的启动过程. 目录 如何启动MyBatis 如何使用MyBatis MyBatis启动过程 如何启 ...

  9. 可能是最漂亮的Spring事务管理详解

    Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么 ...

随机推荐

  1. P1494 [国家集训队]小Z的袜子(莫队算法)

    莫队板子 代码 #include <cstdio> #include <algorithm> #include <cstring> #include <cma ...

  2. 题解——P1108低价购买(DP)

    第一问是最长下降子序列,n很小,n^2可过,注意最长下降子序列的枚举顺序即可 ;i<=n;i++)//不要写错 ;j<i;j++)//不要打成<= ) b[i]=b[j]+; 第二问 ...

  3. Vue.extend提供自定义组件的构造器

    Vue.extend 返回的是一个“扩展实例构造器”,也就是预设了部分选项的Vue实例构造器.经常服务于Vue.component用来生成组件,可以简单理解为当在模板中遇到该组件名称作为标签的自定义元 ...

  4. C#Winform工具箱简介

    BindingSource:指定支持事务处理初始化Button:[按钮]用户单击它时引发事件 CheckBox:[复选框]允许用户选择或清除关联选项 CheckedListBox:[复选列表框]显示一 ...

  5. Docker3之Swarm

    Make sure you have published the friendlyhello image you created by pushing it to a registry. We’ll ...

  6. 教你用ActiveReports分析京东双十一数据的价值

    随着双十一购物盛会落下帷幕,各大电商平台纷纷公布出自己今年的成绩.与其它同行不同的是,京东除了公布1598亿的线上下单金额,还公布了线上线下融合的战果. 面对京东线上.线下海量数据源,我们该如何进行整 ...

  7. ASP.NET —— Web Pages

    为简单起见,新建一个空的web工程,再新建一个MVC的视图(.cshtml),因为WP是单页面模型,所以以后就在这个页面中进行试验. Razor语法简介: 变量可用var或者其确切类型声明. 遍历fo ...

  8. JVM介绍

    1. 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来 ...

  9. C#Listview添加数据,选中最后一行,滚屏

    this.listView.Items.Add(lvi); this.listView.EnsureVisible(this.listView.Items.Count - 1); this.listV ...

  10. Pandas 基础(3) - 生成 Dataframe 的几种方式

    这一节想总结一下 生成 Dataframe 的几种方式: CSV Excel python dictionary List of tuples List of dictionary 下面分别一一介绍具 ...