spring的bean创建过程

1.ThreadLocal.set bean创建之前将beanName的一些属性放进ThreadLocal,避免多线程创建bean导致问题,并发创建会抛BeanCurrentlyInCreationException异常

2.InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation bean创建之前的回调,如果该方法返回不为null则不进行bean的创建过程,完成到第12步

3.MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition bean创建之后的回调,处理bean的合并,如Autowire注释的处理器处理注入信息

4.InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation bean创建之后的回调,如果该方法返回true,则不会进行下一步————设置bean实例的属性值

5.InstantiationAwareBeanPostProcessor.postProcessPropertyValues 设置bean实例的属性值

6.BeanNameAware.setBeanName bean实现了BeanNameAware接口则会调用

7.BeanClassLoaderAware.setBeanClassLoader bean实现了BeanClassLoaderAware接口则会调用

8.BeanFactoryAware.setBeanFactory bean实现了BeanFactoryAware接口则会调用

9.BeanPostProcessor.postProcessBeforeInitialization 初始化方法调用之前的回调

10.InitializingBean.afterPropertiesSet 调用bean的初始化方法,bean实现了InitializingBean接口则会调用afterPropertiesSet方法,PostConstruct注释修饰的方法也会被当做初始化方法

11.BeanPostProcessor.postProcessAfterInitialization 初始化方法调用之后的回调

12.FactoryBean.getObject 如果返回的对象是FactoryBean,则进一步调用FactoryBean的getObject方法并最终返回此方法返回的对象,否则直接返回原对象

13.ThreadLocal.remove bean创建完成之后清空ThreadLocal

14.ConcurrentHashMap.put 如果是单例模式的bean的则放入map缓存类中

猜你喜欢

转载自www.cnblogs.com/xiao-tao/p/10305201.html