Spring - Spring容器概念及其初始化过程

原创 2015年11月18日 15:46:17
引言

工作4年多,做了3年的java,每个项目都用Spring,但对Spring一直都是知其然而不知其所以然。鄙人深知Spring是一个高深的框架,正好近期脱离加班的苦逼状态,遂决定从Spring的官方文档入手,结合Spring代码和实际项目,全面的学习Spring,并将学习内容记录在博客上,以便以后查阅并可以和众猿讨论分享。PS:文章中会有部分是官方原句翻译,例子也会有官方例子。

概述

Spring容器是什么?
Spring容器是Spring的核心,一切Spring bean都存储在Spring容器内,并由其通过IoC技术管理。Spring容器也就是一个bean工厂(BeanFactory)。应用中bean的实例化,获取,销毁等都是由这个bean工厂管理的。

Spring容器究竟是什么。。。
org.springframework.context.ApplicationContext接口用于完成容器的配置,初始化,管理bean。一个Spring容器就是某个实现了ApplicationContext接口的类的实例。也就是说,从代码层面,Spring容器其实就是一个ApplicationContext。

在普通的JAVA工程中,我们可以通过代码显式new一个ClassPathXmlApplicationContext或者FileSystemXmlApplicationContext来初始化一个Spring容器。

在Web工程中,我们一般是通过配置web.xml的方式来初始化Spring容器。

Spring配置文件

Spring配置文件以XML格式呈现,如下:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="..." class="...">
    <!-- collaborators and configuration for this bean go here -->
  </bean>

  <bean id="..." class="...">
    <!-- collaborators and configuration for this bean go here -->
  </bean>

  <!-- more bean definitions go here -->

</beans>

 
在eclipse中,我们可以使用SpringSource Tool Suite工具来协助我们编写Spring的配置文件。
工程中允许有多个Spring配置文件,我们可以按照自己的需求定义文件的分类,例如可以从处理逻辑层级来区分:services.xml,daos.xml等。

另外,一个配置文件可以引入多个其他的配置文件,写法如下:
<beans>

    <import resource="services.xml"/>
    <import resource="resources/messageSource.xml"/>
    <import resource="/resources/themeSource.xml"/>

    <bean id="bean1" class="..."/>
    <bean id="bean2" class="..."/>

</beans>
<strong>
<span style="font-family:Microsoft YaHei;"></span></strong>
 
通过ClassPathApplicationContext初始化Spring容器

ApplicationContext context =
    new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});

 
我们写这一句简单的代码,其实Spring在里面做了很多功夫。
首先Spring会从classpath路径下找到services.xml和daos.xml文件,
然后将文件内的配置信息读取出来,
然后做了N多内部的初始化工作(关于容器初始化的详细细节,后面我会补充一篇文章从源码角度详细说明)。

我们还可以用FileSystemApplicationContext来初始化Spring容器,
ApplicationContext context =
    new FileSystemXmlApplicationContext("D:/Test/services.xml");
 
这2中方式效果是一样的,只是通过不同的方式读取配置文件。
容器初始完后,我们就可以用这个容器来获取我们之前配置了个bean,简单示例如下:
// create and configure beans
ApplicationContext context =
    new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});

// retrieve configured instance
PetStoreServiceImpl service = context.getBean("petStore", PetStoreServiceImpl.class);

// use configured instance
List userList = service.getUsernameList();
<strong>
<span style="font-family:Microsoft YaHei;"></span></strong>
 
Web工程的Spring配置
假设我们的web工程my-app的基础目录结构如下:
my-app
--src
----resources
------services.xml
--WebContent
----META-INF
----WEB-INFI
------lib
------applicationContext.xml
------web.xml
那么我们的web.xml需要这么,配置方式如下
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml classpath:resources/services.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

contextConfigLocation:
contextConfigLocation指的是Spring该去哪里读取配置文件,ContextLoaderListener用于启动的web容器(如tomcat)时,去读取配置文件并完成Spring容器的初始化(包括加载bean等)。
关于contextConfigLocation的配置方式也是可以非常丰富的,还可以使用通配符 * ,这里简单举几个例子说明:
1. classpath:resources/services.xml
表示到web工程的classes/resources文件夹中查找配置文件。
2. classpath*:resources/services.xml
这种方式除了会到classes/resources文件夹查找,还会到lib下面的jar包中查找,查找路径是jar包内/resources/services.xml。
3. classpath:resouces/**/*services.xml
这种方式表示到classpath的resources文件夹下所有文件夹(不限层级,可以在第N层子文件夹中)中查找文件名以services.xml结尾的文件。
4. 多个路径配置可以用空格分开

