Spring--Spring容器
在使用Spring所提供的各种丰富而神奇的功能之前,必须要在Spring IoC容器中装配好Bean,并建立Bean和Bean之间的关联关系。
Spring提供了多种配置方式来实现Bean的装配。但在此之前,还是先简单介绍一下IoC.
IoC概述
IoC即控制反转,就是通过容器 来控制业务对象之间的依赖关系。而非传统的代码操控实现。
控制反转的好处就是降低了业务对象之间的依赖程度,因此把实现控制反转的这种方式叫做依赖注入,将对象的依赖关系注入到外部容器。
IoC也是AOP、声明式事务等功能的基础。
BeanFactory和ApplicationContext
BeanFactory是Spring框架最核心的接口。诚如其名,BeanFactory就是一个类工厂,但和传统类工厂不同的是:它可以创建和管理各种类的对象,而传统的类工厂只负责构造一个或者几个类的实例。
这个BeanFactory也就是我们一直说的IoC容器,管理Bean的工具。ApplicationContext也叫应用上下文,是建立在我们的BeanFactory基础之上(由BeanFactory派生而来)。ApplicationContext也称Spring容器。
对于两者的用途:BeanFactory是Spring框架的基础设施,面向Spring本身;而ApplicationContext面向Spring的开发者,再几乎所有的应用场合都直接使用ApplicationContext而不是底层的BeanFactory。
一、初始化BeanFactory
bean.xml(Bean容器,Bean的配置文件)
- <?xml version="1.0" encoding="UTF-8" ?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/springbeans-3.1.xsd">
- <bean id="car" class="com.smart.Car"
- init-method="myInit"
- destroy-method="myDestory"
- p:brand="红旗CA72"
- p:maxSpeed="200" />
- </beans>
下面通过XMLBeanFactory实现类启动SpringIoC容器:
- import org.springframework.beans.factory.BeanFactory;
- import org.springframework.beans.factory.xml.XmlBeanFactory;
- import org.springframework.core.io.Resource;
- import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
- import org.springframework.core.io.support.ResourcePatternResolver;
- import com.smart.Car;
- public class BeanFactoryTest {
- public static void main(String[] args) throws Throwable{
- ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
- Resource res = resolver.getResource("classpath:com/smart/beanfactory/beans.xml");
- System.out.println(res.getURL());
- BeanFactory bf = new XmlBeanFactory(res);
- System.out.println("init BeanFactory.");
- Car car = bf.getBean("car",Car.class);
- System.out.println("car bean is ready for use!");
- car.introduce();
- }
- }
二、初始化ApplicationContext
与BeanFactory初始化类似。如果配置文件放在类的路径下,则可以直接使用ClassPathApplicationContext实现类启动容器。还有多种加载配置文件方式,就不一一列举了。(FileSystemXmlApplicationContext)
而BeanFactory于ApplicationContext的初始化,最大的不同之处在于:BeanFactory在初始化时,并未实例化Bean,直到第一次访问某个Bean时才实例化目标Bean;而ApplicationContext在初始化上下文是就实例化了所有单实例的Bean。因此ApplicationContext的初始化时间会长一点。
三、另一种配置方式
Spring3.0支持基于类注解的配置方式。主要功能来自Spring的一个名为JavaConfig的子项目,现在已是Spring的核心框架的一部分。
一个@Configuration注解的POJO即可提供Spring所需的Bean的所有配置信息。
和基于XML稳健配置方式相比,基于类注解的配置方式 可以很容易地让开发者控制Bean的初始化过程,比基于XML的配置更加灵活。
四、WebApplicationContext类体系结构(Web开发重点:Web应用上下文)
webApplicationContext是专门为Web应用准备,允许从相对Web根目录的路径中装载配置文件,完成初始化工作。
从Web中可以获得ServletContext的引用,整个Web引用上下文对象将作为属性放置到ServletContext中,以便Web应用环境可以访问Spring引用上下文。
Spring还专门为此提供一个工具类WebApplicationContextUtils,通过该类的get方法可以从Servlet中获取WebApplicationContext实例。
Spring2,0在WebApplicationContext中还为Bean添加了3个新的作用域:request作用域、session作用域、global session作用域。而非Web应用的环境下,Bean只有singleton和prototype两个作用域。
WebApplicationContext的初始化
和之前的BeanFactory、ApplicationContxt的初始化有所区别,因为WebApplicationContext需要ServletContext实例,也就是说必须在拥有Web容器的前提下才能完成启动的工作。
在web.xml文件中配置自启动的Servlet或定义Web容器你监听器(ServletContextListener),借助两者中的任何一个,就可以完成启动Spring Web的应用上下文。
通过Web容器监听器引导如下:
- <!-- 通过参数指定业务层Spring容器的配置文件,多个用,隔开 -->
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:applicationContext.xml</param-value>
- </context-param>
- <!-- 声明Web容器监听器 -->
- <listener>
- <listener-class>
- org.springframework.web.context.ContextLoaderListener
- </listener-class>
- </listener>
通过自启动的Servlet引导
- <servlet>
- <servlet-name>context</servlet-name>
- <servlet-class> org.springframework.web.context.ContextLoaderServlet
- </servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
五、资源加载
Spring--Spring容器的更多相关文章
- 深入分析Spring 与 Spring MVC容器
1 Spring MVC WEB配置 Spring Framework本身没有Web功能,Spring MVC使用WebApplicationContext类扩展ApplicationContext, ...
- Spring IoC容器的初始化过程
Spring IoC容器的初始化包括 BeanDefinition的Resource定位.载入和注册 这三个基本的过程.IoC容器的初始化过程不包含Bean依赖注入的实现.Bean依赖的注入一般会发生 ...
- 【Spring】非Spring IOC容器下获取Spring IOC上下文的环境
前言 在Spring Web项目中,有些特殊的时候需要在非Spring IOC容器下获取Spring IOC容器的上下文环境,比如获取某个bean. 版本说明 声明POM文件,指定需引入的JAR. & ...
- 学习Spring(一) 实例化Spring IoC容器
实例化Spring IoC容器 1,读取其配置来创建bean实例 2,然后从Spring IoC容器中得到可用的bean实例 Spring提供两种IoC容器实现类型 a,一种为bean工厂 b,应用程 ...
- MyEclipse Spring 学习总结一 Spring IOC容器
一.Spring IOC容器---- Spring AllicationContext容器 程序的结构如下: 1.首先在MyEclipse 创建创建Java Project 2.创建好后,添加spin ...
- 对Spring IoC容器实现的结构分析
本文的目标:从实现的角度来认识SpringIoC容器. 观察的角度:从外部接口,内部实现,组成部分,执行过程四个方面来认识SpringIoC容器. 本文的风格:首先列出SpringIoC的外部接口及内 ...
- spring IOC容器实例化Bean的方式与RequestContextListener应用
spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ...
- 解读Spring Ioc容器设计图
在Spring Ioc容器的设计中,有俩个主要的容器系列:一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器最基本的功能:另外一个是ApplicationContext应用上下 ...
- 纯注解快速使用spring IOC容器
使用spring的ioc容器实现对bean的管理与基本的依赖注入是再经典的应用了.基础使用不在详述. 这里主要介绍下使用注解实现零配置的spring容器.我相信你也会更喜欢使用这种方式.Spring ...
- Spring IOC容器分析(2) -- BeanDefinition
上文对Spring IOC容器的核心BeanFactory接口分析发现:在默认Bean工厂DefaultListableBeanFactory中对象不是以Object形成存储,而是以BeanDefin ...
随机推荐
- Android 高清加载巨图方案, 拒绝压缩图片
源地址:http://blog.csdn.net/lmj623565791/article/details/49300989 一.概述 距离上一篇博客有段时间没更新了,主要是最近有些私事导致的,那么就 ...
- SSM三大框架(转发)
转自:SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis) 使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基 ...
- Unable to find element on closed window (WARNING: The server did not provide any stacktrace information)
当你的selenium WebDriver 启动IE11报这个错时:Unable to find element on closed window (WARNING: The server did n ...
- windows下关闭进程
1.首先查找到占用8080端口的进程号PID是多少 CMD>netstat -ano | findstr 8888 这个命令输出的最后一列表示占用8080端口的进程号是多少,这里是5880 2. ...
- shell 常用小命令总结
1. 重命名 1) 较简单的处理命令:mv 原文件名 新文件名 如:mv myFile newName ### 将MyFile重命名为newN ...
- macOS 安装 pip
安装好wget之后: wget https://bootstrap.pypa.io/get-pip.py sudo python get-pip.py 终于可以愉快的pip了~
- Hadoop jobhistory历史服务器
Hadoop自带了一个历史服务器,可以通过历史服务器查看已经运行完的Mapreduce作业记录,比如用了多少个Map.用了多少个Reduce.作业提交时间.作业启动时间.作业完成时间等信息.默认情况下 ...
- 【poj3237】 Tree
http://poj.org/problem?id=3237 (题目链接) 树链剖分模板题,然而这150+行的程序我调了一天,历经艰辛,终于ac.. 题意 给出一个n个节点的带权树,要求维护操作:1. ...
- Bzoj2007 [Noi2010]海拔
Time Limit: 20 Sec Memory Limit: 552 MB Submit: 2380 Solved: 1130 Description YT市是一个规划良好的城市,城市被东西向 ...
- AngularJs $anchorScroll、$controller、$document
$anchorScroll 根据HTML5的规则,当调用这个函数时,它检查当前的url的hash值并且滚动到相应的元素. 监听$location.hash()并且滚动到url指定的锚点的地方.可以通过 ...