Spring 普通Bean的实例化过程
2021-04-16 14:47:18 0 举报
Spring Bean实例化过程
作者其他创作
大纲/内容
#postProcessBeforeInstantiation
④InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
⑦
没有带有@Autowired的构造函数,则使用默认的构造函数
⑦BeanPostProcessor#postProcessBeforeInitialization
3
DefaultSingletonBeanRegistry#getSingleton
bean初始化前后,对bean产生影响
#postProcessPropertyValues
#postProcessAfterInitialization
②
#postProcessMergedBeanDefinition
无
是FactoryBean
#postProcessBeforeInitialization
#getEarlyRenference
⑧
判断bean是否是EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware类型,如果是则invokeAwareInterfaces(bean);
有InstantiationAwareBeanPostProcessor子类存在,则执行他们的postProcessBeforeInitialization。如果直接生成了bean,则在调用postProcessAfterInitialization。最终直接返回bean
CommonAnnotationBeanPostProcessor和AutowiredAnnotationBeanPostProcessor都是他的子类但未重写postProcessBeforeInitialization()方法。但是AOP的bean后置处理器AbstractAutoProxyCreator
Instantiation实例化
autowireConstructor
AbstractAutowireCapableBeanFactory#createBean
AbstractBeanFactory#doGetBean
1
createBeanInstance确定bean的构造方法并实例化。并封装成BeanWrapper对象
#postProcessAfterInstantiation
return beanInstance;
2
initializeBean
啥也没干
AutowiredAnnotationBeanPostProcessor1、字段上的@Autowired、@Inject、@Value。分别调用各自的AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#inject2、方法上的@PostConstruct、@PreDestroy。分别调用各自的AutowiredAnnotationBeanPostProcessor.AutowiredMethodElement#injectCommonAnnotaionBeanPostProcessor调用InjectionMetadata.InjectedElement#inject最终都是通过beanFactory.getBean()获取,进行注入
单例池中没有
AbstractAutoProxyCreator
④
InstantiationAwareBeanPostProcessor
标记bean正在创建
2、执行这些InjectedElement的inject()方法完成注入
单例池加锁,并从单例池获取一次bean
③
⑤
确保类在这里已经得到实际的解析
从一级缓存(单例池)中获取一次bean
return bean
有
⑧BeanPostProcessor#postProcessAfterInitialization
#determineCandiateConstructots
①
ConfigurationClassPostProcessor.ImportAwareBeanPostProcessor
1、由父类收集所有加了@PostConstruct和@PreDestroy注解的方法,封装成LifecycleElement,放入lifecycleMetadataCache这个Map集合中
AuerJds
#restBeanDefinition
⑥
#postProcessBeforeDestruction
#postProcessProperties
做一些校验,并将beanName放入singletonsCurrentlyInCreation中
如果mbd,标记autowired为byName/byName。如果有属性需要注入,那么就会触发beanFactory.getBean()
由于@Configuration标记的类,会在enhanceConfigurationClasses()方法中生成动态代理。在这个方法中判断是不是EnhancedConfiguration的子类,注入beanFactory
resolveBeforeInstantiation
1、通过findAutowiringMetadata()方法,查找所有加了@Autowired、@Value、@Inject注解的方法和字段,分别封装成InjectionMetadata.InjectedElement。将这些InjectedElement都放入InjectionMetadata,最终放入injectionMetadataCache
调用#postProcessProperties
4
ApplicationContextAwareProcessor
registerDisposableBeanIfNecessary
2、执行这个InjectionMetadata的inject
doCreateBean
BeanPostProcessor
没有parentBeanFactory
FactoryBean实例化过程
如果⑤没有获取到PropertyValues,则调用⑥InstantiationAwareBeanPostProcessor#postProcessPropertyValues
invokeAwareMethods
populateBean
#predictBeanType
singletonFactory.getObject();
2、调用findResourceMetadata()方法查找所有加了@Resource、@EJB、@WebServiceRef的字段和方法,分别封装成LookupElement对应的子类,放入currElements,再放入到InjectionMetadata中,最终也同样放入到injectionMetadataCache这个集合中
SmartInstantiationAwareBeanPostProcessor
getBean
非FactoryBean
是否仅是类型检查
#requiresDestruction
合并beanDefinition并检查
afterSingletonCreation(beanName);
生成代理对象
AbstractAutowireCapableBeanFactory#doCreateBean
1、对@Lookup注解的支持,解析Lookup并放入到BD中
AutowiredAnnotationBeanPostProcessor
1、同样调用findResourceMetadata()方法找出所有的InjectionMetadata
invokeInitMethods,调用bean的生命周期回调方法init
bean实例化前后,对bean的实例化产生影响
instantiateBean
获取dependOn的bean
是否有DependsOn
return singletonObject;
判断是否存在InstantiationAwareBeanPostProcessor的子类,执行它们的postProcessAfterInstantiation
#determineCandiateConstructors
缓存中存在
CommonAnnotationBeanPostProcessor
匿名对象的getObject(),调用createBean
return exposedObject;
DefaultListableBeanFactory#preInstantiateSingletons
非抽象类、单例的、非延迟初始化的
Initialization初始化
⑤InstantiationAwareBeanPostProcessor#postProcessProperties
纵观bean的生命周期,整个过程就根据BeanDefinition进行bean实例化到bean的初始化。这和jvm根据Class对象,完成类对象的实例化再到初始化过程基本一致。
如果有自定义的customTargetSourceCreators,则会生成代理实例对象
beanWrapper仍为null
determineConstructorsFromBeanPostProcessors判断是否存在有@Autowired注解的构造函数
5
通过findAutowiringMetadata()方法,查找所有加了@Autowired、@Value、@Inject注解的方法和字段,分别封装成InjectionMetadata.InjectedElement。将这些InjectedElement都放入InjectionMetadata,最终放入injectionMetadataCache
③MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
DestructionAwareBeanPostProcessor
如果bean是ImportAware类型,那么注入
从bd属性中获知是否是单例。从factoryBeancache中获取beanWrapper
applyMergedBeanDefinitionPostProcessors
MergedBeanDefinitionBeanPostProcessor
②SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
parentBeanFactory中如果已经实例化beanName,则return bean
2、查找所有存在@Autowired的构造函数。
private void invokeAwareInterfaces(Object bean) { if (bean instanceof EnvironmentAware) { ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment()); } if (bean instanceof EmbeddedValueResolverAware) { ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver); } if (bean instanceof ResourceLoaderAware) { ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext); } if (bean instanceof ApplicationEventPublisherAware) { ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext); } if (bean instanceof MessageSourceAware) { ((MessageSourceAware) bean).setMessageSource(this.applicationContext); } if (bean instanceof ApplicationContextAware) { ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext); } }
是否有parentBeanFactory
判断是否存在MergedBeanDefinitionPostProcessor的子类,执行它们的postProcessMergedBeanDefinition()
收藏
0 条评论
下一页