跳至主要內容

Spring扩展接口总结

soulballad总结文字总结文字总结约 1583 字大约 5 分钟

1. 扩展接口分类

Spring中的扩展接口非常多,给开发者留下了足够多的扩展点。在Spring中最核心的是IOC容器,而IOC容器中核心的是Bean,Bean就是Java对象,因此扩展点围绕的就是对这个Java对象(Bean)的生命周期的一些关键点做一些扩展。生命周期包括实例化,初始化,销毁等,针对每个阶段Spring几乎都有对应的扩展点,了解这些可以更好的帮助我们理解整个Spring容器的运行和对Bean的扩展和管理。按照扩展点的分类,我梳理了Spring中有下面这些扩展点。

1.1 Aware系列

BeanNameAware
ApplicationContextAware
BeanFactoryAware
ApplicationEventPublisherAware
BeanClassLoaderAware
BootstrapContextAware
LoadTimeWeaverAware
MessageSourceAware
NotificationPublisherAware
ResourceLoaderAware
ServletConfigAware
ServletContextAware
EnvironmentAware

1.2 BeanPostProcessor系列

BeanPostProcessor
BeanFactoryPostProcessor
InstantiationAwareBeanPostProcessor
MergedBeanDefinitionPostProcessor
SmartInstantiationAwareBeanPostProcessor

1.3 初始化和销毁

InitialingBean和@PostConstruct,initMethod
DisposableBean和@PreDestroy,destroyMethod

1.4 导入类

ImportAware
ImportSelector/DeferredImportSelector
ImportBeanDefinitionRegistrar

1.5 AOP相关

StaticMethodMatcherPointcut
AbstractBeanFactoryPointcutAdvisor
MethodInterceptor

1.6 Bean解析

NamespaceHandler
BeanDefinitionParser

1.7 其他

FactoryBean

2. 详解

2.1 Aware系列解析

Aware系列的接口作用很相似,都是给一个bean赋予一种能力,或者说给bean附一个值进去,比如BeanNameAware接口就是将beanName传给bean,后面的ApplicationContextAware接口,就是将ApplicationContext传给bean,BeanFactoryAware接口就是将BeanFactory传给bean,几乎是类似的,如果我们的bean在业务功能上需要这些对象,就可以通过相对应的Aware接口来实现字段的注入。

2.1.1 BeanNameAware

2.1.2 ApplicationContextAware

同上,不再赘述

2.1.3 BeanFactoryAware

同上,不再赘述

2.1.4 EnvironmentAware

同上,不再赘述

2.1.5 ApplicationEventPublisherAware

同上,不再赘述

2.2 BeanPostProcessor系列解析

2.2.1 BeanPostProcessor

方法会在bean的初始化前后被调用

2.2.2 InstantiationAwareBeanPostProcessor

方法会在bean的实例化前后被调用(注意实例化和初始化的区别,先实例化,再初始化)

2.2.3 MergedBeanDefinitionPostProcessor

方法会在bean的实例化之后调用,但是在InstantiationAwareBeanPostProcessor的后置After方法之前调用

2.2.4 BeanFactoryPostProcessor

Spring允许在Bean创建之前,读取Bean的元属性,并根据自己的需求对元属性进行改变,比如将Bean的scope从singleton改变为prototype,PropertyPlaceholderConfigurer就是最典型的应用,其作用是替换xml文件中的占位符,替换为properties文件中相应的key对应的value值。
经验证BeanFactoryPostProcessor的postProcessBeanFactory方法执行时机比InstantiationAwareBeanPostProcessor的前置方法还要早,也就是说这个方法的执行时机早于前面的时序图的全部流程,是在最前面的,且只会执行一次,那么它的作用是什么呢,先看下示例代码如下:

2.2.5 SmartInstantiationAwareBeanPostProcessor

