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.java
package 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/beans
https://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/beans
https://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.java
import 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文件中已被定义的Bean
WebApplicationContext实现, 它从XML文档获取配置
默认情况下, 配置将取自"/WEB-INF/applicationContext.xml"
0x03.2 小例子
0x03.2.1 FileSystemXmlApplicationContext
// 创建一个测试类Test3进行测试
// 目录: ./SpringDemo/src/test/java/
// 文件名: Test3.java
import 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.java
import 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会讲
本章不做讨论