栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Framework 源码阅读(四):BeanPostProcessor和Bean的生命周期

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Framework 源码阅读(四):BeanPostProcessor和Bean的生命周期

Spring framework 源码阅读(四):BeanPostProcessor和Bean的生命周期

在介绍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接口中有描述):

  1. BeanNameAware的setBeanName方法。
  2. BeanClassLoaderAware的setBeanClassLoader方法。
  3. BeanFactoryAware的setBeanFactory方法。
  4. EnvironmentAware的setEnvironment方法。
  5. EmbeddedValueResolverAware的setEmbeddedValueResolver方法。
  6. ResourceLoaderAware的setResourceLoader方法(仅在ApplicationContext中运行时适用)。
  7. ApplicationEventPublisherAware的setApplicationEventPublisher方法(仅在ApplicationContext中运行时适用)。
  8. MessageSourceAware的setMessageSource方法(仅在ApplicationContext中运行时适用)。
  9. ApplicationContextAware的setApplicationContext方法(仅在ApplicationContext中运行时适用)。
  10. ServletContextAware的setServletContext方法(仅在web ApplicationContext中运行时适用)。
  11. BeanPostProcessors的postProcessBeforeInitialization方法。
  12. InitializingBean的afterPropertiesSet方法。
  13. 自定义初始化方法(bean定义中的initMethod属性)。
  14. BeanPostProcessors的postProcessAfterInitialization方法。

在关闭bean工厂或者注销bean时,会执行以下生命周期方法:

  1. DestructionAwareBeanPostProcessors的postProcessBeforeDestruction方法。
  2. DisposableBean的destroy方法。
  3. 自定义销毁方法(bean定义中的destroyMethod属性)。

前10个步骤都是基于Aware接口及其实现类来完成的:

  • Spring framework 源码阅读(一):Aware接口及其实现类的作用

这篇博客会涉及到以下内容:

  • Spring framework 源码阅读(二):BeanDefinition的作用
  • Spring framework 源码阅读(三):认识FactoryBean
创建module

先在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) () -> {
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
		    // 调用aware methods
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
		    // 会间接调用postProcessorsBeforeInitialization方法
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
		    // 调用初始化方法
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}
		if (mbd == null || !mbd.isSynthetic()) {
		    // 会间接调用postProcessorsAfterInitialization方法
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}

		return wrappedBean;
	}
 

在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) () -> {
						((InitializingBean) bean).afterPropertiesSet();
						return null;
					}, getAccessControlContext());
				}
				catch (PrivilegedActionException pae) {
					throw pae.getException();
				}
			}
			else {
				((InitializingBean) bean).afterPropertiesSet();
			}
		}

		if (mbd != null && bean.getClass() != NullBean.class) {
			String initMethodName = mbd.getInitMethodName();
			if (StringUtils.hasLength(initMethodName) &&
					!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
					!mbd.isExternallyManagedInitMethod(initMethodName)) {
				invokeCustomInitMethod(beanName, bean, mbd);
			}
		}
	}
 

很显然会调用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) () -> {
				ReflectionUtils.makeAccessible(methodToInvoke);
				return null;
			});
			try {
			    // 调用bean实例上此Method对象表示的基础方法
				AccessController.doPrivileged((PrivilegedExceptionAction)
						() -> methodToInvoke.invoke(bean), getAccessControlContext());
			}
			catch (PrivilegedActionException pae) {
				InvocationTargetException ex = (InvocationTargetException) pae.getException();
				throw ex.getTargetException();
			}
		}
		else {
			try {
				ReflectionUtils.makeAccessible(methodToInvoke);
				// 调用bean实例上此Method对象表示的基础方法
				methodToInvoke.invoke(bean);
			}
			catch (InvocationTargetException ex) {
				throw ex.getTargetException();
			}
		}
	}
 

因此也会输出[Task - initMethod] : ok。

正好符合上面说的bean生命周期中的第11-14步骤。

  1. BeanPostProcessors的postProcessBeforeInitialization方法。
  2. InitializingBean的afterPropertiesSet方法。
  3. 自定义初始化方法(bean定义中设置的initMethod)。
  4. 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步正好对应:

  1. DestructionAwareBeanPostProcessors的postProcessBeforeDestruction方法。
  2. DisposableBean的destroy方法。
  3. 自定义销毁方法(bean定义中设置的destroyMethod)。

阅读源码需要耐心,一步步进行Debug,每个人的理解不同,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号