Spring Framework【Core 核心】

Spring系列文章:core

基于spring 5.3.21版本
本参考文档重点介绍基础:Spring 框架本身。



前言

这一部分涵盖了Spring框架中绝对不可或缺的所有技术。

其中最重要的是 Spring Framework 的控制反转 (IoC) 容器。在对 Spring Framework 的 IoC 容器进行彻底处理之后,紧随着是对 Spring 的面向切面编程 (AOP) 技术的全面介绍。 Spring 框架有它自己的 AOP 框架,它在概念上很容易理解,并且成功地解决了 Java 企业编程中 80% 的 AOP 需求点。
还提供了 Spring 与 AspectJ 集成的覆盖范围(目前最丰富的 — 功能方面 — 当然也是 Java 企业领域中最成熟的 AOP 实现)


一、The IoC Container(IOC容器)

本章介绍了控制反转 (IoC) 原则的 Spring Framework 实现

1. Spring IoC 容器和 Bean 简介

IoC 也称为依赖注入 (DI)。这是一个过程,对象仅通过构造函数参数、工厂方法的参数或在对象实例被构造或从工厂方法返回后设置的属性来定义它们的依赖关系(即与它们一起工作的其他对象)。然后容器在创建 bean 时注入这些依赖项。这个过程基本上是 bean 本身通过使用类的直接构造或诸如服务定位器模式之类的机制来控制其依赖关系的实例化或位置的逆过程(因此得名,控制反转)。

org.springframework.beans 和 org.springframework.context 包是 Spring Framework 的 IoC 容器的基础。 BeanFactory 接口提供了一种高级配置机制,能够管理任何类型的对象。 ApplicationContext 是 BeanFactory 的子接口。优势说明:

  • 更容易与 Spring 的 AOP 功能集成
  • 消息资源处理(用于国际化)
  • 动态发布
  • 应用层特定上下文,例如用于 Web 应用程序的 WebApplicationContext。

简单的说就是,BeanFactory 提供了配置框架和基本功能,ApplicationContext 增加了更多的企业特定功能。 ApplicationContext 是 BeanFactory 的完整超集,在本章中专门用于描述 Spring 的 IoC 容器。有关使用 BeanFactory 而不是 ApplicationContext 的更多信息,请参阅涵盖 BeanFactory API 的部分。
在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。 bean 是由 Spring IoC 容器实例化、组装和管理的对象。否则,bean 只是应用程序中的众多对象之一。 Bean 以及它们之间的依赖关系反映在容器使用的配置元数据中。

2. 容器概述

org.springframework.context.ApplicationContext 接口代表 Spring IoC 容器,负责实例化、配置和组装 bean。容器通过读取配置元数据来获取关于要实例化、配置和组装哪些对象的指令。配置元数据以 XML、Java 注释或 Java 代码表示。它允许您表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。
Spring 提供了 ApplicationContext 接口的几个实现。在独立应用程序中,通常会创建 ClassPathXmlApplicationContextFileSystemXmlApplicationContext 的实例。虽然 XML 一直是定义配置元数据的传统格式,但您可以通过提供少量 XML 配置来以声明方式支持这些附加元数据格式,从而指示容器使用 Java 注释或代码作为元数据格式。

在大多数应用场景中,不需要用户显式地代码来实例化 Spring IoC 容器的一个或多个实例。例如,在 Web 应用程序场景中,应用程序的 web.xml 文件中简单的八行(左右)XML配置通常就足够了(请参阅 Web 应用程序的便捷 ApplicationContext 实例化)。

下图显示了 Spring 如何工作的高级视图。您的应用程序类与配置元数据相结合,以便在创建和初始化 ApplicationContext 之后,您拥有一个完全配置且可执行的系统或应用程序。
在这里插入图片描述

2.1. 配置元数据

如上图所示,Spring IoC 容器使用某种形式的配置元数据。表示作为应用程序开发人员,如何告诉 Spring 容器实例化、配置和组装应用程序中的对象。

配置元数据传统上以简单直观的XML格式提供,这是本章大部分内容用于传达Spring IoC容器的关键概念和功能。

基于 XML 的元数据并不是唯一允许的配置元数据形式。Spring IoC 容器本身与实际写入此配置元数据的格式完全分离。如今,许多开发人员选择基于Java来配置Spring应用程序。

sping 容器元数据配置有两种实现方式:

基于注解:Spring 2.5 引入了对基于注解的配置元数据的支持。
基于Java:从Spring 3.0开始,Spring JavaConfig项目提供的许多功能成为Spring框架核心的一部分。因此,您可以使用 Java 而不是 XML 文件来定义应用程序类外部的 Bean。要使用这些新功能,请参阅@Configuration、@Bean、@Import和@DependsOn注解。

