SpringFramework核心技术一(IOC:Spring容器的拓展点)

Spring容器的拓展点

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

一、使用BeanPostProcessor定制bean

1.BeanPostProcessor概念讲解

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

您可以配置多个BeanPostProcessor实例,并且可以BeanPostProcessor通过设置order属性来控制这些实例的执行顺序。只有在BeanPostProcessor实现Ordered接口时才可以设置此属性; 如果你自己写,BeanPostProcessor你应该考虑实现Ordered 接口。有关更多详细信息,请参阅BeanPostProcessor和 Ordered接口的javadocs 。另请参阅以下关于s的程序注册BeanPostProcessor的注释 。

BeanPostProcessors对bean(或对象)实例进行操作 ; 也就是说,Spring IoC容器实例化一个bean实例,然后 BeanPostProcessor完成他们的工作。
BeanPostProcessors是每个容器的作用域。这只有在使用容器层次结构时才有意义。如果您BeanPostProcessor在一个容器中定义了一个容器,它将只对该容器中的bean进行后处理。换句话说,在一个容器中定义的bean不会被BeanPostProcessor另一个容器中定义的后处理,即使这两个容器都是同一层次结构的一部分。
要更改实际的bean定义(即定义bean 的蓝图),您需要使用a BeanFactoryPostProcessor,如 使用BeanFactoryPostProcessor定制配置元数据中所述。

2.BeanPostProcessor回调方法

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

Spring容器ApplicationContext 自动检测,其中实施所述配置元数据中定义的任何豆BeanPostProcessor接口。将 ApplicationContext这些bean注册为后处理器,以便稍后在创建bean时调用它们。Bean后处理器可以像任何其他bean一样部署在容器中。

请注意,在配置类中声明BeanPostProcessor使用@Bean工厂方法时,工厂方法的返回类型应该是实现类本身或至少是org.springframework.beans.factory.config.BeanPostProcessor 接口,清楚地表明该bean的后处理器特性。否则,ApplicationContext在完全创建它之前, 将无法通过类型对其进行自动检测。由于BeanPostProcessor需要尽早实例化以适用于上下文中其他bean的初始化,因此这种早期类型检测非常关键。

以编程方式注册BeanPostProcessors
而对于建议的方法BeanPostProcessor注册是通过 ApplicationContext自动检测(如上文所述),但也可以注册它们编程对一个ConfigurableBeanFactory使用 addBeanPostProcessor方法。当需要在注册之前评估条件逻辑,或者甚至跨层次结构中的上下文复制Bean后处理器时,这会非常有用。但请注意,BeanPostProcessor以编程方式添加的s 不尊重Ordered接口。这是注册顺序决定执行顺序。还要注意,BeanPostProcessor通过编程注册的程序总是在通过自动检测注册的程序之前进行处理,而不管任何明确的排序。
BeanPostProcessors和AOP自动代理
实现BeanPostProcessor接口的类是特殊的,并且容器对其进行不同的处理。它们直接引用的所有BeanPostProcessors 和bean都会在启动时实例化,作为特殊启动阶段的一部分 ApplicationContext。接下来,所有BeanPostProcessors以已排序的方式注册并应用于容器中的所有其他bean。由于AOP自动代理是作为一个BeanPostProcessor自身实现的,所以BeanPostProcessor它们不直接引用的bean都有资格进行自动代理,因此没有编入它们的方面。
对于任何这样的bean,您应该看到一条信息性日志消息:“ Bean foo不适合通过所有BeanPostProcessor接口进行处理(例如:不适合自动代理) ”。
请注意,如果您的bean已连接到BeanPostProcessor使用自动装配或 @Resource(可能会回退到自动装配),Spring可能会在搜索类型匹配的依赖关系候选时访问意外的bean,因此使它们不适用于自动代理或其他类型的bean post -处理。例如,如果你有一个依赖注释,@Resource其中的字段/设置者名称并不直接与bean的声明名称相对应,并且没有使用名称属性,那么Spring将访问其他bean以便按类型匹配它们。

二、如何使用BeanPostProcessor自定义一个Bean

例如:Hello World,BeanPostProcessor风格
这第一个例子说明了基本用法。该示例显示了一个自定义 BeanPostProcessor实现,它调用toString()每个bean 的方法,因为它是由容器创建的,并将生成的字符串打印到系统控制台。
在自定义BeanPostProcessor实现类定义下面查找:

  • 写一个InstantiationTracingBeanPostProcessor实现了BeanPostProcessor接口
package scripting;

import org.springframework.beans.factory.config.BeanPostProcessor;

public class InstantiationTr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值