在介绍Aware接口及其实现类的作用中,就有说过在bean调用初始化方法的前后会调用BeanPostProcessor中的方法,以便对bean实现定制化。
BeanPostProcessor接口源码:
public interface BeanPostProcessor {
// 在任何bean初始化(如调用InitializingBean的afterPropertiesSet方法或自定义初始化方法)之前进行回调
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
// 在任何bean初始化(如调用InitializingBean的afterPropertiesSet方法或自定义初始化方法)之后进行回调
// 在FactoryBean的情况下,将为FactoryBean实例和FactoryBean创建的对象调用此回调(从Spring 2.0开始)
// PostProcessor可以通过bean instanceof FactoryBean检查来决定是应用于FactoryBean或创建的对象还是两者
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
- 工厂钩子:允许自定义修改新bean实例的工厂钩子,例如检查标记接口(接口不包含任何方法)或使用代理包装 bean。通常,通过标记接口填充bean的PostProcessor将实现postProcessBeforeInitialization方法,而使用代理包装bean的PostProcessor通常将实现postProcessAfterInitialization方法。
- 注册:ApplicationContext可以在其bean定义中自动检测BeanPostProcessor bean,并将这些PostProcessor应用于随后创建的任何bean。 一个普通的BeanFactory允许以编程方式注册PostProcessor,并将它们应用于通过bean工厂创建的所有bean。
- 顺序:在ApplicationContext中自动检测的BeanPostProcessor bean将根据PriorityOrdered和Ordered语义进行排序。 相比之下,以编程方式注册到BeanFactory的BeanPostProcessor bean 将按注册顺序应用; 对于以编程方式注册的PostProcessor,通过实现PriorityOrdered或Ordered接口表达的任何排序语义都将被忽略。 此外,@Order注解不会被BeanPostProcessor bean考虑在内。
首先了解一下bean的生命周期,标准的bean生命周期接口, 初始化方法及其标准顺序(在BeanFactory接口中有描述):
- BeanNameAware的setBeanName方法。
- BeanClassLoaderAware的setBeanClassLoader方法。
- BeanFactoryAware的setBeanFactory方法。
- EnvironmentAware的setEnvironment方法。
- EmbeddedValueResolverAware的setEmbeddedValueResolver方法。
- ResourceLoaderAware的setResourceLoader方法(仅在ApplicationContext中运行时适用)。
- ApplicationEventPublisherAware的setApplicationEventPublisher方法(仅在ApplicationContext中运行时适用)。
- MessageSourceAware的setMessageSource方法(仅在ApplicationContext中运行时适用)。
- ApplicationContextAware的setApplicationContext方法(仅在ApplicationContext中运行时适用)。
- ServletContextAware的setServletContext方法(仅在web ApplicationContext中运行时适用)。
- BeanPostProcessors的postProcessBeforeInitialization方法。
- InitializingBean的afterPropertiesSet方法。
- 自定义初始化方法(bean定义中的initMethod属性)。
- BeanPostProcessors的postProcessAfterInitialization方法。
在关闭bean工厂或者注销bean时,会执行以下生命周期方法:
- DestructionAwareBeanPostProcessors的postProcessBeforeDestruction方法。
- DisposableBean的destroy方法。
- 自定义销毁方法(bean定义中的destroyMethod属性)。
前10个步骤都是基于Aware接口及其实现类来完成的:
- Spring framework 源码阅读(一):Aware接口及其实现类的作用
这篇博客会涉及到以下内容:
- Spring framework 源码阅读(二):BeanDefinition的作用
- Spring framework 源码阅读(三):认识FactoryBean
先在Spring framework源码中增加一个application module,这在之前的博文中已经介绍过了,这里就不再赘述:
- 编译 Spring framework 5.2.17源码 & 在源码中使用 ApplicationContext 获取定义的Bean
IMessageService接口:
package com.kaven.service;
public interface IMessageService {
default String getMessage() {
return "default message";
}
}
MessageServiceImpl实现类:
package com.kaven.service.impl;
import com.kaven.service.IMessageService;
import org.springframework.util.StringUtils;
public class MessageServiceImpl implements IMessageService {
private String message;
public MessageServiceImpl(String message) {
System.out.println("[MessageServiceImpl] : init");
this.message = message;
}
@Override
public String getMessage() {
return message;
}
public void addMessagePrefix(String prefix) {
message = prefix.concat(message);
}
}
MessageServiceFactoryBean类(FactoryBean):
package com.kaven.factory;
import com.kaven.service.IMessageService;
import com.kaven.service.impl.MessageServiceImpl;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
@Component("myFactoryBean")
public class MessageServiceFactoryBean implements FactoryBean {
@Override
public IMessageService getObject() throws Exception {
System.out.println("[MessageServiceFactoryBean] : getObject");
return new MessageServiceImpl("Hello Spring");
}
@Override
public Class> getObjectType() {
return IMessageService.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
MessageBeanPostProcess类(实现BeanPostProcess接口):
package com.kaven.process;
import com.kaven.Application;
import com.kaven.service.impl.MessageServiceImpl;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor;
import org.springframework.stereotype.Component;
@Component
public class MessageBeanPostProcess implements DestructionAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if(bean instanceof MessageServiceImpl) {
MessageServiceImpl service = (MessageServiceImpl) bean;
System.out.println("[MessageBeanPostProcess - Before(MessageServiceImpl)] : " + service.getMessage());
}
else if(bean instanceof Application.Task) {
Application.Task task = (Application.Task) bean;
System.out.println("[MessageBeanPostProcess - Before(Application.Task)] : " + task.addTask());
}
else {
System.out.println("[MessageBeanPostProcess - Before] : " + bean.getClass());
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(bean instanceof MessageServiceImpl) {
MessageServiceImpl service = (MessageServiceImpl) bean;
service.addMessagePrefix("(ITKaven)");
System.out.println("[MessageBeanPostProcess - After(MessageServiceImpl)] : " + service.getMessage());
}
else if(bean instanceof Application.Task) {
Application.Task task = (Application.Task) bean;
System.out.println("[MessageBeanPostProcess - After(Application.Task)] : " + task.addTask());
}
else {
System.out.println("[MessageBeanPostProcess - After] : " + bean.getClass());
}
return bean;
}
@Override
public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
System.out.println("[MessageBeanPostProcess - postProcessBeforeDestruction]" + bean.getClass());
}
}
DestructionAwareBeanPostProcessor是BeanPostProcess接口的子接口,在bean生命周期的第15步会涉及到它。
启动类Application:
package com.kaven;
import com.kaven.service.IMessageService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
@ComponentScan({"com.kaven"})
public class Application {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Application.class);
IMessageService messageServiceBean = (IMessageService) applicationContext.getBean("myFactoryBean");
Task task = (Task) applicationContext.getBean("myTask");
System.out.println("taskCount: " + task.addTask());
System.out.println("BeanDefinitionCount: " + applicationContext.getBeanDefinitionCount());
Arrays.stream(applicationContext.getBeanDefinitionNames()).forEach(System.out::println);
applicationContext.getBeanFactory().destroyBean("myTask", task);
}
@Bean(value = "myTask", initMethod = "initMethod", destroyMethod = "destroyMethod")
public Task getTask() {
return new Task();
}
public static class Task implements InitializingBean, DisposableBean {
private final AtomicInteger taskCount;
public Task() {
taskCount = new AtomicInteger(0);
System.out.println("[Task] : create");
}
public int addTask() {
return taskCount.incrementAndGet();
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("[Task - afterPropertiesSet] : ok");
}
public void initMethod() {
System.out.println("[Task - initMethod] : ok");
}
@Override
public void destroy() throws Exception {
System.out.println("[Task - destroy] : ok");
}
public void destroyMethod() {
System.out.println("[Task - destroyMethod] : ok");
}
}
}
输出结果:
> Task :application:Application.main() [MessageBeanPostProcess - Before] : class com.kaven.Application [MessageBeanPostProcess - After] : class com.kaven.Application [MessageBeanPostProcess - Before] : class com.kaven.factory.MessageServiceFactoryBean [MessageBeanPostProcess - After] : class com.kaven.factory.MessageServiceFactoryBean [Task] : create [MessageBeanPostProcess - Before(Application.Task)] : 1 [Task - afterPropertiesSet] : ok [Task - initMethod] : ok [MessageBeanPostProcess - After(Application.Task)] : 2 [MessageServiceFactoryBean] : getObject [MessageServiceImpl] : init [MessageBeanPostProcess - After(MessageServiceImpl)] : (ITKaven)Hello Spring taskCount: 3 BeanDefinitionCount: 8 org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory application myFactoryBean messageBeanPostProcess myTask [MessageBeanPostProcess - postProcessBeforeDestruction]class com.kaven.Application$Task [Task - destroy] : ok [Task - destroyMethod] : ok BUILD SUCCESSFUL in 33s 61 actionable tasks: 2 executed, 59 up-to-date
大家根据上面的代码仔细看看输出结果,很显然是符合预期的。
创建这4个内置bean的过程在介绍BeanDefinition的作用时有介绍过。
org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory
其他bean都是我们自定义的。
源码分析[MessageBeanPostProcess - Before] : class com.kaven.Application [MessageBeanPostProcess - After] : class com.kaven.Application [MessageBeanPostProcess - Before] : class com.kaven.factory.MessageServiceFactoryBean [MessageBeanPostProcess - After] : class com.kaven.factory.MessageServiceFactoryBean
这4行输出,很显然是调用MessageBeanPostProcess类中的postProcessBeforeInitialization方法和postProcessAfterInitialization方法导致的。因为在bean调用初始化方法的前后会调用BeanPostProcessor中的方法。
而这是通过调用AbstractAutowireCapableBeanFactory抽象类的initializeBean方法来实现的。
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
// 调用aware methods
AccessController.doPrivileged((PrivilegedAction
在applyBeanPostProcessorsBeforeInitialization方法中调用了postProcessBeforeInitialization方法(getBeanPostProcessors方法会返回内置和自定义的BeanPostProcessor)。
@Override
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessBeforeInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
同样的,在applyBeanPostProcessorsAfterInitialization方法中调用了postProcessAfterInitialization方法。
@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessAfterInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
调用链如下图所示:
[Task] : create [MessageBeanPostProcess - Before(Application.Task)] : 1 [Task - afterPropertiesSet] : ok [Task - initMethod] : ok [MessageBeanPostProcess - After(Application.Task)] : 2
[Task] : create是调用Task类的构造器输出的。
这两行输出和上面是类似,都是调用了postProcessBeforeInitialization方法和postProcessAfterInitialization方法。
[MessageBeanPostProcess - Before(Application.Task)] : 1 [MessageBeanPostProcess - After(Application.Task)] : 2
因为Task类实现了InitializingBean接口,并且在定义该bean时也指定了初始化方法。因此这一行会被执行:
invokeInitMethods(beanName, wrappedBean, mbd);
invokeInitMethods方法:
protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd)
throws Throwable {
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isTraceEnabled()) {
logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
}
if (System.getSecurityManager() != null) {
try {
AccessController.doPrivileged((PrivilegedExceptionAction
很显然会调用afterPropertiesSet方法和invokeCustomInitMethod方法,而Task类实现了InitializingBean接口的afterPropertiesSet方法,因此会输出[Task - afterPropertiesSet] : ok。
而在invokeCustomInitMethod方法中会调用bean定义中设置的initMethod方法(通过合并的BeanDefinition获取initMethodName,再通过反射调用)。
protected void invokeCustomInitMethod(String beanName, Object bean, RootBeanDefinition mbd)
throws Throwable {
// 通过合并的BeanDefinition获取initMethodName
String initMethodName = mbd.getInitMethodName();
Assert.state(initMethodName != null, "No init method set");
// 反射获得bean类中命名为initMethodName的Method
Method initMethod = (mbd.isNonPublicAccessAllowed() ?
BeanUtils.findMethod(bean.getClass(), initMethodName) :
ClassUtils.getMethodIfAvailable(bean.getClass(), initMethodName));
if (initMethod == null) {
if (mbd.isEnforceInitMethod()) {
throw new BeanDefinitionValidationException("Could not find an init method named '" +
initMethodName + "' on bean with name '" + beanName + "'");
}
else {
if (logger.isTraceEnabled()) {
logger.trace("No default init method named '" + initMethodName +
"' found on bean with name '" + beanName + "'");
}
return;
}
}
if (logger.isTraceEnabled()) {
logger.trace("Invoking init method '" + initMethodName + "' on bean with name '" + beanName + "'");
}
// 如果可能,为给定的方法句柄确定相应的接口方法
Method methodToInvoke = ClassUtils.getInterfaceMethodIfPossible(initMethod);
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction
因此也会输出[Task - initMethod] : ok。
正好符合上面说的bean生命周期中的第11-14步骤。
- BeanPostProcessors的postProcessBeforeInitialization方法。
- InitializingBean的afterPropertiesSet方法。
- 自定义初始化方法(bean定义中设置的initMethod)。
- BeanPostProcessors的postProcessAfterInitialization方法。
默认的bean定义中,懒加载是关闭的,也就是说会立即加载没有将lazyInit属性设置为true的bean。
因此执行下面这一行,就几乎将所有的bean创建好了:
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Application.class);
但MessageServiceImpl实例(它本身没有BeanDefinition,只是通过MessageServiceFactoryBean类的各种方法来确认配置信息,比如作用域)没有被立即创建,因为MessageServiceFactoryBean类的isSingleton方法返回false:
@Override
public boolean isSingleton() {
return false;
}
因此执行这一行时,MessageServiceImpl实例才会被创建:
IMessageService messageServiceBean = (IMessageService) applicationContext.getBean("myFactoryBean");
而MessageServiceImpl实例的创建过程和其他bean是不一样的,因为它是通过MessageServiceFactoryBean类的getObject方法来完成创建的。
这两行是调用MessageServiceFactoryBean类的getObject方法以及MessageServiceImpl类的构造器输出的。
[MessageServiceFactoryBean] : getObject [MessageServiceImpl] : init
在创建MessageServiceImpl实例时,会调用FactoryBeanRegistrySupport抽象类的getObjectFromFactoryBean方法:
protected Object getObjectFromFactoryBean(FactoryBean> factory, String beanName, boolean shouldPostProcess) {
if (factory.isSingleton() && containsSingleton(beanName)) {
synchronized (getSingletonMutex()) {
Object object = this.factoryBeanObjectCache.get(beanName);
if (object == null) {
// 从FactoryBean中获取对象
object = doGetObjectFromFactoryBean(factory, beanName);
Object alreadyThere = this.factoryBeanObjectCache.get(beanName);
if (alreadyThere != null) {
object = alreadyThere;
}
else {
if (shouldPostProcess) {
if (isSingletonCurrentlyInCreation(beanName)) {
return object;
}
// 单例创建之前的回调
beforeSingletonCreation(beanName);
try {
// 对从FactoryBean获得的给定对象进行后处理
object = postProcessObjectFromFactoryBean(object, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(beanName,
"Post-processing of FactoryBean's singleton object failed", ex);
}
finally {
// 创建单例后回调
afterSingletonCreation(beanName);
}
}
if (containsSingleton(beanName)) {
this.factoryBeanObjectCache.put(beanName, object);
}
}
}
return object;
}
}
else {
// 从FactoryBean中获取对象
Object object = doGetObjectFromFactoryBean(factory, beanName);
if (shouldPostProcess) {
try {
// 对从FactoryBean获得的给定对象进行后处理
object = postProcessObjectFromFactoryBean(object, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);
}
}
return object;
}
}
很显然通过调用doGetObjectFromFactoryBean方法可以调用MessageServiceFactoryBean类的getObject方法:
private Object doGetObjectFromFactoryBean(FactoryBean> factory, String beanName) throws BeanCreationException {
Object object;
try {
if (System.getSecurityManager() != null) {
AccessControlContext acc = getAccessControlContext();
try {
// 调用factory的getObject方法
object = AccessController.doPrivileged((PrivilegedExceptionAction) factory::getObject, acc);
}
catch (PrivilegedActionException pae) {
throw pae.getException();
}
}
else {
// 调用factory的getObject方法
object = factory.getObject();
}
}
catch (FactoryBeanNotInitializedException ex) {
throw new BeanCurrentlyInCreationException(beanName, ex.toString());
}
catch (Throwable ex) {
throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
}
if (object == null) {
if (isSingletonCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(
beanName, "FactoryBean which is currently in creation returned null from getObject");
}
object = new NullBean();
}
return object;
}
而通过调用postProcessObjectFromFactoryBean方法,会间接调用postProcessAfterInitialization方法:
@Override
protected Object postProcessObjectFromFactoryBean(Object object, String beanName) {
return applyBeanPostProcessorsAfterInitialization(object, beanName);
}
@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessAfterInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
这里不会调用postProcessBeforeInitialization方法(FactoryBean自定义了创建bean的流程,是不是就不需要postProcessBeforeInitialization方法进行处理了?但为什么需要postProcessAfterInitialization方法?大家可以好好想想,每个人有不一样的理解),因此输出只有这一行:
[MessageBeanPostProcess - After(MessageServiceImpl)] : (ITKaven)Hello Spring
Task task = (Task) applicationContext.getBean("myTask");
System.out.println("taskCount: " + task.addTask());
System.out.println("BeanDefinitionCount: " + applicationContext.getBeanDefinitionCount());
Arrays.stream(applicationContext.getBeanDefinitionNames()).forEach(System.out::println);
上面这几行代码会输出:
taskCount: 3 BeanDefinitionCount: 8 org.springframework.context.annotation.internalConfigurationAnnotationProcessor org.springframework.context.annotation.internalAutowiredAnnotationProcessor org.springframework.context.event.internalEventListenerProcessor org.springframework.context.event.internalEventListenerFactory application myFactoryBean messageBeanPostProcess myTask
最后一行会注销myTask bean。
applicationContext.getBeanFactory().destroyBean("myTask", task);
MessageBeanPostProcess类实现了DestructionAwareBeanPostProcessor接口的postProcessBeforeDestruction方法、Task类实现了DisposableBean接口的destroy方法以及在定义myTask bean时指定了destroyMethod属性(Task类的destroyMethod方法),在注销bean之前,这些方法会被调用。
会调用DisposableBeanAdapter类的destroy方法:
@Override
public void destroy() {
// 存在beanPostProcessors
if (!CollectionUtils.isEmpty(this.beanPostProcessors)) {
for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {
// 调用DestructionAwareBeanPostProcessor实现类的postProcessBeforeDestruction方法
processor.postProcessBeforeDestruction(this.bean, this.beanName);
}
}
// 是否需要调用DisposableBean的destroy方法
if (this.invokeDisposableBean) {
if (logger.isTraceEnabled()) {
logger.trace("Invoking destroy() on bean with name '" + this.beanName + "'");
}
try {
if (System.getSecurityManager() != null) {
// 调用DisposableBean实现类的destroy方法
AccessController.doPrivileged((PrivilegedExceptionAction) () -> {
((DisposableBean) this.bean).destroy();
return null;
}, this.acc);
}
else {
// 调用DisposableBean实现类的destroy方法
((DisposableBean) this.bean).destroy();
}
}
catch (Throwable ex) {
String msg = "Invocation of destroy method failed on bean with name '" + this.beanName + "'";
if (logger.isDebugEnabled()) {
logger.warn(msg, ex);
}
else {
logger.warn(msg + ": " + ex);
}
}
}
// 通过反射调用自定义的destroyMethod
if (this.destroyMethod != null) {
invokeCustomDestroyMethod(this.destroyMethod);
}
else if (this.destroyMethodName != null) {
Method methodToInvoke = determineDestroyMethod(this.destroyMethodName);
if (methodToInvoke != null) {
invokeCustomDestroyMethod(ClassUtils.getInterfaceMethodIfPossible(methodToInvoke));
}
}
}
因此会输出这3行:
[MessageBeanPostProcess - postProcessBeforeDestruction]class com.kaven.Application$Task [Task - destroy] : ok [Task - destroyMethod] : ok
这和bean生命周期的第15-17步正好对应:
- DestructionAwareBeanPostProcessors的postProcessBeforeDestruction方法。
- DisposableBean的destroy方法。
- 自定义销毁方法(bean定义中设置的destroyMethod)。
阅读源码需要耐心,一步步进行Debug,每个人的理解不同,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。



