Save Load
GitHub 切换暗/亮/自动模式 切换暗/亮/自动模式 切换暗/亮/自动模式 返回首页

Spring Framework 2 核心

Spring Framework

來源:

链接:https://docs.spring.io/spring-framework/docs/current/reference/html/index.html

核心

IoC 容器, 事件, 资源, i18n, 验证、数据绑定、类型转换、SpEL、AOP、AOT。 息

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

其中最重要的是 Spring 框架的 控制反转 (IoC) 容器。在全面介绍 Spring Framework 的 IoC 容器之后,将全面介绍 Spring 的面向方面编程 (AOP) 技术。Spring Framework 有自己的 AOP 框架,概念上很容易理解,成功解决了 Java 企业编程中 80% 的 AOP 需求。

还提供了 Spring 与 AspectJ 的集成(就功能而言,目前是最丰富的,当然也是 Java 企业领域中最成熟的 AOP 实现)。

AOT 处理可用于提前优化您的应用程序。它通常用于使用 GraalVM 的本机映像部署。

AspectJ 是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。

JIT (Just-In-Time - 实时编译) 和 AOT (Ahead-Of-Time - 预先编译)

1. IoC 容器

本章涵盖 Spring 的控制反转 (IoC) 容器。

1.1. Spring IoC 容器和 Bean 介绍

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

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

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

简而言之,它 BeanFactory 提供了配置框架和基本功能,并 ApplicationContext 添加了更多企业特定的功能。是的 ApplicationContext 完整超集,BeanFactory 本章专门用于描述 Spring 的 IoC 容器。有关使用 BeanFactory 而不是 的更多信息,ApplicationContext ,请参阅涵盖 BeanFactoryAPI 的部分。

在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是由 Spring IoC 容器实例化、组装和管理的对象。否则,bean 只是应用程序中众多对象中的一个。Bean 以及它们之间的依赖关系反映在容器使用的配置元数据中。

”IoC 也称为依赖注入 (DI)。在这个过程中,对象仅通过构造函数参数、工厂方法的参数或在对象实例被构造或从工厂方法返回后设置的属性来定义它们的依赖关系(即它们使用的其他对象) . 然后容器在创建 bean 时注入这些依赖项。这个过程基本上是 bean 本身的逆过程(因此得名,控制反转)“

这句话解释了 IoC、DI:

个人解释是:

1、对象的属性是对象的依赖

2、通常对象想使用 依赖,比如说你的 Controller 对象,想使用 Servlet 对象,需要 new 一个 Servlet 对象 ,再通过 set 方法设置到 Controller 属性,这样 Controller 才能 使用,但是由容器注入这些依赖性,由容器创建这些依赖项,就可以称之为:控制反转、依赖注入

Bean

  • 可复用的组件 Java Bean 是可复用的组件,对 Java Bean 并没有严格的规范,理论上讲,任何一个 Java 类都可以是一个 Bean。但通常情况下,由于 Java Bean 是被容器所创建(如 Tomcat)的,所以 Java Bean 应具有一个无参的构造器,另外,通常 Java Bean 还要实现 Serializable 接口用于实现 Bean 的持久性。
  • bean 译过来即为“豆子”的意思,大家对豆子的印象是什么,大概就是只能看到豆子硬硬的外皮,而看不到内部的东西。那么在 java 中,bean 可以看成是一个黑盒子,即只需要知道其功能而不必知道其内部构造和设计。
  • 简单笼统来说就是一个类,一个可复用的类。

Spring 对 Bean 的管理的3个方面:

  • Bean 对象的创建方式(3种)
  • Bean 对象的作用域(5种)
  • Bean 对象的生命周期
    • 单例
    • 多例

1.2. 容器概述

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

ApplicationContext Spring 提供了该接口的多个实现。在独立应用程序中,通常创建 ClassPathXmlApplicationContext 或的实例 FileSystemXmlApplicationContext 。虽然 XML 一直是定义配置元数据的传统格式,但您可以通过提供少量 XML 配置以声明方式启用对这些额外元数据格式的支持,从而指示容器使用 Java 注释或代码作为元数据格式。

在大多数应用场景中,不需要显式的用户代码来实例化一个或多个 Spring IoC 容器实例。例如,在 Web 应用程序场景中,应用程序web.xml文件中简单的八(或左右)行样板 Web 描述符 XML 通常就足够了(请参阅方便的 Web 应用程序的 ApplicationContext 实例化)。如果您使用 Spring Tools for Eclipse(一个由 Eclipse 驱动的开发环境),您可以通过几次鼠标点击或击键轻松地创建这个样板配置。

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

图 1. Spring IoC 容器

1.2.1. 配置元数据

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

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

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

有关将其他形式的元数据用于 Spring 容器的信息,请参阅:

  • 基于注释的配置 :使用基于注释的配置元数据定义 bean。
  • 基于 Java 的配置:使用 Java 而不是 XML 文件来定义应用程序类外部的 bean。要使用这些功能,请参阅 @Configuration@Bean@Import@DependsOn注释。

Spring 配置包含至少一个且通常不止一个容器必须管理的 bean 定义。基于 XML 的配置元数据将这些 bean 配置为<bean/>顶级元素中的<beans/>元素。Java 配置通常@Bean在类中使用带注释的方法@Configuration

这些 bean 定义对应于构成您的应用程序的实际对象。通常,您定义服务层对象、持久层对象(例如存储库或数据访问对象 (DAO))、表示对象(例如 Web 控制器)、基础结构对象(例如 JPAEntityManagerFactory和 JMS 队列)等等。通常,不会在容器中配置细粒度的域对象,因为创建和加载域对象通常是存储库和业务逻辑的责任。

以下示例显示了基于 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="..."> (1) (2)
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions go here -->

</beans>
  1. 该id属性是一个字符串,用于标识单个 bean 定义。
  2. 该class属性定义 bean 的类型并使用完全限定的类名。

属性的值id可用于引用协作对象。此示例中未显示用于引用协作对象的 XML。有关详细信息,请参阅 依赖项。

1.2.2. 实例化容器

提供给构造函数的位置路径或路径 ApplicationContext 是资源字符串,让容器从各种外部资源(如本地文件系统、Java 等)加载配置元数据 CLASSPATH

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

在了解了 Spring 的 IoC 容器之后,您可能想了解更多关于 Spring 的 Resource抽象(如参考资料中所述),它提供了一种方便的机制,用于从 URI 语法中定义的位置读取 InputStream。特别是, Resource路径用于构造应用程序上下文,如应用程序上下文和资源路径中所述。

以下示例显示了服务层对象(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"/>
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for services go here -->

</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">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for data access objects go here -->

</beans>