0x01 IOC容器描述

Spring容器是Spring框架的核心
容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁
Spring容器使用依赖注入(DI)来管理组成一个应用程序的组件
这些对象被称为Spring Beans,我们将在本章中进行学习

通过阅读配置元数据提供的指令,容器知道对哪些对象进行实例化,配置和组装
配置元数据可以通过XML,Java注释或Java代码来表示
Spring IoC容器利用Java的POJO类和配置元数据来生成完全配置和可执行的系统或应用程序

IOC容器具有依赖注入功能的容器,它可以创建对象,IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖

通常new一个实例,控制权由程序员控制,而”控制反转”是指new实例工作不由程序员来做而是交给Spring容器来做
在Spring中BeanFactory是IOC容器的实际代表者

下图是Spring如何工作的高级视图
image.png

Spring 提供了Spring BeanFactory 容器与Spring ApplicationContext 容器这两种

  1. Spring BeanFactory 容器
  2. 它是最简单的容器,给DI提供了基本的支持
  3. 它用org.springframework.beans.factory.BeanFactory接口来定义
  4. 现在为止BeanFactory或者相关的接口,如:BeanFactoryAware,DisposableBean,InitializingBean
  5. 仍旧保留在Spring中,主要目的是向后兼容已经存在的和那些Spring整合在一起的第三方框架
  6. Spring中,有大量对 BeanFactory 接口的实现
  7. 其中,最常被使用的是 XmlBeanFactory
  8. 这个容器从一个 XML 文件中读取配置元数据,由这些元数据来生成一个被配置化的系统或者应用
  1. Spring ApplicationContext 容器
  2. 该容器添加了更多的企业特定的功能
  3. 例如: 从一个属性文件中解析文本信息的能力,发布应用程序事件给感兴趣的事件监听器的能力
  4. 该容器是由org.springframework.context.ApplicationContext接口定义
  5. 注: ApplicationContext 容器包括 BeanFactory 容器的所有功能,所以通常不建议使用BeanFactory
  1. 注:
  2. 在资源宝贵的移动设备或者基于 applet 的应用当中, BeanFactory 会被优先选择
  3. 否则, 一般使用的是 ApplicationContext, 除非你有更好的理由选择 BeanFactory

0x02 前置操作

  1. // 在./SpringDemo/src/main/java/com/test/创建个HelloWorld.java
  2. // 目录: ./SpringDemo/src/main/java/com/test/
  3. // 文件名: HelloWorld.java
  4. package com.test;
  5. public class HelloWorld {
  6. private String message;
  7. public void setMessage(String message) {
  8. this.message = message;
  9. }
  10. public void getMessage() {
  11. System.out.println("Your Message: " + message);
  12. }
  13. }
  1. // 在./SpringDemo/src/main/resources/创建个applicationContext.xml
  2. // 文件名可以任取,不过一般这个文件名都叫applicationContext.xml
  3. // 目录: ./SpringDemo/src/main/resources/
  4. // 文件名: applicationContext.xml
  5. <?xml version="1.0" encoding="UTF-8"?>
  6. <beans xmlns="http://www.springframework.org/schema/beans"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xsi:schemaLocation="http://www.springframework.org/schema/beans
  9. https://www.springframework.org/schema/beans/spring-beans.xsd">
  10. </beans>
  1. // 在<beans>标签中,中配置HelloWorld的信息, 设定message的值为“Hello World!”
  2. // 这里提供一个配置好的applicationContext.xml文件
  3. // 目录: ./SpringDemo/src/main/resources/
  4. // 文件名: applicationContext.xml
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. https://www.springframework.org/schema/beans/spring-beans.xsd">
  9. <bean id="helloWorldTest" class="com.test.HelloWorld">
  10. <property name="message" value="Hello World!"/>
  11. </bean>
  12. </beans>

0x02 Spring BeanFactory 容器