classpath知识补充:
web工程部署后,对应war包下的WEB-INF下会有一个classes文件夹和一个lib文件,当然还有其他的。
其中classes文件夹中的内容是从工程中的源码文件夹(对应右键工程,Properties - Java Build Path - Source页签中看到的文件夹)中编译过来,lib文件夹即工程中引用的jar包。
这个classes文件夹和lib中的jar都属于classpath。

ContextLoaderListener:
这个Listener就是在标准Spring Web工程中Spring开始干活的切入点,为什么要说标准?因为我们可以写一个自己的Listener去启动Spring容器。扯远了~
因为ContextLoaderListener实现了ServletContextListener,所以在web容器启动时,ContextLoaderListener就悄悄开始工作了,至于怎么工作的还需要点篇幅去描述,这篇文件就先不细说。
版权声明:本文为博主原创文章,转载请注明出处

Spring容器初始化过程都做了哪些事儿

1.ClassPathXmlApplicationContext为入口构造方法中有个refresh()方法用来初始化Spring refresh运行的大致流程: Configura...
  • yangliu19920502
  • yangliu19920502
  • 2017年04月01日 16:22
  • 1310

Spring IOC源码详解之容器初始化

Spring IOC源码详解之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比较典型的代码 ClassPathResource...
  • yujin753
  • yujin753
  • 2015年07月26日 08:51
  • 3406

Spring4.3.x 容器在web应用中的初始化过程

概述Spring在web应用中的默认容器类为XmlWebApplicationContext,这个容器类通过xml文件获取所有的配置信息。它的继承结构如下图,(点此查看大图) 在web应用中,不管是...
  • chyohn
  • chyohn
  • 2017年02月08日 11:56
  • 848

源码解读(一): spring在web容器中的初始化过程

Spring容器本质上就是创建类的工厂,并且对类进行管理。Spring 在web容器中通常是通过在web.xml文件中配置切入点来进行相关初始化的。 当web容器解析web.xml文件时,会初始化Co...
  • gloomy_114
  • gloomy_114
  • 2017年04月14日 14:04
  • 350

Spring 初始化过程详细分析[源码](一)

最近项目空闲期,来看下spring源码,把过程全部记录下来, 方便想知道spring初始化过程初学者,先从spring监听器作为入口。 org.springframework.web....
  • strivezxq
  • strivezxq
  • 2015年02月13日 15:53
  • 3851

【Spring实战】Spring容器初始化完成后执行初始化数据方法

一、背景知识在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听、Servlet加载初始化等切入点为数据库准备数据,这些初始化数据是系统开始运行前必须的数据,例如权限组、系统选项、默认管理员等...
  • honghailiang888
  • honghailiang888
  • 2017年06月16日 16:43
  • 3911

Spring容器初始化

一,容器初始化 1,在web.xml中配置ContextLoaderListener     这个监听器实现了ServletContextListener,这个接口有2个方法。     publ...
  • u011710466
  • u011710466
  • 2016年10月21日 23:36
  • 1444

理解Spring 容器设计理念

概述 Spring是为了解决企业应用程序开发复杂性而创建的开源框架,书店上关于Spring的书籍汗牛充栋,网上相关的文章连篇累牍,其中有很多写的很不错的,有入门例子的,有问题解决方案的,有环境设...
  • qq_35624642
  • qq_35624642
  • 2016年09月07日 16:01
  • 935

spring容器被多次初始化问题排查及解决

由于spring多次初始化,导致资源被重复加载,多次初始化,会带来一系列问题...
  • cainiaodejiaobu
  • cainiaodejiaobu
  • 2017年08月04日 18:40
  • 539

spring注解和springmvc容器初始化过程

本节主要通过一个自定义注解了解注解是什么,然后简要介绍下spring注解分类和作用,最后简要概括一下web spring容器初始化过程; 1、自定义Annotation_my注解 @Target({E...
  • q_zx1bydcom
  • q_zx1bydcom
  • 2016年09月27日 14:55
  • 555
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring - Spring容器概念及其初始化过程
举报原因:
原因补充:

(最多只允许输入30个字)