中秋绝句

中秋绝句

癸卯秋夜,虽炎热潮湿,开窗无月,然心情大好,咏志抒怀,无碍也,是为序。

自来霜雪映吴钩,半生浮云半生幽

未有三旬寂寞守,何能一夜照清秋

[译] Spring AOP 概念

AOP 通过提供另外一种关于程序结构的思考方式补充了面向对象编程(OOP )。在 OOP 中模块的关键单元是 class,而在 AOP 中,模块的关键是 Aspect(切面)。切面支持跨多个对象和类型的关注点模块化(比如事务的管理)。在 AOP 中这种关注点通常被叫做 “跨领域” 关注点。

Spring 的一个核心组件就是 AOP 框架。虽然 Spring IoC 容器并不依赖于 AOP(意思是如果不想用 AOP 可以不用),但是 AOP 对 Spring IoC 做了一个补充,提供了一种功能非常强大的中间件解决方案。

Spring AOP 和 切面切点

Spring 提供了简单而高效的方式来自定义切面,可以通过基于 schema 的方法也可以通过 @AspectJ 注解的风格。当使用 Spring AOP 来织入时,这两种风格都提供了充分类型的 advice 和 AspectJ 的切点语言。

这张主要讨论 schema 和 @Aspect 的 AOP 支持。AOP 底层的支持在下面的一章节会讨论到。

AOP 在 Spring 框架中的用途:

  • 提供声明式的企业级服务。最重要的就是声明式事务管理
  • 让用户实现自定义的切面作为他们用 AOP 实现 OOP 的补充。

Note:如果你对通用的声明式服务或者其他预先打包的声明式中间件服务感兴趣,你不用直接和 Spring AOP 直接打交道,可以跳过本章的大部分地方。

AOP 概念

让我们从一些核心的 AOP 概念和术语出发。这些术语并不只是 Spring 特有的。不幸地是,AOP 术语并不符合直觉。然而,如果 Spring 使用它自己的术语,或许会更加令人迷惑。

[译] Bean 概述

一个 Sring IoC 容器可以操作一个或者多个 bean。这些 bean 是通过你提供给容器的配置元数据生成的(例如,以 XML 中的 <bean/> )。

在容器内,这些 bean 的定义被表示成 BeanDefinition 对象的形式,包含了下面的元数据:

  • 包定义的类名:通常是定义的 bean 的真正实现类
  • bean 行为配置元素,表明了 bean 在 container 中的行为(scope,生命周期回调等等)。
  • 对其他需要的 bean 的引用。这些引用也被称作协作器和依赖。
  • 在一个新创建的对象中的其他配置设置 - 例如,池的数量限制或者一个操作连接池 bean 中的连接数量

这些元数据转换为构成这些 bean 定义的一系列属性。下表表示了这些属性值:

属性含义
Class正在实例化的bean
Namebean的名字
ScopeBean的Scope
构造函数参数依赖注入
自动装配模式装配的协作对象
懒加载模式懒加载 Bean
初始化方法初始化回调
析构方法析构回调

除了包含怎么创建一个特定的 bean 的信息之外, ApplicationContext 的实现同样允许在容器外面已经创建好的对象注册到其中(用户创建)。这是通过 getBeanFactory 方法获取到 ApplicationContextBeanFactory,得到 DefaultListableBeanFactory 实现来做到的。DefaultListableBeanFactory 支持通过调用 registerSingleton(..)registerBeanDefinition(..) 方法来实现这样的注册。然而,典型的应用程序仅仅使用常规的 bean 定义元数据。

[译] Spring IOC 容器

Spring IOC 和 bean 的简介

本章涵盖了 SpringFramework 中的控制反转原则(Ioc)的实现。IoC 也被称为依赖注入(DI)。它是这样的一种过程,在此期间对象仅通过构造函数参数、工厂方法的参数或者当对象实例被构造后或者通过工厂方法返回时在它上面设置的属性定义自己的依赖(即对象必须合作的其他对象)。

当容器创建这些 bean 后,再注入这些依赖。

