跳到主要内容

Spring5中文文档【6】IOC容器之容器扩展点

前言

本系列基于最新5.3.10版本,大部分内容copy于官方文档…
官方文档地址

1. 容器扩展点

通常,应用程序开发人员不需要对ApplicationContext 实现类进行子类化。相反,可以通过插入特殊集成接口的实现来扩展 Spring IoC 容器。接下来的几节将描述这些集成接口。

1.1 通过使用自定义 Bean(BeanPostProcessor)

该BeanPostProcessor接口定义了回调方法,您可以实现这些方法以提供您自己的(或覆盖容器的默认值)实例化逻辑、依赖项解析逻辑等。如果要在 Spring 容器完成对 bean 的实例化、配置和初始化之后实现一些自定义逻辑,可以插入一个或多个自定义BeanPostProcessor实现。

您可以配置多个BeanPostProcessor实例,并且可以BeanPostProcessor通过设置该order属性来控制这些实例的运行顺序。仅当BeanPostProcessor实现Ordered 接口时才能设置此属性。如果您自己编写BeanPostProcessor,您也应该考虑实现该Ordered接口。

BeanPostProcessor实例对 bean(或对象)实例进行操作。也就是说,Spring IoC 容器实例化一个 bean 实例,然后BeanPostProcessor 实例完成它们的工作。

BeanPostProcessor实例的范围是每个容器。仅当您使用容器层次结构时,这才是相关的。如果您BeanPostProcessor在一个容器中定义 a ,它只会对该容器中的 bean 进行后处理。换句话说,在一个容器中定义的 bean 不会由BeanPostProcessor另一个容器中定义的 bean 进行后处理,即使两个容器都是同一层次结构的一部分。

要更改实际的 bean 定义(即定义 bean 的蓝图),您需要使用BeanFactoryPostProcessor,如 使用自定义配置元数据中所述BeanFactoryPostProcessor。

该org.springframework.beans.factory.config.BeanPostProcessor接口正好包含两个回调方法。当这样的类注册为容器的后处理器时,对于容器创建的每个 bean 实例,后处理器都会在容器初始化方法(例如InitializingBean.afterPropertiesSet()或任何声明的init方法)之前从容器中获取回调调用,并在任何 bean 初始化回调之后。后处理器可以对 bean 实例执行任何操作,包括完全忽略回调。bean 后处理器通常检查回调接口,或者它可以用代理包装 bean。一些 Spring AOP 基础设施类被实现为 bean 后处理器,以提供代理包装逻辑。