2、IoC 浅识
2.1、容器概述
**org.springframework.context.ApplicationContext
接口代表 Spring IoC 容器,**负责实例化、配置和组装 bean。容器通过读取配置元数据来获取关于要实例化、配置和组装哪些对象的指令。配置元数据以 XML、Java 注释或 Java 代码表示。它允许你表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。
Spring 提供了对 ApplicationContext
接口的几个实现。在独立应用程序中,通常会创建 ClassPathXmlApplicationContext
或 FileSystemXmlApplicationContext
的实例
2.2、配置元数据
有关在 Spring 容器中使用其他形式的元数据的信息
- 基于XML的配置:元数据将这些 bean 配置为
<bean/>
顶级元素<beans/>
内的元素 - 基于注解的配置:Spring 2.5 引入了对基于注解的配置元数据的支持
- 基于 Java 的配置:从 Spring 3.0 开始,Spring JavaConfig 项目提供的许多特性成为核心 Spring Framework 的一部分。因此,你可以使用 Java 而不是 XML 文件来定义应用程序类外部的 bean。要使用这些新功能,请参阅
@Configuration
、@Bean
、@Import
和@DependsOn
注释- Java 配置通常在
@Configuration
类中使用@Bean
注释方法
- Java 配置通常在
如今,许多开发人员 为其 Spring 应用程序 选择基于 Java 的配置。
配置元数据传统上以简单直观的 XML 格式提供,本节主要介绍XML配置,以下示例显示了基于 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">
<!--
该id属性是标识单个 bean 定义的字符串
该class属性定义 bean 的类型并使用完全限定的类名
-->
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
该示例中
id
属性的值是指协作对象。此示例中未显示用于引用协作对象的 XML。更多信息请参阅 依赖项。
2.3、实例化一个容器
提供给ApplicationContext
构造函数的一个或多个资源位置路径(字符串类型),允许容器从各种外部资源加载配置元数据CLASSPATH
。
ApplicationContext context =
new ClassPathXmlApplicationContext("services.xml", "daos.xml");
以下示例显示了服务层对象(services.xml)
配置文件:
**元素
ref
引用另一个bean 定义的名称id
。元素之间的这种联系ref
表达了协作对象之间的依赖关系。**有关配置对象依赖项的详细信息,请参阅 依赖项。
<?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">
<!-- services -->
<bean id="petStore"
class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
<property name="accountDao" ref="accountDao"/>
<property name="itemDao" ref="itemDao"/>
</bean>
</beans>
以下示例显示了数据访问对象daos.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">
<!-- daos -->
<bean id="accountDao"
class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
</bean>
<bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
</bean>
</beans>
通过xml引入其他配置文件
让 bean 定义跨越多个 XML 文件会很有用。通常,每个单独的 XML 配置文件都代表架构中的一个逻辑层或模块。
除了上面所示通过 ApplicationContext
实现类的构造函数传入多个Resource
位置自动关联,还可以使用 <import/>
导入一个或多个实例(从另一个文件或多个文件加载 bean 定义)。以下示例显示了如何执行此操作:
<beans>
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>
<bean id="bean1" class="..."/>
<bean id="bean2" class="..."/>
</beans>
注意:被导入文件的内容,包括顶级<beans/>
元素,必须是有效的 XML bean 定义。
引入路径推荐使用完全限定的资源位置而不是相对路径:例如,
file:C:/config/services.xml
或classpath:/config/services.xml
. 但是,请注意您将应用程序的配置耦合到特定的绝对位置。通常最好为此类绝对位置保留间接性——例如,通过在运行时针对 JVM 系统属性解析的“${…}”占位符。
2.4、使用容器
ApplicationContext
是一个高级工厂的接口,能够维护不同 bean 及其依赖项的注册表。
通过使用方法 T getBean(String name, Class<T> requiredType)
,可以检索 bean 的实例。允许读取 bean 定义并访问它们,如以下ApplicationContext
示例所示:
// 创建和配置bean
ApplicationContext context =
new ClassPathXmlApplicationContext("services.xml", "daos.xml");
// 检索配置的实例
PetStoreService service = context.getBean("petStore", PetStoreService.class);
// 使用配置的实例
List<String> userList = service.getUsernameList();