0x02.1 描述

  1. 它是最简单的容器,给DI提供了基本的支持
  2. 它用org.springframework.beans.factory.BeanFactory接口来定义
  3. 现在为止BeanFactory或者相关的接口,如:BeanFactoryAware,DisposableBean,InitializingBean
  4. 仍旧保留在Spring中,主要目的是向后兼容已经存在的和那些Spring整合在一起的第三方框架
  5. Spring中,有大量对 BeanFactory 接口的实现
  6. 其中,最常被使用的是 XmlBeanFactory
  7. 这个容器从一个 XML 文件中读取配置元数据,由这些元数据来生成一个被配置化的系统或者应用

0x02.2 小例子

0x.2.2.1 XmlBeanFactory

  1. // 创建一个测试类Test2进行测试
  2. // 目录: ./SpringDemo/src/test/java/
  3. // 文件名: Test2.java
  4. import com.test.HelloWorld;
  5. import org.springframework.core.io.ClassPathResource;
  6. import org.springframework.beans.factory.xml.XmlBeanFactory;
  7. public class Test2 {
  8. public static void main(String[] args) {
  9. XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
  10. HelloWorld obj = (HelloWorld) factory.getBean("helloWorldTest");
  11. obj.getMessage();
  12. }
  13. }
  14. // 运行结果
  15. Your Message : Hello World!

0x03 Spring ApplicationContext 容器

0x03.1 描述

  1. Application ContextBeanFactory的子接口,也被称为Spring上下文
  2. Application ContextSpring中较高级的容器和BeanFactory类似
  3. 它可以加载配置文件中定义的Bean,将所有的Bean集中在一起,当有请求的时候分配Bean
  4. 另外,它增加了企业所需要的功能
  5. 比如: 从属性文件中解析文本信息和将事件传递给所指定的监听器
  6. 这个容器在org.springframework.context.ApplicationContextinterface接口中定义
  7. ApplicationContext包含BeanFactory所有的功能
  8. 一般情况下,相对于BeanFactory来说,ApplicationContext会更加优秀,所以优先使用它
  9. 当然BeanFactory仍可以在轻量级应用中使用,比如移动设备或者基于applet的应用程序
  10. 最常被使用的ApplicationContext接口实现:
  11. FileSystemXmlApplicationContext:
  12. 该容器从XML文件中加载已被定义的Bean
  13. 在这里,你需要提供给构造器XML文件的完整路径
  14. ClassPathXmlApplicationContext:
  15. 该容器从XML文件中加载已被定义的Bean
  16. 在这里,你不需要提供XML文件的完整路径,只需正确配置CLASSPATH环境变量即可
  17. 因为容器会从CLASSPATH中搜索Bean配置文件
  18. XmlWebApplicationContext:
  19. 该容器会在一个web应用程序的范围内加载在XML文件中已被定义的Bean
  20. WebApplicationContext实现, 它从XML文档获取配置
  21. 默认情况下, 配置将取自"/WEB-INF/applicationContext.xml"

0x03.2 小例子

0x03.2.1 FileSystemXmlApplicationContext

  1. // 创建一个测试类Test3进行测试
  2. // 目录: ./SpringDemo/src/test/java/
  3. // 文件名: Test3.java
  4. import com.test.HelloWorld;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.FileSystemXmlApplicationContext;
  7. public class Test3 {
  8. public static void main(String[] args) {
  9. ApplicationContext context = new FileSystemXmlApplicationContext("src/main/resources/applicationContext.xml");
  10. HelloWorld obj = (HelloWorld) context.getBean("helloWorldTest");
  11. obj.getMessage();
  12. }
  13. }
  14. // 运行结果
  15. Your Message : Hello World!

0x03.2.2 ClassPathXmlApplicationContext

  1. // 创建一个测试类Test4进行测试
  2. // 目录: ./SpringDemo/src/test/java/
  3. // 文件名: Test4.java
  4. import com.test.HelloWorld;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. public class Test4 {
  8. public static void main(String[] args) {
  9. // 获取Spring的上下文对象
  10. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  11. HelloWorld obj = (HelloWorld) context.getBean("helloWorldTest");
  12. obj.getMessage();
  13. }
  14. }
  15. // 运行结果
  16. Your Message : Hello World!

0x03.2.3 XmlWebApplicationContext

  1. 这个属于Spring MVC的内容,后面到Spring MVC会讲
  2. 本章不做讨论