中秋绝句
中秋绝句
癸卯秋夜,虽炎热潮湿,开窗无月,然心情大好,咏志抒怀,无碍也,是为序。
自来霜雪映吴钩,半生浮云半生幽
未有三旬寂寞守,何能一夜照清秋
中秋绝句
癸卯秋夜,虽炎热潮湿,开窗无月,然心情大好,咏志抒怀,无碍也,是为序。
自来霜雪映吴钩,半生浮云半生幽
未有三旬寂寞守,何能一夜照清秋
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 框架中的用途:
Note:如果你对通用的声明式服务或者其他预先打包的声明式中间件服务感兴趣,你不用直接和 Spring AOP 直接打交道,可以跳过本章的大部分地方。
让我们从一些核心的 AOP 概念和术语出发。这些术语并不只是 Spring 特有的。不幸地是,AOP 术语并不符合直觉。然而,如果 Spring 使用它自己的术语,或许会更加令人迷惑。
一个 Sring IoC 容器可以操作一个或者多个 bean。这些 bean 是通过你提供给容器的配置元数据生成的(例如,以 XML 中的 <bean/>
)。
在容器内,这些 bean 的定义被表示成 BeanDefinition
对象的形式,包含了下面的元数据:
这些元数据转换为构成这些 bean 定义的一系列属性。下表表示了这些属性值:
属性 | 含义 |
---|---|
Class | 正在实例化的bean |
Name | bean的名字 |
Scope | Bean的Scope |
构造函数参数 | 依赖注入 |
自动装配模式 | 装配的协作对象 |
懒加载模式 | 懒加载 Bean |
初始化方法 | 初始化回调 |
析构方法 | 析构回调 |
除了包含怎么创建一个特定的 bean 的信息之外, ApplicationContext
的实现同样允许在容器外面已经创建好的对象注册到其中(用户创建)。这是通过 getBeanFactory
方法获取到 ApplicationContext
的 BeanFactory
,得到 DefaultListableBeanFactory
实现来做到的。DefaultListableBeanFactory
支持通过调用 registerSingleton(..)
和 registerBeanDefinition(..)
方法来实现这样的注册。然而,典型的应用程序仅仅使用常规的 bean 定义元数据。
本章涵盖了 SpringFramework 中的控制反转原则(Ioc)的实现。IoC 也被称为依赖注入(DI)。它是这样的一种过程,在此期间对象仅通过构造函数参数、工厂方法的参数或者当对象实例被构造后或者通过工厂方法返回时在它上面设置的属性定义自己的依赖(即对象必须合作的其他对象)。
当容器创建这些 bean 后,再注入这些依赖。
这个过程本质上与bean 通过使用直接的类构造函数进行直接实例化或者通过类似 Service Locator模式来寻找依赖的位置是相反的(这也是 IoC 名字的由来)。
org.springframework.beans
和 org.springframework.context
包是 SpringFramework IoC 容器的基石。BeanFactory
接口提供了一种更先进的能够控制人已类型对象的配置机制。ApplicationContext
是 BeanFactory
的子接口。它增加了下面的特性:
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
被创建和初始化后,你的应用类和配置元数据已经捆绑在一起了,这样一来,你就有一个充分配置并且可执行的系统或者应用程序。
如上图所示,Spring Ioc 容器接收到一种格式的配置元数据。这个配置元数据代表了,作为一个应用开发者你告诉 Spring 容器在应用程序中,如何实例化、配置和组装对象。
概述 历史,设计哲学,反馈,开始
核心 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 属性