这个过程本质上与bean 通过使用直接的类构造函数进行直接实例化或者通过类似 Service Locator模式来寻找依赖的位置是相反的(这也是 IoC 名字的由来)。

org.springframework.beansorg.springframework.context 包是 SpringFramework IoC 容器的基石。BeanFactory 接口提供了一种更先进的能够控制人已类型对象的配置机制。ApplicationContextBeanFactory 的子接口。它增加了下面的特性:

  • 与 Spring 的 AOP 特性更容易整合
  • 消息资源处理(在国际化场景的使用)
  • 事件发布
  • 例如用于 Web 应用的 WebApplicationContext 应用层特定的上下文

总而言之,BeanFactory 提供了配置的框架和基本的功能。ApplicationContext 增加了更多的企业特定的功能。ApplicationContext 完全是 BeanFactory 的超集。在本章关于 Spring IoC 容器做专门描述时会用到。想要获取更多的关于使用 ApplicationContext 而非 BeanFactory 的信息,参见介绍 BeanFactory API 的部分。

在 Spring 中,作为你应用基石同时可以被 Spring IoC 容器所操控的对象就被称之为 bean。bean 就是被 Spring IoC 容器实例化、组装和设置的对象。否则,一个 bean 就是你应用程序中诸多对象中的一个。 Beans 以及他们依赖关系,反映在容器使用的配置元数据中。

[译] 容器概述

容器概述

org.springframework.context.ApplicationContext 接口代表了 Spring IoC 容器,它主要负责通过读取配置文件对 bean 进行实例化、配置和组装。 容器通过读取配置元数据来获知要实例化、配置和组装那些对象。配置的元数据一般为 XML、Java 注解和 Java 代码的形式,它让你能够表达组成你应用程序的对象以及对象之间的丰富的相互依赖关系。

Spring 提供了 ApplicationContext 接口的若干实现。在单体应用中,创建一个 ClassPathXmlApplicationContext 或者 FileSystemXmlApplicationContext 是很常见的。虽然 XML 是定义配置元数据的传统形式,但是你还可以通过在 XML 文件里面进行声明配置来告诉容器对于 Java 注解或者Java代码格式的支持。

在大多数的应用场景中,并不需要显式的代码来实例化 Spring IoC 容器。例如,在 Web 应用的场景中,在 web.xml 文件中仅用简单的 8 行代码左右的样板 Web XML 描述符即可满足需要(参考 Convenient ApplicationContext Instantiation for Web Applications)。如果你使 Eclipse 中的 Spring 工具(在 Eclipse 开发环境中),你可以通过几下鼠标点击或者按键的敲击就能轻松创建这样一个样板配置文件。

下图展示了关于 Spring 工作机制的一个全局视角。在 ApplicationContext 被创建和初始化后,你的应用类和配置元数据已经捆绑在一起了,这样一来,你就有一个充分配置并且可执行的系统或者应用程序。

/posts/spring_framework/core/the_ioc_container/container_overview/imgs/ioc.png

配置元数据

如上图所示,Spring Ioc 容器接收到一种格式的配置元数据。这个配置元数据代表了,作为一个应用开发者你告诉 Spring 容器在应用程序中,如何实例化、配置和组装对象。

[译] SpringFramework 文档

  • 概述 历史,设计哲学,反馈,开始

  • 核心 IoC容器,事件,资源,i18n,验证,数据绑定,类型转换,SpEL,AOP,AOT

  • 测试 对象 Mock,测试上下文框架,Spring MVC 测试,Web 测试客户端

  • 数据接入 事务,DAO 支持,JDBC,R2DBC,O/R 映射,XML 编码

  • Web Servlet SpringMVC,WebSocket,SockJS,STOMP 通信

  • Web 响应式 Spring WebFlux, WebClient, WebSocket, RSocket.

  • [集成] REST 客户端, JMS, JCA, JMX, Email, 任务, 调度, 缓存, 可见性.

  • 语言 Kotlin, Groovy, Dynamic 语言.

  • 附录 Spring 属性