0x01 IOC容器描述
Spring容器是Spring框架的核心
容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁
Spring容器使用依赖注入(DI)来管理组成一个应用程序的组件
这些对象被称为Spring Beans,我们将在本章中进行学习
通过阅读配置元数据提供的指令,容器知道对哪些对象进行实例化,配置和组装
配置元数据可以通过XML,Java注释或Java代码来表示
Spring IoC容器利用Java的POJO类和配置元数据来生成完全配置和可执行的系统或应用程序
IOC容器具有依赖注入功能的容器,它可以创建对象,IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖
通常new一个实例,控制权由程序员控制,而”控制反转”是指new实例工作不由程序员来做而是交给Spring容器来做
在Spring中BeanFactory是IOC容器的实际代表者
下图是Spring如何工作的高级视图
Spring 提供了Spring BeanFactory 容器与Spring ApplicationContext 容器这两种
Spring BeanFactory 容器它是最简单的容器,给DI提供了基本的支持它用org.springframework.beans.factory.BeanFactory接口来定义现在为止BeanFactory或者相关的接口,如:BeanFactoryAware,DisposableBean,InitializingBean仍旧保留在Spring中,主要目的是向后兼容已经存在的和那些Spring整合在一起的第三方框架在Spring中,有大量对 BeanFactory 接口的实现其中,最常被使用的是 XmlBeanFactory 类这个容器从一个 XML 文件中读取配置元数据,由这些元数据来生成一个被配置化的系统或者应用
Spring ApplicationContext 容器该容器添加了更多的企业特定的功能例如: 从一个属性文件中解析文本信息的能力,发布应用程序事件给感兴趣的事件监听器的能力该容器是由org.springframework.context.ApplicationContext接口定义注: ApplicationContext 容器包括 BeanFactory 容器的所有功能,所以通常不建议使用BeanFactory
注:在资源宝贵的移动设备或者基于 applet 的应用当中, BeanFactory 会被优先选择否则, 一般使用的是 ApplicationContext, 除非你有更好的理由选择 BeanFactory
0x02 前置操作
// 在./SpringDemo/src/main/java/com/test/创建个HelloWorld.java// 目录: ./SpringDemo/src/main/java/com/test/// 文件名: HelloWorld.javapackage com.test;public class HelloWorld {private String message;public void setMessage(String message) {this.message = message;}public void getMessage() {System.out.println("Your Message: " + message);}}
// 在./SpringDemo/src/main/resources/创建个applicationContext.xml// 文件名可以任取,不过一般这个文件名都叫applicationContext.xml// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
// 在<beans>标签中,中配置HelloWorld的信息, 设定message的值为“Hello World!”// 这里提供一个配置好的applicationContext.xml文件// 目录: ./SpringDemo/src/main/resources/// 文件名: applicationContext.xml<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="helloWorldTest" class="com.test.HelloWorld"><property name="message" value="Hello World!"/></bean></beans>
0x02 Spring BeanFactory 容器
0x02.1 描述
它是最简单的容器,给DI提供了基本的支持它用org.springframework.beans.factory.BeanFactory接口来定义现在为止BeanFactory或者相关的接口,如:BeanFactoryAware,DisposableBean,InitializingBean仍旧保留在Spring中,主要目的是向后兼容已经存在的和那些Spring整合在一起的第三方框架在Spring中,有大量对 BeanFactory 接口的实现其中,最常被使用的是 XmlBeanFactory 类这个容器从一个 XML 文件中读取配置元数据,由这些元数据来生成一个被配置化的系统或者应用
0x02.2 小例子
0x.2.2.1 XmlBeanFactory
// 创建一个测试类Test2进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test2.javaimport com.test.HelloWorld;import org.springframework.core.io.ClassPathResource;import org.springframework.beans.factory.xml.XmlBeanFactory;public class Test2 {public static void main(String[] args) {XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));HelloWorld obj = (HelloWorld) factory.getBean("helloWorldTest");obj.getMessage();}}// 运行结果Your Message : Hello World!
0x03 Spring ApplicationContext 容器
0x03.1 描述
Application Context是BeanFactory的子接口,也被称为Spring上下文Application Context是Spring中较高级的容器和BeanFactory类似它可以加载配置文件中定义的Bean,将所有的Bean集中在一起,当有请求的时候分配Bean另外,它增加了企业所需要的功能比如: 从属性文件中解析文本信息和将事件传递给所指定的监听器这个容器在org.springframework.context.ApplicationContext的interface接口中定义ApplicationContext包含BeanFactory所有的功能一般情况下,相对于BeanFactory来说,ApplicationContext会更加优秀,所以优先使用它当然BeanFactory仍可以在轻量级应用中使用,比如移动设备或者基于applet的应用程序最常被使用的ApplicationContext接口实现:FileSystemXmlApplicationContext:该容器从XML文件中加载已被定义的Bean在这里,你需要提供给构造器XML文件的完整路径ClassPathXmlApplicationContext:该容器从XML文件中加载已被定义的Bean在这里,你不需要提供XML文件的完整路径,只需正确配置CLASSPATH环境变量即可因为容器会从CLASSPATH中搜索Bean配置文件XmlWebApplicationContext:该容器会在一个web应用程序的范围内加载在XML文件中已被定义的BeanWebApplicationContext实现, 它从XML文档获取配置默认情况下, 配置将取自"/WEB-INF/applicationContext.xml"
0x03.2 小例子
0x03.2.1 FileSystemXmlApplicationContext
// 创建一个测试类Test3进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test3.javaimport com.test.HelloWorld;import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public class Test3 {public static void main(String[] args) {ApplicationContext context = new FileSystemXmlApplicationContext("src/main/resources/applicationContext.xml");HelloWorld obj = (HelloWorld) context.getBean("helloWorldTest");obj.getMessage();}}// 运行结果Your Message : Hello World!
0x03.2.2 ClassPathXmlApplicationContext
// 创建一个测试类Test4进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: Test4.javaimport com.test.HelloWorld;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test4 {public static void main(String[] args) {// 获取Spring的上下文对象ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");HelloWorld obj = (HelloWorld) context.getBean("helloWorldTest");obj.getMessage();}}// 运行结果Your Message : Hello World!
0x03.2.3 XmlWebApplicationContext
这个属于Spring MVC的内容,后面到Spring MVC会讲本章不做讨论
