Spring IOC官方文档学习笔记(一)之IOC容器概述

2023-02-14,,,,

1.IOC容器简介

(1) org.springframework.beans 与 org.springframework.context 这两个包是Spring IOC容器的基础,在org.springframework.beans中的BeanFactory接口提供了一种能够管理任何类型对象的机制(类似于一个工厂,里面放满了需要被管理的对象),而在org.springframework.context中的BeanFactory的子接口ApplicationContext则在其基础之上提供了更多特性(如AOP,Message resource,Event publication等)。总而言之,BeanFactory提供了一个容器的基本功能,而ApplicationContext可以看做是BeanFactory的扩展,它提供了更多企业级特性

(2) 一个普通的java对象,在交由Spring IOC容器实例化,配置,组装并管理之后,我们称其为bean。IOC容器需要通过XML,Java code等方式来获取有关对象的配置信息(也称为配置元数据),来完成bean的实例化动作。如下所示,我们通过XML的方式定义了一个bean的配置元数据,规定了其id,name和class的值,之后IOC会根据这些信息来构造一个bean并保存

<?xml version="1.0" encoding="UTF-8"?>
<beans ....> <bean id="..." name="..." class="..."></bean> </beans>

2.配置元数据

(1) 由上文可知,元数据的概念就是告诉Spring如何实例化、配置和组装的我们应用程序中的对象,如下图

(2) 配置方式:基于xml的配置可用bean标签,基于java的配置用@Configuration和@Bean注解等

下面是一个基于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"> <!-- 在xml中,所有的bean都必须放在beans这一顶级标签中,里面的这些bean标签对应于我们的系统中的实际对象 -->
<!-- bean标签中的id属性用来标识一个bean,其值不可重复,class用来指定这个bean的类类型(使用全限定类名) -->
<bean id="..." class="...">
<!-- 在bean标签内部来指定该bean的成员变量等 -->
</bean> </beans>

3.实例化容器

(1) ApplicationContext接口就代表了IOC容器,如果想要构建它,则可根据实际需要来使用其某个具体的实现类,如ClassPathXmlApplicationContext或FileSystemXmlApplicationContext,它们的构造函数接收一个或多个资源路径,表示从各种外部资源(如XML)中加载配置元数据,如下

ApplicationContext ctx = new ClassPathXmlApplicationContext("boke/definition.xml");

其中boke/definition.xml配置文件中的内容如下所示

<beans ...>

    <bean id="bId" class="cn.example.spring.boke.ExampleB"></bean>

    <bean id="aId" name="aName" class="cn.example.spring.boke.ExampleA">
<!-- property标签用于bean中成员变量值的注入,name属性:指定JavaBean中的属性名,该属性要有其对应的setter方法,否则无法注入,ref属性:引用另一个bean的id,注入依赖 -->
<property name="exampleB" ref="bId"></property>
</bean> </beans>

此外,如果是基于Java code的配置,还可以使用AnnotationConfigApplicationContext,其构造函数参数接受配置类或需要扫描的包路径,来加载配置元数据,如下所示

ApplicationContext ctx = new AnnotationConfigApplicationContext("cn.example.spring");

4.导入另一份xml中的配置元数据

(1) 通常来说,一个系统会被分为多个模块,某个模块都对应有一份单独的xml文件,因此,当我们需要向一个xml文件中导入另一个xml中的配置元数据时,可以使用import标签,如下所示

<beans ...>

    <!-- import标签:导入其它的配置文件;该标签定义于beans标签内部,与bean标签平行 -->
<import resource="from.xml"></import>
<import resource="down/son.xml"></import> </beans>

注意:采用的是相对于当前文件(在上面这个例子中为:definition.xml)的路径来导入其他的文件,上面这个例子中,文件结构为

--boke

 |-definition.xml

 |-from.xml

----down

    |-son.xml

definition.xml和from.xml处于同一级目录boke下,而son.xml位于down目录下,该目录是boke目录的子目录。Spring不建议使用相对路径(如:classpath:../beans.xml),但可以使用绝对路径(如:file:C:/spring/boke/from.xml或classpath:/boke/from.xml)来导入其他的xml配置文件

5.使用容器

(1) 容器用来管理bean,使用容器一般情况就是获取它所保存的bean。在ApplicationContext中,提供了getBean()方法(不推荐使用,会对Spring的API产生强依赖)来获取容器中的bean,如下示例所示

//1.创建容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("boke/definition.xml"); //2.从容器中获取需要bean
ExampleA a = ctx.getBean(ExampleA.class); //3.使用这个bean
a.doSomething();

此外,还可将GenericApplicationContext与XmlBeanDefinitionReader结合使用,来解析xml中的bean配置元数据并生成对应的bean

//1.创建容器
GenericApplicationContext context = new GenericApplicationContext(); //2.将xml文件的解析工作委托给了xml阅读器XmlBeanDefinitionReader,它会解析xml配置文件,并将解析的bean配置元数据交给GenericApplicationContext
new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml"); //3.刷新容器,此时容器就会创建出对应的bean
context.refresh(); //4.获取bean
ExampleA a = context.getBean(ExampleA.class); //5.使用这个bean
a.doSomething();

可见ClassPathXmlApplicationContext中已经包含了xml文件的解析工作

Spring IOC官方文档学习笔记(一)之IOC容器概述的相关教程结束。

《Spring IOC官方文档学习笔记(一)之IOC容器概述.doc》

下载本文的Word格式文档,以方便收藏与打印。