Spring 配置包含容器必须管理的至少一个,通常是多个 bean 定义。基于 XML 的配置元数据将这些 bean 配置为顶级 元素内的 元素。 Java 配置通常使用 @Configuration 类中的 @Bean 注释方法。

这些 bean 定义对应于构成应用程序的实际对象。通常,您定义Service对象、Dao对象 (DAO)、View对象(如 Struts Action 实例)、基础设施对象(如 Hibernate SessionFactories、JMS 队列等)。通常,不会在容器中配置细粒度的域对象,因为创建和加载域对象通常是 DAO 和业务逻辑的责任。但是,您可以使用 Spring 与 AspectJ 的集成来配置在 IoC 容器控制之外创建的对象。请参阅使用 AspectJ 通过 Spring 依赖注入域对象。

以下示例显示了基于 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">
    <bean id="..." class="...">  
        <!-- 此处是bean依赖和配置 -->
    </bean>
    <bean id="..." class="...">
        <!-- 此处是bean依赖和配置 -->
    </bean>
    <!-- 在这里定义更多的bean  -->
</beans>
  1. id 属性是一个标识单个 bean 定义的字符串。
  2. class 属性定义 bean 的类型并使用完全限定 班级名称。

id 属性的值是指依赖对象。此示例中未显示用于引用依赖对象的 XML。

2.2. 实例化一个容器

一个或多个字符串格式的位置路径是提供给 ApplicationContext 构造函数的资源,允许容器从各种外部资源(例如本地文件系统、Java CLASSPATH 等)加载配置bean。

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

Spring 的 Resource 抽象类的信息,它提供了一种方便的机制,用于从 URI 语法中定义的位置读取 InputStream。具体来说,资源路径用于构建应用程序上下文,如应用程序上下文和资源路径中所述。

以下示例显示了服务层对象 (services.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">
    <!-- services -->
    <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
        <property name="accountDao" ref="accountDao"/>
        <property name="itemDao" ref="itemDao"/>
        <!-- 此处是bean依赖和配置 -->
    </bean>
     <!-- 在这里定义更多的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">
    <bean id="accountDao"
        class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
        <!-- 此处是bean依赖和配置 -->
    </bean>
    <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
        <!-- 此处是bean依赖和配置 -->
    </bean>
     <!-- 在这里定义更多的bean  -->
</beans>

在前面的示例中,服务层由 PetStoreServiceImpl 类和类型为 JpaAccountDao 和 JpaItemDao 的两个数据访问对象(基于 JPA 对象关系映射标准)组成。 property name 元素指的是 JavaBean 属性的名称,ref 元素指的是另一个 bean 定义的名称。 id 和 ref 元素之间的这种联系表达了协作对象之间的依赖关系。有关配置对象依赖项的详细信息,请参阅依赖项

2.3. 编写基于 XML 的配置元数据

让 bean 定义跨越多个 XML 文件会很有用。通常,每个单独的 XML 配置文件都代表架构中的一个逻辑层或模块。 您可以使用应用程序上下文构造函数从所有这些 XML 片段加载 bean 定义。此构造函数采用多个 Resource 位置,如上一节所示。或者,使用一个或多个 元素从另一个或多个文件加载 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>

在前面的示例中,外部 bean 定义从三个文件加载:services.xml、messageSource.xml 和 themeSource.xml。所有位置路径都相对于执行导入的定义文件,因此 services.xml 必须与执行导入的文件位于同一目录或类路径位置,而 messageSource.xml 和 themeSource.xml 必须位于该位置下方的资源位置的导入文件。如您所见,前导斜杠被忽略。但是,鉴于这些路径是相对的,最好不要使用斜线。根据 Spring Schema,被导入文件的内容,包括顶级 元素,必须是有效的 XML bean 定义。

可以但不推荐使用相对“…/”路径来引用父目录中的文件。这样做会创建对当前应用程序之外的文件的依赖。特别是,不建议将此引用用于类路径:URL(例如,classpath:…/services.xml),其中运行时解析过程会选择“最近的”类路径根,然后查看其父目录。类路径配置更改可能会导致选择不同的、不正确的目录。 您始终可以使用完全限定的资源位置而不是相对路径:例如,file:C:/config/services.xml 或 classpath:/config/services.xml。但是,请注意,您将应用程序的配置耦合到特定的绝对位置。通常最好为此类绝对位置保留间接性 — 例如,通过在运行时针对 JVM 系统属性解析的“${…​}”占位符。

命名空间本身提供了导入指令功能。 Spring 提供的一系列 XML 命名空间中提供了除了普通 bean 定义之外的更多配置特性 — 例如 context 和 util 命名空间。

未完待续


总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值