前言
上一节,我们已经完成通过 xml 配置文件 实现 Bean 的注入。这一节是重头戏,老实说,我现在都还弄的很明白。这是第二遍看这个过程了,还是有点云里雾里的。但是相对于第一次来说,已经上升了一个高度。 在这一节,会对 spring 创建 bean 的过程进行封装。并且提供 BeanPostProcessor
,BeanFactoryPostProcessor
等扩展接口。(这两个东西老强了) 上下文把整个创建过程包装起来,对外暴露一个简单的入口,其他的东西都在内部实现。(这个过程其实可以类比成 模板方法
是使用,我们直接使用就可以,并不需要知道内部的实现) 由于上下文已经封装好了整个bean的创建过程,内部实现对外是不开放的,所以提供了 BeanPostProcessor(bean 创建 之前处理,bean 创建之后处理)、BeanFactoryPostProcessor (对beanDifinition 创建后处理)给 开发者 的扩展接口,在创建bean的过程中,添加自己的实现逻辑。
实现
BeanPostProcessor Bean 创建完成前后扩展接口
它可以在 Bean 实例化、依赖注入、初始化前后等时刻对 Bean 进行一些额外的处理,例如修改 Bean 属性、动态代理等等。 这个类使用了模板方法
模式。扩展类只需实现该接口,然后spring会在创建的bean的过程中调用这个方法完成 对bean的修改。 spring 在获取所有的 扩展类并完成扩展使用的是装饰器模式
,每个 扩展类都可以类比成一个装饰器
,然后通过责任链
的方式完成调用。
**模板方法:**模板方法是一种行为设计模式,它定义了一个过程的
骨架
,并允许子类在不改变该过程结构的情况下重新定义某些步骤。 **装饰器模式:**装饰器模式是一种结构型设计模式,它允许动态地向对象添加新的行为,同时又不会改变其原有的行为。该模式通过一种装饰器类来包装原有的类,从而给对象增加新的功能。 责任链模式:责任链模式是一种行为型设计模式,它将多个处理器(Handler)组成一条链,用于依次处理请求,直到请求被处理完成为止。在责任链模式中,每个处理器都有一个指向下一个处理器的引用,从而形成了一条处理链。
在实际开发过程中,我们也可以尝试使用这些设计模式来优化我们的代码。在这个扩展接口的实现过程,我们可以学到 模板
+装饰器
+责任链
的一种使用场景。很多时候,单独是设计模式并不能很好地解决问题,但是当我们把他们组合到一起的时候,他就会变成一种很优雅的解决方案
.
/**
* @author huangle
* @date 2023/2/13 15:18
*/
public interface BeanPostProcessor {
/**
* 在 Bean 对象执行初始化方法之前,执行此方法
*
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
/**
* 在 Bean 对象执行初始化方法之后,执行此方法
*
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
复制代码
BeanFactoryPostProcessor beanDefinition 加载完成后扩展接口
这个扩展设计跟上一个差不多&#x