引言

工作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/beanshttp://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就悄悄开始工作了,至于怎么工作的还需要点篇幅去描述,这篇文件就先不细说。

转载于:https://www.cnblogs.com/ViviChan/p/4981712.html

Spring - Spring容器概念及其初始化过程相关推荐

  1. spring bean加载过程_Spring源码剖析3:Spring IOC容器的加载过程

    本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

  2. Spring 父子容器概念

  3. Spring IoC容器初始化源码(1)—容器初始化入口以及setConfigLocations设置容器配置信息【一万字】

      基于最新Spring 5.x,对于基于XML的Spring IoC容器初始化过程中的setConfigLocations设置容器配置信息方法的源码进行了详细分析,最后给出了比较详细的方法调用时序图 ...

  4. [Spring 深度解析]第7章 IoC容器的初始化过程

    7. IoC容器的初始化过程 ​ 简单来说,IoC容器的初始化是由前面介绍的refresh()方法来启动的,这个方法标志着IoC容器的正式启动.具体来说,这个启动包括BeanDefinition的Re ...

  5. Spring IoC(二)IoC容器的初始化过程

    (一)IoC 容器初始化过程概述 1.1简要概述初始化过程 IoC 容器的初始化过程是通过refresh() 方法来启动的,这个方法标识着IoC 容器正式启动.具体来说,这个启动过程包括:BeanDe ...

  6. idea中生成spring的 xml配置文件_【132期】面试再被问到Spring容器IOC初始化过程,就拿这篇文章砸他~...

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

  7. 《Spring技术内幕》——2.3节IoC容器的初始化过程

    2.3 IoC容器的初始化过程 简单来说,IoC容器的初始化是由前面介绍的refresh()方法来启动的,这个方法标志着IoC容器的正式启动.具体来说,这个启动包括BeanDefinition的Res ...

  8. Spring IOC学习心得之IOC容器的初始化过程

    注:本文大多数内容都是摘自<Spring技术内幕>这本书 简单来说,Ioc容器的初始化过程是在refresh()方法中启动的,包括BeanDefinition的Resource定位,载入和 ...

  9. 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

最新文章

  1. Web Serveice服务代理类生成及编译
  2. Analytic Marching:一种基于解析的三维物体网格生成方法
  3. Machine Learning | (8) Scikit-learn的分类器算法-随机森林(Random Forest)
  4. RabbitMQ启动参数具体含义
  5. python zipfile 乱码_python zipfile文件名乱码问题
  6. org.apache.hadoop.security.AccessControlException: Permission denied: user=anonymous, access=EXECUTE
  7. android9 关闭点击动画,在Android app中实现九(n)宫格图片连续滑动效果
  8. 转载 : JSP取得绝对路径
  9. 运营商数据治理实践-郭岳
  10. Tensorflow 卷积神经网络(三)池化与采样
  11. VueJS样式绑定v-bind:class
  12. 面向对象java试题_经典面向对象试题,用Java做,要详细点的!先谢过了
  13. 要管理组策略 您必须以域用户账户登录此计算机,让AD域用户账户只能登陆管理员指定的客户端计算机...
  14. 上海域格ASR平台4g模块低功耗应用指导
  15. 如何制作疫情民生地图
  16. java鲁滨逊漂流记安卓_亲宝听鲁滨逊漂流记全集app下载|鲁滨逊漂流记全集安卓版下载 v1.0.0 - 跑跑车安卓网...
  17. 事件修饰符(2) .prevent 阻止默认事件
  18. SkeyeLive同屏直播库库功能介绍和接口说明与调用
  19. 山东大学项目实训(三十二)—— 科室管理
  20. Can‘t reconnect until invalid transaction is rolled back

热门文章

  1. python小白新手所学内容(一)
  2. 求1~n中0~9出现的次数
  3. 【Android】技术调研:用代码模拟屏幕点击、触摸事件
  4. 「Spring Boot」接口幂等性的4种实现方案
  5. 大数据 搜索 ES 一
  6. XDP技术——linux网络处理的高速公路
  7. 关于如何打破传统阅读体验的一些想法
  8. 苹果手机忘记Appid怎么办
  9. 《那些年啊,那些事——一个程序员的奋斗史》——43
  10. 个性篮球队名_你的篮球个性是什么