2、IoC 浅识

2、IoC 浅识

2.1、容器概述

**org.springframework.context.ApplicationContext接口代表 Spring IoC 容器,**负责实例化、配置和组装 bean。容器通过读取配置元数据来获取关于要实例化、配置和组装哪些对象的指令。配置元数据以 XML、Java 注释或 Java 代码表示。它允许你表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。

Spring 提供了对 ApplicationContext接口的几个实现。在独立应用程序中,通常会创建 ClassPathXmlApplicationContextFileSystemXmlApplicationContext的实例

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 注释方法

如今,许多开发人员 为其 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.xmlclasspath:/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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纯纯的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值