Spring扩展接口总结
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 扩展接口调用顺序图

3.2 bean生命周期

3.3 Spring加载扩展接口

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