Java Spring Bean

简要

Spring是一个IOC容器框架,拥有DI依赖注入(Dependency Injection),DL依赖查找(Dependency Lookup)等功能。
下边是根据源码分析出四个阶段,做出的生命周期解读:

  1. 注册阶段
  2. 实例化阶段
  3. 初始化阶段
  4. 销毁阶段

2021-05-03-10-54-29-611324.png

注册阶段

注册阶段主要任务是通过各种BeanDefinitionReader读取扫描各种配置来源信息(xml文件、注解等),并转换为BeanDefinition的过程。
BeanDefinition可以理解为类的定义,描述一个类的基本情况,比较像我们注册某些网站时的基本信息,比如需要填写姓名、住址、出生日期等。
最终会将扫描到的类整体注册到一个DefaultListableBeanFactoryMap容器中,便于之后获取使用。

  1. public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
  2. //存储注册信息的BeanDefinition
  3. private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
  4. //beanDefinitionMap的数据结构是ConcurrentHashMap,因此不能保证顺序,为了记录注册的顺序,这里使用了ArrayList类型beanDefinitionNames用来记录注册顺序
  5. private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
  6. //省略部分代码.......
  7. @Override
  8. public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException {
  9. //省略判断代码.......
  10. // Still in startup registration phase
  11. this.beanDefinitionMap.put(beanName, beanDefinition);
  12. this.beanDefinitionNames.add(beanName);
  13. }
  14. }

实例化阶段

在实例化阶段,Spring主要将BeanDefinition转换为实例Bean,并放在包装类BeanWrapper中。
无论是否设置Bean的懒加载方式,最后都会通过AbstractBeanFactory.getBean()方法进行实例化,并进入到AbstractAutowireCapableBeanFactory.createBean()方法。

  1. public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {
  2. //省略部分代码......
  3. @Nullable
  4. protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
  5. Object bean = null;
  6. if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
  7. // Make sure bean class is actually resolved at this point.
  8. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  9. Class<?> targetType = determineTargetType(beanName, mbd);
  10. if (targetType != null) {
  11. //实例化前处理器
  12. bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
  13. if (bean != null) {
  14. //实例化后处理器
  15. bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
  16. }
  17. }
  18. }
  19. mbd.beforeInstantiationResolved = (bean != null);
  20. }
  21. return bean;
  22. }
  23. //省略部分代码......
  24. }

在实例化阶段AbstractAutowireCapableBeanFactory.createBeanInstance()完成Bean的创建,并放到BeanWrapper中。

初始化阶段

初始化阶段主要是在返回Bean之前做一些处理,主要由AbstractAutowireCapableBeanFactory.initializeBean()方法实现。

  1. public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {
  2. //省略部分代码......
  3. //真正创建Bean的方法
  4. protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
  5. throws BeanCreationException {
  6. //省略部分代码......
  7. // Initialize the bean instance.
  8. //Bean对象的初始化,依赖注入在此触发
  9. //这个exposedObject在初始化完成之后返回作为依赖注入完成后的Bean
  10. Object exposedObject = bean;
  11. try {
  12. //将Bean实例对象封装,并且Bean定义中配置的属性值赋值给实例对象
  13. populateBean(beanName, mbd, instanceWrapper);
  14. //初始化Bean对象
  15. exposedObject = initializeBean(beanName, exposedObject, mbd);
  16. }
  17. catch (Throwable ex) {
  18. if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
  19. throw (BeanCreationException) ex;
  20. }
  21. else {
  22. throw new BeanCreationException(
  23. mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
  24. }
  25. }
  26. //省略部分代码......
  27. return exposedObject;
  28. }
  29. //初始容器创建的Bean实例对象,为其添加BeanPostProcessor后置处理器
  30. protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
  31. //JDK的安全机制验证权限
  32. if (System.getSecurityManager() != null) {
  33. //实现PrivilegedAction接口的匿名内部类
  34. AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
  35. invokeAwareMethods(beanName, bean);
  36. return null;
  37. }, getAccessControlContext());
  38. }
  39. else {
  40. //为Bean实例对象包装相关属性,如名称,类加载器,所属容器等信息
  41. invokeAwareMethods(beanName, bean);
  42. }
  43. Object wrappedBean = bean;
  44. //对BeanPostProcessor后置处理器的postProcessBeforeInitialization
  45. //回调方法的调用,为Bean实例初始化前做一些处理
  46. if (mbd == null || !mbd.isSynthetic()) {
  47. wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
  48. }
  49. //调用Bean实例对象初始化的方法,这个初始化方法是在Spring Bean定义配置
  50. //文件中通过init-method属性指定的
  51. try {
  52. invokeInitMethods(beanName, wrappedBean, mbd);
  53. }
  54. catch (Throwable ex) {
  55. throw new BeanCreationException(
  56. (mbd != null ? mbd.getResourceDescription() : null),
  57. beanName, "Invocation of init method failed", ex);
  58. }
  59. //对BeanPostProcessor后置处理器的postProcessAfterInitialization
  60. //回调方法的调用,为Bean实例初始化之后做一些处理
  61. if (mbd == null || !mbd.isSynthetic()) {
  62. wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
  63. }
  64. return wrappedBean;
  65. }
  66. //省略部分代码......
  67. }

销毁阶段

一般是在ApplicationContext关闭的时候调用,也就是AbstractApplicationContext.close()方法。
在注册的时候Spring通过适配器模式包装了一个类DisposableBeanAdapter,在销毁阶段的时候会获得这个类,进而调用到DisposableBeanAdapter.destroy()方法:

  1. class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable {
  2. //省略部分代码......
  3. @Override
  4. public void destroy() {
  5. if (!CollectionUtils.isEmpty(this.beanPostProcessors)) {
  6. for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {
  7. processor.postProcessBeforeDestruction(this.bean, this.beanName);
  8. }
  9. }
  10. if (this.invokeDisposableBean) {
  11. if (logger.isDebugEnabled()) {
  12. logger.debug("Invoking destroy() on bean with name '" + this.beanName + "'");
  13. }
  14. try {
  15. if (System.getSecurityManager() != null) {
  16. AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
  17. ((DisposableBean) bean).destroy();
  18. return null;
  19. }, acc);
  20. }
  21. else {
  22. ((DisposableBean) bean).destroy();
  23. }
  24. }
  25. catch (Throwable ex) {
  26. String msg = "Invocation of destroy method failed on bean with name '" + this.beanName + "'";
  27. if (logger.isDebugEnabled()) {
  28. logger.warn(msg, ex);
  29. }
  30. else {
  31. logger.warn(msg + ": " + ex);
  32. }
  33. }
  34. }
  35. if (this.destroyMethod != null) {
  36. invokeCustomDestroyMethod(this.destroyMethod);
  37. }
  38. else if (this.destroyMethodName != null) {
  39. Method methodToCall = determineDestroyMethod(this.destroyMethodName);
  40. if (methodToCall != null) {
  41. invokeCustomDestroyMethod(methodToCall);
  42. }
  43. }
  44. }
  45. //省略部分代码......
  46. }

销毁阶段主要包括三个销毁途径,按照执行顺序:

  1. @PreDestroy注解,主要通过DestructionAwareBeanPostProcessor实现
  2. 实现DisposableBean接口,主要通过DisposableBean.destroy()实现
  3. 自定义销毁方DisposableBeanAdapter.invokeCustomDestroyMethod()实现