整体大致流程是:
1.new出对象
2.解析@Autowired@Resource@PostConstuct注解
3.设置属性
4.执行BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口实现方法
5.执行BeanPostProcessor的postProcessBeforeInitialization方法(执行@PostConstruct标注的方法)
6.执行InitializingBean接口实现类的afterPropertiesSet
7.执行自定义的init方法
8.执行BeanPostProcessor的applyBeanPostProcessorsAfterInitialization方法
9.解决循环依赖
具体流程梳理:
- 1.创建bean对象
- 2.调用MergedBeanDefinitionPostProcessors的实现类CommonAnnotationBeanPostProcessor的postProcessMergedBeanDefinition实现方法解析@PostContruct、@PreDestroy、@WebServiceRef、@Resource、注解
- 3.调用MergedBeanDefinitionPostProcessors的实现类AutowiredAnnotationBeanPostProcessor的的postProcessMergedBeanDefinition实现方法解析@Autowired注解
- 4.调用InstantiationAwareBeanPostProcessor的实现类的postProcessAfterInstantiation方法,确定某些类的是否要忽略属性的注入
- 5.调用InstantiationAwareBeanPostProcessor的实现类ImportAwareBeanPostProcessor(ConfigurationClassPostProcessor的内部类)的postProcessProperties方法为@Configuration标注的类生成的cglib的bean注入beanFactory
- 6.调用InstantiationAwareBeanPostProcessor的实现类CommonAnnotationBeanPostProcessor的postProcessProperties方法注入@Resource标注的属性值
- 7.调用InstantiationAwareBeanPostProcessor的实现类AutowiredAnnotationBeanPostProcessor的postProcessProperties的方法设置@Autowired标注的属性的值
- 8.执行BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
- 9.执行所有的BeanPostProcessor的postProcessBeforeInitialization方法,比如ApplicationContextAwareProcessor处理ApplicationContextAware的接口实现类的注入、CommonAnnotationBeanPostProcessor处理执行@PostContruct注解标注的方法
- 10.执行InitializingBean接口实现类的afterPropertiesSet
- 11.执行自定义的init方法
- 12.执行BeanPostProcessor的applyBeanPostProcessorsAfterInitialization方法
- 13.解决循环依赖问题
1.创建bean对象
2. 执行MergedBeanDefinitionPostProcessors,解析相关注解
-
执行CommonAnnotationBeanPostProcessor(这个BeanPostProcessor会解析@PostConstruct、@PreDestroy、@Resource)的postProcessMergedBeanDefinition方法,方法里面调用findLifecycleMetadata解析@PostConstruct注解,然后解析@PreDestroy注解;调用findResourceMetadata解析field、method上的@WebServiceRef、@Resource注解,
String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());InjectionMetadata metadata = buildResourceMetadata(clazz);this.injectionMetadataCache.put(cacheKey, metadata)
将生成的InjectionMetadata的缓存;调用InjectionMetadata的checkConfigMembers方法,找到@Resource注入的属性关联的是哪个类型的bean
-
执行AutowiredAnnotationBeanPostProcessor(这个BeanPostProcessor会解析@Autowired、@Value、@Inject、@Lookup注解,这里只解析@Autowired注解)的postProcessMergedBeanDefinition方法,方法里面调用findAutowiringMetadata方法解析field、method上的@Autowired注解,
String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());InjectionMetadata metadata = buildResourceMetadata(clazz);this.injectionMetadataCache.put(cacheKey, metadata)
将生成的InjectionMetadata的缓存;调用InjectionMetadata的checkConfigMembers方法,找到@Autowired注入的属性关联的是哪个类型的bean(这里的injectionMetadataCache跟CommonAnnotationBeanPostProcessor的injectionMetadataCache是两个不同的)
-
执行ApplicationListenerDetector的postProcessMergedBeanDefinition方法
3.将创建的还未经历完整生命周期的bean缓存为了解决可能存在的循环依赖问题
4.populateBean(beanName, mbd, instanceWrapper);填充属性
- 执行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法,是否跳过某些bean的属性注入,一般返回的true不跳过
- 执行InstantiationAwareBeanPostProcessor的postProcessProperties方法
- 执行ConfigurationClassPostProcessor的内部类ImportAwareBeanPostProcessor的postProcessProperties方法,如果当前bean是@Configuration标注的类对应生成的cglib代理类,那么就为该bean注入beanFactory
- 执行CommonAnnotationBeanPostProcessor的postProcessProperties的方法,方法里面调用findResourceMetadata方法,先去上一步解析好的injectionMetadataCache中根据beanName获取解析好的@Resourse信息,如果没有就解析field、method上的@WebServiceRef注解、@Resource注解然后放入injectionMetadataCache中。调用InjectMetadata的inject方法,给@Resource标注的属性赋值,如果当前需要的值是未创建的bean那么就调用CommonAnnotationBeanPostProcessor的内部类ResourceElement的getResourceToInject方法进而去创建该bean,然后再赋值
- 执行AutowiredAnnotationBeanPostProcessor的postProcessProperties的方法设置@Autowired标注的属性的值,步骤与@Resource的类似
- 执行ConfigurationClassPostProcessor的内部类ImportAwareBeanPostProcessor的postProcessProperties方法,如果当前bean是@Configuration标注的类对应生成的cglib代理类,那么就为该bean注入beanFactory
6.initializeBean(beanName, exposedObject, mbd)初始化bean
- 执行invokeAwareMethods,如果当前bean实现了BeanNameAware接口,调用当前类的setBeanName方法;如果当前bean实现类BeanClassLoaderAware接口,调用当前bean的setBeanClassLoader方法;如果当前类实现了BeanFactoryAware接口,调用当前bean的setBeanFactory方法
- 执行所有的BeanPostProcessor的postProcessBeforeInitialization方法
- 执行BeanPostProcessor的实现类ApplicationContextAwareProcessor的postProcessBeforeInitialization方法,在里面回调Aware接口的setXxx方法。依次判断当前bean是否实现EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware接口,实现了的话就调用实现的setXxx方法
- 执行WebApplicationContextServletContextAwareProcessor的父类ServletContextAwareProcessor的postProcessBeforeInitialization方法,判断当前bean是否实现了ServletContextAware、ServletConfigAware接口,实现了的话就调用当前bean实现的setXxx方法
- 执行ConfigurationClassPostProcessor的内部类ImportAwareBeanPostProcessor的postProcessBeforeInitialization方法,里面会判断当前bean是否实现了ImportAware,如果实现了就调用实现的setImportMetadata方法拿到当前bean所在的那个@Import那个注解里面所贴的那个类上所有的注解信息(ImportAware接口都是配合@Import接口使用的)。
例子: - 执行PostProcessorRegistrationDelegate的内部类BeanPostProcessorChecker的postProcessBeforeInitialization方法,里面其实没做啥
- 执行ConfigurationPropertiesBindingPostProcessor的postProcessBeforeInitialization方法,解析@ConfigurationProperties注解注入值
例子:
- 执行MethodValidationPostProcessor的postProcessBeforeInitialization方法
- 执行WebServerFactoryCustomizerBeanPostProcessor的postProcessBeforeInitialization方法
- 执行ErrorPageRegistrarBeanPostProcessor的postProcessBeforeInitialization方法
- 执行CommonAnnotationBeanPostProcessor的父类InitDestroyAnnotationBeanPostProcessor的postProcessBeforeInitialization方法,里面调用了InitDestroyAnnotationBeanPostProcessor的内部类LifecycleMetadata的invokeInitMethods方法,invokeInitMethods里面调用了内部类LifecycleElement的invoke方法。invoke里面利用反射调用了@PostConstruct标注的方法
- 调用AutowiredAnnotationBeanPostProcessor的父类InstantiationAwareBeanPostProcessorAdapter的postProcessBeforeInitialization方法,没做啥
- 调用ApplicationListenerDetector的postProcessBeforeInitialization方法
- 执行BeanPostProcessor的实现类ApplicationContextAwareProcessor的postProcessBeforeInitialization方法,在里面回调Aware接口的setXxx方法。依次判断当前bean是否实现EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware接口,实现了的话就调用实现的setXxx方法
- invokeInitMethods(beanName, wrappedBean, mbd),先判断当前bean是否实现了InitializingBean接口,若当前bean实现了InitializingBean接口,那么执行实现的afterPropertiesSet方法;再执行当前bean自定义的init方法。这里执行自定义方法的时候还会先判断自定义的那个init方法是否是上面InitializingBean的实现方法,如果是的话就不执行,避免执行两次
- wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);调用BeanPostProcessor的postProcessAfterInstantiation方法
- 执行ApplicationContexAwareProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
- 执行WebApplicationContextServletContextAwareProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
- 执行ConfigurationClassPostProcessor的内部类ImportAwareBeanPostProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
- 执行PostProcessorRegistrationDelegate的postProcessAfterInitialization方法
- 执行ConfigurationPropertiesBindingPostProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
- 执行MethodValidationPostProcessor的postProcessAfterInitialization方法,这个方法暂时是什么场景使用的还不知道
- 执行WebServerFactoryCustomizerBeanPostProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
- 执行ErrorPageRegistrarBeanPostProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
- 执行CommonAnnotationBeanPostProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
- 执行AutowiredAnnotationBeanPostProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
- 执行ApplicationListenerDetector的postProcessAfterInitialization方法,如果当前bean是ApplicationListener接口实现类,那么将当前bean添加到spring的listener容器中
7.解决循环依赖问题