就是来自定义Bean的管理和对Bean进行功能增强。例如Spring AOP的实现就是实现了 SmartInstantiationAwareBeanPostProcessor 接口。实现自定义注解就可以使用当前的这些处理器来实现。

2.3 初始化和销毁

2.3.1 初始化

  • @PostConstruct:JSR规范注解,JDK的注解,不是Spring的注解,注解的方法会在初始化阶段调用,也在这里一并讲解
  • InitialingBean:Spring提供的扩展接口,会在初始化阶段调用,在属性设置完毕后做一些自定义操作
  • initMethod:@Bean注解的属性方法,会在初始化阶段调用,在属性设置完毕后做一些自定义操作

2.3.2 销毁(关闭容器前执行)

  • @PreDestroy:JSR规范注解,JDK的注解,不是Spring的注解,注解的方法会在销毁阶段调用,也在这里一并讲解
  • DisposableBean:Spring提供的扩展接口,会在Bean销毁阶段调用
  • destroyMethod:@Bean注解的属性方法,会在销毁阶段调用

2.3.3 调用时机

上面的6个方法,具体调用时机,参照后面的日志打印,或者时序图,比较清晰。

2.4 导入类

2.4.1 ImportAware

从Spring的源码注释来看ImportAware接口是需要和@Import一起使用的。通过@Import导入的配置类如果实现了ImportAware接口就可以获取到导入该配置类接口的数据配置。同时需要搭配 @Configuration注解
例如Spring实现的注解**@ EnableAsync** 中的 ProxyAsyncConfiguration 就实现了。

2.4.2 ImportSelector,DeferredImportSelector

动态导入配置类,例如Spring的实现:@ EnableAsync

2.4.3 ImportBeanDefinitionRegistrar

可以实现自己的注解管理自己的Bean。例如Spring注解: @EnableAspectJAutoProxy

2.5 AOP相关

对于AOP记住三点就好,Advisor、Advice、Pointcut。所以Spring提供了三个对应的接口来给使用者拓展实现。

2.5.1 StaticMethodMatcherPointcut

切点实现

2.5.2 AbstractBeanFactoryPointcutAdvisor

通知器实现

2.5.3 MethodInterceptor

切面实现

2.6 Bean 解析

2.6.1 NamespaceHandler

DubboNamespaceHandler

2.6.2 BeanDefinitionParser

DubboBeanDefinitionParser

2.7 其他

2.7.1 FactoryBean

FactoryBean在Spring中是非常有用的一个接口,传统的Spring容器加载一个Bean的整个过程,都是由Spring控制的,换句话说,开发者除了设置Bean相关属性之外,没有太多的自主权的。FactoryBean改变了这一点,开发者可以个性化地定制自己想要实例化出来的Bean,就是基于FactoryBean接口实现的。

3. 图示

3.1 扩展接口调用顺序图

img

3.2 bean生命周期

img

3.3 Spring加载扩展接口

img

4. 总结

Bean的生命周期在刚开始看还是比较复杂的,前后接口子接口什么的非常多,我们按照上面的流程图,将Bean的生命周期先大致分为几个阶段,然后关注每个阶段有哪些扩展点。
实例化:InstantiationAwareBeanPostProcessor 在该阶段前后拦截,初始化之后还有
MergedBeanDefinitionPostProcessor接口,这个接口是实现@Autowire和@Value的关键,可以查看参考文档:04-spring AutowiredAnnotationBeanPostProcessor接口
初始化:BeanPostProcess 在该阶段前后拦截,初始化阶段过程中介绍了3种拦截方法
销毁阶段:主要是容器关闭的时候调用,也介绍了3种拦截方法
能力接口:就是Aware系列接口,会在初始化之前调用,也就是BeanPostProcess的Before方法之前
另外文中提到的@PostConstructor和PreDestroy并不是Spring中的内容,也一并带出了。

参考:
Spring扩展接口总结open in new window
Spring常用的拓展接口分门别类open in new window

上次编辑于:
贡献者: soulballad