bean的实例化
核心方法AbstractApplicationContext#refresh()1. invokeBeanFactoryPostProcessors(beanFactory);1.1 AbstractApplicationContext#invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)1.2 PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List< BeanFactoryPostProcessor> beanFactoryPostProcessors)
2. registerBeanPostProcessors(beanFactory);2.1 AbstractApplicationContext#registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory)2.2 PostProcessorRegistrationDelegate#registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext)2.3 PostProcessorRegistrationDelegate#registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, List< BeanPostProcessor> postProcessors)
3. finishBeanFactoryInitialization(beanFactory);3.1 AbstractApplicationContext#finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)3.2 DefaultListableBeanFactory#preInstantiateSingletons()3.3 AbstractBeanFactory#getBean(String name)3.4 AbstractBeanFactory#doGetBean(final String name, @Nullable final Class requiredType,@Nullable final Object[] args, boolean typeCheckOnly)3.5 DefaultSingletonBeanRegistry#getSingleton(String beanName, ObjectFactory<?> singletonFactory)3.6 DefaultSingletonBeanRegistry#beforeSingletonCreation(String beanName)3.7 回到3.4步 doGetBean(),AbstractAutowireCapableBeanFactory#createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)3.8 AbstractAutowireCapableBeanFactory#doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)3.9 AbstractAutowireCapableBeanFactory#createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)3.10 AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName)3.11 回到3.9步 createBeanInstance方法,AbstractAutowireCapableBeanFactory#autowireConstructor(beanName, mbd, ctors, args)3.12 回到3.9步 createBeanInstance方法,AbstractAutowireCapableBeanFactory#instantiateBean(beanName, mbd);3.13 回到3.8步doCreateBean(),AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);3.14 CommonAnnotationBeanPostProcessor#postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)3.15 CommonAnnotationBeanPostProcessor#findResourceMetadata(String beanName, final Class<?> clazz, @Nullable PropertyValues pvs)3.16 回到3.13步, AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)搜集过程总结3.17 回到3.8步doCreateBean(),AbstractAutowireCapableBeanFactory#populateBean(beanName, mbd, instanceWrapper);3.18 AutowiredAnnotationBeanPostProcessor#postProcessProperties(PropertyValues pvs, Object bean, String beanName)3.19 InjectionMetadata#inject(Object target, @Nullable String beanName, @Nullable PropertyValues pvs)3.20 AutowiredAnnotationBeanPostProcessor#inject(Object bean, @Nullable String beanName, @Nullable PropertyValues pvs)3.21 回到3.8步doCreateBean()方法,AbstractAutowireCapableBeanFactory#initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd)3.22 AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)3.23 AbstractAutowireCapableBeanFactory#invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)initializeBean()内调用过程总结3.24 回到3.8步doCreateBean()方法,AbstractBeanFactory#registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd)
总结
核心方法AbstractApplicationContext#refresh()
public void refresh() throws BeansException
, IllegalStateException
{
synchronized (this.startupShutdownMonitor
) {
prepareRefresh();
ConfigurableListableBeanFactory beanFactory
= obtainFreshBeanFactory();
prepareBeanFactory(beanFactory
);
try {
postProcessBeanFactory(beanFactory
);
invokeBeanFactoryPostProcessors(beanFactory
);
registerBeanPostProcessors(beanFactory
);
initMessageSource();
initApplicationEventMulticaster();
onRefresh();
registerListeners();
finishBeanFactoryInitialization(beanFactory
);
finishRefresh();
}
catch (BeansException ex
) {
if (logger
.isWarnEnabled()) {
logger
.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex
);
}
destroyBeans();
cancelRefresh(ex
);
throw ex
;
}
finally {
resetCommonCaches();
}
}
}
1. invokeBeanFactoryPostProcessors(beanFactory);
完成对BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor这两个接口的调用。 1、spring启动过程中完成对beanDefinition对象的新增或修改; 2、实现BeanDefinitionRegistryPostProcessor这个接口的类优先于其他类实例化。
1.1 AbstractApplicationContext#invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)
1.2 PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List< BeanFactoryPostProcessor> beanFactoryPostProcessors)
这里调用getBean()方法就可以实例化bean,所以才能优先于其他类实例化。BeanDefinitionRegistryPostProcessor 这个接口的调用分为三步: 1、调用实现了 PriorityOrdered 排序接口 2、调用实现了 Ordered 排序接口 3、没有实现接口的调用这个接口的理解:获取 BeanDefinitionRegistry 对象,获取到这个对象就可以获取这个对象中注册的所有 BeanDefinition 对象,拥有这个对象就可以完成里面所有 BeanDefinition 对象的修改或新增操作。
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory
, List
<BeanFactoryPostProcessor> beanFactoryPostProcessors
) {
Set
<String> processedBeans
= new HashSet<>();
if (beanFactory
instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry
= (BeanDefinitionRegistry
) beanFactory
;
List
<BeanFactoryPostProcessor> regularPostProcessors
= new ArrayList<>();
List
<BeanDefinitionRegistryPostProcessor> registryProcessors
= new ArrayList<>();
for (BeanFactoryPostProcessor postProcessor
: beanFactoryPostProcessors
) {
if (postProcessor
instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor
=
(BeanDefinitionRegistryPostProcessor
) postProcessor
;
registryProcessor
.postProcessBeanDefinitionRegistry(registry
);
registryProcessors
.add(registryProcessor
);
}
else {
regularPostProcessors
.add(postProcessor
);
}
}
List
<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors
= new ArrayList<>();
String
[] postProcessorNames
=
beanFactory
.getBeanNamesForType(BeanDefinitionRegistryPostProcessor
.class, true, false);
for (String ppName
: postProcessorNames
) {
if (beanFactory
.isTypeMatch(ppName
, PriorityOrdered
.class)) {
currentRegistryProcessors
.add(beanFactory
.getBean(ppName
, BeanDefinitionRegistryPostProcessor
.class));
processedBeans
.add(ppName
);
}
}
sortPostProcessors(currentRegistryProcessors
, beanFactory
);
registryProcessors
.addAll(currentRegistryProcessors
);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors
, registry
);
currentRegistryProcessors
.clear();
postProcessorNames
= beanFactory
.getBeanNamesForType(BeanDefinitionRegistryPostProcessor
.class, true, false);
for (String ppName
: postProcessorNames
) {
if (!processedBeans
.contains(ppName
) && beanFactory
.isTypeMatch(ppName
, Ordered
.class)) {
currentRegistryProcessors
.add(beanFactory
.getBean(ppName
, BeanDefinitionRegistryPostProcessor
.class));
processedBeans
.add(ppName
);
}
}
sortPostProcessors(currentRegistryProcessors
, beanFactory
);
registryProcessors
.addAll(currentRegistryProcessors
);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors
, registry
);
currentRegistryProcessors
.clear();
boolean reiterate
= true;
while (reiterate
) {
reiterate
= false;
postProcessorNames
= beanFactory
.getBeanNamesForType(BeanDefinitionRegistryPostProcessor
.class, true, false);
for (String ppName
: postProcessorNames
) {
if (!processedBeans
.contains(ppName
)) {
currentRegistryProcessors
.add(beanFactory
.getBean(ppName
, BeanDefinitionRegistryPostProcessor
.class));
processedBeans
.add(ppName
);
reiterate
= true;
}
}
sortPostProcessors(currentRegistryProcessors
, beanFactory
);
registryProcessors
.addAll(currentRegistryProcessors
);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors
, registry
);
currentRegistryProcessors
.clear();
}
invokeBeanFactoryPostProcessors(registryProcessors
, beanFactory
);
invokeBeanFactoryPostProcessors(regularPostProcessors
, beanFactory
);
}
else {
invokeBeanFactoryPostProcessors(beanFactoryPostProcessors
, beanFactory
);
}
String
[] postProcessorNames
=
beanFactory
.getBeanNamesForType(BeanFactoryPostProcessor
.class, true, false);
List
<BeanFactoryPostProcessor> priorityOrderedPostProcessors
= new ArrayList<>();
List
<String> orderedPostProcessorNames
= new ArrayList<>();
List
<String> nonOrderedPostProcessorNames
= new ArrayList<>();
for (String ppName
: postProcessorNames
) {
if (processedBeans
.contains(ppName
)) {
}
else if (beanFactory
.isTypeMatch(ppName
, PriorityOrdered
.class)) {
priorityOrderedPostProcessors
.add(beanFactory
.getBean(ppName
, BeanFactoryPostProcessor
.class));
}
else if (beanFactory
.isTypeMatch(ppName
, Ordered
.class)) {
orderedPostProcessorNames
.add(ppName
);
}
else {
nonOrderedPostProcessorNames
.add(ppName
);
}
}
sortPostProcessors(priorityOrderedPostProcessors
, beanFactory
);
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors
, beanFactory
);
List
<BeanFactoryPostProcessor> orderedPostProcessors
= new ArrayList<>();
for (String postProcessorName
: orderedPostProcessorNames
) {
orderedPostProcessors
.add(beanFactory
.getBean(postProcessorName
, BeanFactoryPostProcessor
.class));
}
sortPostProcessors(orderedPostProcessors
, beanFactory
);
invokeBeanFactoryPostProcessors(orderedPostProcessors
, beanFactory
);
List
<BeanFactoryPostProcessor> nonOrderedPostProcessors
= new ArrayList<>();
for (String postProcessorName
: nonOrderedPostProcessorNames
) {
nonOrderedPostProcessors
.add(beanFactory
.getBean(postProcessorName
, BeanFactoryPostProcessor
.class));
}
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors
, beanFactory
);
beanFactory
.clearMetadataCache();
}
2. registerBeanPostProcessors(beanFactory);
把实现了BeanPostProcessor接口的类实例化,并且加入到BeanFactory中(因为实现了BeanPostProcessor接口的类会优先实例化,所以要加入BeanFactory中)。
2.1 AbstractApplicationContext#registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory)
2.2 PostProcessorRegistrationDelegate#registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext)
public static void registerBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory
, AbstractApplicationContext applicationContext
) {
String
[] postProcessorNames
= beanFactory
.getBeanNamesForType(BeanPostProcessor
.class, true, false);
int beanProcessorTargetCount
= beanFactory
.getBeanPostProcessorCount() + 1 + postProcessorNames
.length
;
beanFactory
.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory
, beanProcessorTargetCount
));
List
<BeanPostProcessor> priorityOrderedPostProcessors
= new ArrayList<>();
List
<BeanPostProcessor> internalPostProcessors
= new ArrayList<>();
List
<String> orderedPostProcessorNames
= new ArrayList<>();
List
<String> nonOrderedPostProcessorNames
= new ArrayList<>();
for (String ppName
: postProcessorNames
) {
if (beanFactory
.isTypeMatch(ppName
, PriorityOrdered
.class)) {
BeanPostProcessor pp
= beanFactory
.getBean(ppName
, BeanPostProcessor
.class);
priorityOrderedPostProcessors
.add(pp
);
if (pp
instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors
.add(pp
);
}
}
else if (beanFactory
.isTypeMatch(ppName
, Ordered
.class)) {
orderedPostProcessorNames
.add(ppName
);
}
else {
nonOrderedPostProcessorNames
.add(ppName
);
}
}
sortPostProcessors(priorityOrderedPostProcessors
, beanFactory
);
registerBeanPostProcessors(beanFactory
, priorityOrderedPostProcessors
);
List
<BeanPostProcessor> orderedPostProcessors
= new ArrayList<>();
for (String ppName
: orderedPostProcessorNames
) {
BeanPostProcessor pp
= beanFactory
.getBean(ppName
, BeanPostProcessor
.class);
orderedPostProcessors
.add(pp
);
if (pp
instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors
.add(pp
);
}
}
sortPostProcessors(orderedPostProcessors
, beanFactory
);
registerBeanPostProcessors(beanFactory
, orderedPostProcessors
);
List
<BeanPostProcessor> nonOrderedPostProcessors
= new ArrayList<>();
for (String ppName
: nonOrderedPostProcessorNames
) {
BeanPostProcessor pp
= beanFactory
.getBean(ppName
, BeanPostProcessor
.class);
nonOrderedPostProcessors
.add(pp
);
if (pp
instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors
.add(pp
);
}
}
registerBeanPostProcessors(beanFactory
, nonOrderedPostProcessors
);
sortPostProcessors(internalPostProcessors
, beanFactory
);
registerBeanPostProcessors(beanFactory
, internalPostProcessors
);
beanFactory
.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext
));
}
2.3 PostProcessorRegistrationDelegate#registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, List< BeanPostProcessor> postProcessors)
BeanPostProcessors注册到BeanFactory
判断beanPostProcessor是不是InstantiationAwareBeanPostProcessor接口类型的,如果是就设置变量hasInstantiationAwareBeanPostProcessors=true,这个变量后面会用到;判断beanPostProcessor是不是DestructionAwareBeanPostProcessor接口类型的,如果是就设置变量hasDestructionAwareBeanPostProcessors=true;把beanPostProcessor添加到beanPostProcessors集合中(里面保存了所有的beanPostProcessor)
3. finishBeanFactoryInitialization(beanFactory);
1、bean实例化过程 2、ioc 3、注解支持 4、BeanPostProcessor的执行 5、Aop的入口
3.1 AbstractApplicationContext#finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory
) {
if (beanFactory
.containsBean(CONVERSION_SERVICE_BEAN_NAME
) &&
beanFactory
.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME
, ConversionService
.class)) {
beanFactory
.setConversionService(
beanFactory
.getBean(CONVERSION_SERVICE_BEAN_NAME
, ConversionService
.class));
}
if (!beanFactory
.hasEmbeddedValueResolver()) {
beanFactory
.addEmbeddedValueResolver(strVal
-> getEnvironment().resolvePlaceholders(strVal
));
}
String
[] weaverAwareNames
= beanFactory
.getBeanNamesForType(LoadTimeWeaverAware
.class, false, false);
for (String weaverAwareName
: weaverAwareNames
) {
getBean(weaverAwareName
);
}
beanFactory
.setTempClassLoader(null
);
beanFactory
.freezeConfiguration();
beanFactory
.preInstantiateSingletons();
}
3.2 DefaultListableBeanFactory#preInstantiateSingletons()
具体实例化过程
public void preInstantiateSingletons() throws BeansException
{
if (logger
.isTraceEnabled()) {
logger
.trace("Pre-instantiating singletons in " + this);
}
List
<String> beanNames
= new ArrayList<>(this.beanDefinitionNames
);
for (String beanName
: beanNames
) {
RootBeanDefinition bd
= getMergedLocalBeanDefinition(beanName
);
if (!bd
.isAbstract() && bd
.isSingleton() && !bd
.isLazyInit()) {
if (isFactoryBean(beanName
)) {
Object bean
= getBean(FACTORY_BEAN_PREFIX
+ beanName
);
if (bean
instanceof FactoryBean) {
final FactoryBean
<?> factory
= (FactoryBean
<?>) bean
;
boolean isEagerInit
;
if (System
.getSecurityManager() != null
&& factory
instanceof SmartFactoryBean) {
isEagerInit
= AccessController
.doPrivileged((PrivilegedAction
<Boolean>)
((SmartFactoryBean
<?>) factory
)::isEagerInit
,
getAccessControlContext());
}
else {
isEagerInit
= (factory
instanceof SmartFactoryBean &&
((SmartFactoryBean
<?>) factory
).isEagerInit());
}
if (isEagerInit
) {
getBean(beanName
);
}
}
}
else {
getBean(beanName
);
}
}
}
for (String beanName
: beanNames
) {
Object singletonInstance
= getSingleton(beanName
);
if (singletonInstance
instanceof SmartInitializingSingleton) {
final SmartInitializingSingleton smartSingleton
= (SmartInitializingSingleton
) singletonInstance
;
if (System
.getSecurityManager() != null
) {
AccessController
.doPrivileged((PrivilegedAction
<Object>) () -> {
smartSingleton
.afterSingletonsInstantiated();
return null
;
}, getAccessControlContext());
}
else {
smartSingleton
.afterSingletonsInstantiated();
}
}
}
}
3.3 AbstractBeanFactory#getBean(String name)
3.4 AbstractBeanFactory#doGetBean(final String name, @Nullable final Class requiredType,@Nullable final Object[] args, boolean typeCheckOnly)
doGetBean要么从缓存中拿到对象,要么去createBean这个对象
protected <T> T
doGetBean(final String name
, @Nullable final Class
<T> requiredType
,
@Nullable final Object
[] args
, boolean typeCheckOnly
) throws BeansException
{
final String beanName
= transformedBeanName(name
);
System
.out
.println("====beanName=="+beanName
+"===instance begin====");
Object bean
;
Object sharedInstance
= getSingleton(beanName
);
if (sharedInstance
!= null
&& args
== null
) {
if (logger
.isTraceEnabled()) {
if (isSingletonCurrentlyInCreation(beanName
)) {
logger
.trace("Returning eagerly cached instance of singleton bean '" + beanName
+
"' that is not fully initialized yet - a consequence of a circular reference");
}
else {
logger
.trace("Returning cached instance of singleton bean '" + beanName
+ "'");
}
}
bean
= getObjectForBeanInstance(sharedInstance
, name
, beanName
, null
);
}
else {
if (isPrototypeCurrentlyInCreation(beanName
)) {
throw new BeanCurrentlyInCreationException(beanName
);
}
BeanFactory parentBeanFactory
= getParentBeanFactory();
if (parentBeanFactory
!= null
&& !containsBeanDefinition(beanName
)) {
String nameToLookup
= originalBeanName(name
);
if (parentBeanFactory
instanceof AbstractBeanFactory) {
return ((AbstractBeanFactory
) parentBeanFactory
).doGetBean(
nameToLookup
, requiredType
, args
, typeCheckOnly
);
}
else if (args
!= null
) {
return (T
) parentBeanFactory
.getBean(nameToLookup
, args
);
}
else if (requiredType
!= null
) {
return parentBeanFactory
.getBean(nameToLookup
, requiredType
);
}
else {
return (T
) parentBeanFactory
.getBean(nameToLookup
);
}
}
if (!typeCheckOnly
) {
markBeanAsCreated(beanName
);
}
try {
final RootBeanDefinition mbd
= getMergedLocalBeanDefinition(beanName
);
checkMergedBeanDefinition(mbd
, beanName
, args
);
String
[] dependsOn
= mbd
.getDependsOn();
if (dependsOn
!= null
) {
for (String dep
: dependsOn
) {
if (isDependent(beanName
, dep
)) {
throw new BeanCreationException(mbd
.getResourceDescription(), beanName
,
"Circular depends-on relationship between '" + beanName
+ "' and '" + dep
+ "'");
}
registerDependentBean(dep
, beanName
);
try {
getBean(dep
);
}
catch (NoSuchBeanDefinitionException ex
) {
throw new BeanCreationException(mbd
.getResourceDescription(), beanName
,
"'" + beanName
+ "' depends on missing bean '" + dep
+ "'", ex
);
}
}
}
if (mbd
.isSingleton()) {
sharedInstance
= getSingleton(beanName
, () -> {
try {
return createBean(beanName
, mbd
, args
);
}
catch (BeansException ex
) {
destroySingleton(beanName
);
throw ex
;
}
});
bean
= getObjectForBeanInstance(sharedInstance
, name
, beanName
, mbd
);
}
else if (mbd
.isPrototype()) {
Object prototypeInstance
= null
;
try {
beforePrototypeCreation(beanName
);
prototypeInstance
= createBean(beanName
, mbd
, args
);
}
finally {
afterPrototypeCreation(beanName
);
}
bean
= getObjectForBeanInstance(prototypeInstance
, name
, beanName
, mbd
);
}
else {
String scopeName
= mbd
.getScope();
final Scope scope
= this.scopes
.get(scopeName
);
if (scope
== null
) {
throw new IllegalStateException("No Scope registered for scope name '" + scopeName
+ "'");
}
try {
Object scopedInstance
= scope
.get(beanName
, () -> {
beforePrototypeCreation(beanName
);
try {
return createBean(beanName
, mbd
, args
);
}
finally {
afterPrototypeCreation(beanName
);
}
});
bean
= getObjectForBeanInstance(scopedInstance
, name
, beanName
, mbd
);
}
catch (IllegalStateException ex
) {
throw new BeanCreationException(beanName
,
"Scope '" + scopeName
+ "' is not active for the current thread; consider " +
"defining a scoped proxy for this bean if you intend to refer to it from a singleton",
ex
);
}
}
}
catch (BeansException ex
) {
cleanupAfterBeanCreationFailure(beanName
);
throw ex
;
}
}
if (requiredType
!= null
&& !requiredType
.isInstance(bean
)) {
try {
T convertedBean
= getTypeConverter().convertIfNecessary(bean
, requiredType
);
if (convertedBean
== null
) {
throw new BeanNotOfRequiredTypeException(name
, requiredType
, bean
.getClass());
}
return convertedBean
;
}
catch (TypeMismatchException ex
) {
if (logger
.isTraceEnabled()) {
logger
.trace("Failed to convert bean '" + name
+ "' to required type '" +
ClassUtils
.getQualifiedName(requiredType
) + "'", ex
);
}
throw new BeanNotOfRequiredTypeException(name
, requiredType
, bean
.getClass());
}
}
return (T
) bean
;
}
3.5 DefaultSingletonBeanRegistry#getSingleton(String beanName, ObjectFactory<?> singletonFactory)
public Object
getSingleton(String beanName
, ObjectFactory
<?> singletonFactory
) {
Assert
.notNull(beanName
, "Bean name must not be null");
synchronized (this.singletonObjects
) {
Object singletonObject
= this.singletonObjects
.get(beanName
);
if (singletonObject
== null
) {
if (this.singletonsCurrentlyInDestruction
) {
throw new BeanCreationNotAllowedException(beanName
,
"Singleton bean creation not allowed while singletons of this factory are in destruction " +
"(Do not request a bean from a BeanFactory in a destroy method implementation!)");
}
if (logger
.isDebugEnabled()) {
logger
.debug("Creating shared instance of singleton bean '" + beanName
+ "'");
}
beforeSingletonCreation(beanName
);
boolean newSingleton
= false;
boolean recordSuppressedExceptions
= (this.suppressedExceptions
== null
);
if (recordSuppressedExceptions
) {
this.suppressedExceptions
= new LinkedHashSet<>();
}
try {
singletonObject
= singletonFactory
.getObject();
newSingleton
= true;
}
catch (IllegalStateException ex
) {
singletonObject
= this.singletonObjects
.get(beanName
);
if (singletonObject
== null
) {
throw ex
;
}
}
catch (BeanCreationException ex
) {
if (recordSuppressedExceptions
) {
for (Exception suppressedException
: this.suppressedExceptions
) {
ex
.addRelatedCause(suppressedException
);
}
}
throw ex
;
}
finally {
if (recordSuppressedExceptions
) {
this.suppressedExceptions
= null
;
}
afterSingletonCreation(beanName
);
}
if (newSingleton
) {
System
.out
.println("====beanName==" + beanName
+ "===instance end====");
addSingleton(beanName
, singletonObject
);
}
}
return singletonObject
;
}
}
3.6 DefaultSingletonBeanRegistry#beforeSingletonCreation(String beanName)
把这个beanName放到singletonsCurrentlyInCreationSet容器中,在这个集合里面的 bean 都是正在实例化的 bean,就是实例化还没做完的 BeanName
3.7 回到3.4步 doGetBean(),AbstractAutowireCapableBeanFactory#createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
protected Object
createBean(String beanName
, RootBeanDefinition mbd
, @Nullable Object
[] args
)
throws BeanCreationException
{
if (logger
.isTraceEnabled()) {
logger
.trace("Creating instance of bean '" + beanName
+ "'");
}
RootBeanDefinition mbdToUse
= mbd
;
Class
<?> resolvedClass
= resolveBeanClass(mbd
, beanName
);
if (resolvedClass
!= null
&& !mbd
.hasBeanClass() && mbd
.getBeanClassName() != null
) {
mbdToUse
= new RootBeanDefinition(mbd
);
mbdToUse
.setBeanClass(resolvedClass
);
}
try {
mbdToUse
.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex
) {
throw new BeanDefinitionStoreException(mbdToUse
.getResourceDescription(),
beanName
, "Validation of method overrides failed", ex
);
}
try {
Object bean
= resolveBeforeInstantiation(beanName
, mbdToUse
);
if (bean
!= null
) {
return bean
;
}
}
catch (Throwable ex
) {
throw new BeanCreationException(mbdToUse
.getResourceDescription(), beanName
,
"BeanPostProcessor before instantiation of bean failed", ex
);
}
try {
Object beanInstance
= doCreateBean(beanName
, mbdToUse
, args
);
if (logger
.isTraceEnabled()) {
logger
.trace("Finished creating instance of bean '" + beanName
+ "'");
}
return beanInstance
;
}
catch (BeanCreationException | ImplicitlyAppearedSingletonException ex
) {
throw ex
;
}
catch (Throwable ex
) {
throw new BeanCreationException(
mbdToUse
.getResourceDescription(), beanName
, "Unexpected exception during bean creation", ex
);
}
}
3.8 AbstractAutowireCapableBeanFactory#doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
protected Object
doCreateBean(final String beanName
, final RootBeanDefinition mbd
, final @Nullable Object
[] args
)
throws BeanCreationException
{
BeanWrapper instanceWrapper
= null
;
if (mbd
.isSingleton()) {
instanceWrapper
= this.factoryBeanInstanceCache
.remove(beanName
);
}
if (instanceWrapper
== null
) {
instanceWrapper
= createBeanInstance(beanName
, mbd
, args
);
}
final Object bean
= instanceWrapper
.getWrappedInstance();
Class
<?> beanType
= instanceWrapper
.getWrappedClass();
if (beanType
!= NullBean
.class) {
mbd
.resolvedTargetType
= beanType
;
}
synchronized (mbd
.postProcessingLock
) {
if (!mbd
.postProcessed
) {
try {
applyMergedBeanDefinitionPostProcessors(mbd
, beanType
, beanName
);
}
catch (Throwable ex
) {
throw new BeanCreationException(mbd
.getResourceDescription(), beanName
,
"Post-processing of merged bean definition failed", ex
);
}
mbd
.postProcessed
= true;
}
}
boolean earlySingletonExposure
= (mbd
.isSingleton() && this.allowCircularReferences
&&
isSingletonCurrentlyInCreation(beanName
));
if (earlySingletonExposure
) {
if (logger
.isTraceEnabled()) {
logger
.trace("Eagerly caching bean '" + beanName
+
"' to allow for resolving potential circular references");
}
addSingletonFactory(beanName
, () -> getEarlyBeanReference(beanName
, mbd
, bean
));
}
Object exposedObject
= bean
;
try {
populateBean(beanName
, mbd
, instanceWrapper
);
exposedObject
= initializeBean(beanName
, exposedObject
, mbd
);
}
catch (Throwable ex
) {
if (ex
instanceof BeanCreationException && beanName
.equals(((BeanCreationException
) ex
).getBeanName())) {
throw (BeanCreationException
) ex
;
}
else {
throw new BeanCreationException(
mbd
.getResourceDescription(), beanName
, "Initialization of bean failed", ex
);
}
}
if (earlySingletonExposure
) {
Object earlySingletonReference
= getSingleton(beanName
, false);
if (earlySingletonReference
!= null
) {
if (exposedObject
== bean
) {
exposedObject
= earlySingletonReference
;
}
else if (!this.allowRawInjectionDespiteWrapping
&& hasDependentBean(beanName
)) {
String
[] dependentBeans
= getDependentBeans(beanName
);
Set
<String> actualDependentBeans
= new LinkedHashSet<>(dependentBeans
.length
);
for (String dependentBean
: dependentBeans
) {
if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean
)) {
actualDependentBeans
.add(dependentBean
);
}
}
if (!actualDependentBeans
.isEmpty()) {
throw new BeanCurrentlyInCreationException(beanName
,
"Bean with name '" + beanName
+ "' has been injected into other beans [" +
StringUtils
.collectionToCommaDelimitedString(actualDependentBeans
) +
"] in its raw version as part of a circular reference, but has eventually been " +
"wrapped. This means that said other beans do not use the final version of the " +
"bean. This is often the result of over-eager type matching - consider using " +
"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
}
}
}
}
try {
registerDisposableBeanIfNecessary(beanName
, bean
, mbd
);
}
catch (BeanDefinitionValidationException ex
) {
throw new BeanCreationException(
mbd
.getResourceDescription(), beanName
, "Invalid destruction signature", ex
);
}
return exposedObject
;
}
3.9 AbstractAutowireCapableBeanFactory#createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
实例化方法,把 bean 实例化,并且包装成 BeanWrapper如果有FactoryMethodName属性,通过instantiateUsingFactoryMethod这个方法,反射得到实例化对象,并交给spring容器管理@Bean的实现原理也是通过spring 扫描有@bean 注解的方法,然后把方法名称设置到 BeanDefinition 的 factoryMethod 属性中,接下来就会调到instantiateUsingFactoryMethod方法实现@Bean 方法的调用
protected BeanWrapper
createBeanInstance(String beanName
, RootBeanDefinition mbd
, @Nullable Object
[] args
) {
Class
<?> beanClass
= resolveBeanClass(mbd
, beanName
);
if (beanClass
!= null
&& !Modifier
.isPublic(beanClass
.getModifiers()) && !mbd
.isNonPublicAccessAllowed()) {
throw new BeanCreationException(mbd
.getResourceDescription(), beanName
,
"Bean class isn't public, and non-public access not allowed: " + beanClass
.getName());
}
Supplier
<?> instanceSupplier
= mbd
.getInstanceSupplier();
if (instanceSupplier
!= null
) {
return obtainFromSupplier(instanceSupplier
, beanName
);
}
if (mbd
.getFactoryMethodName() != null
) {
return instantiateUsingFactoryMethod(beanName
, mbd
, args
);
}
boolean resolved
= false;
boolean autowireNecessary
= false;
if (args
== null
) {
synchronized (mbd
.constructorArgumentLock
) {
if (mbd
.resolvedConstructorOrFactoryMethod
!= null
) {
resolved
= true;
autowireNecessary
= mbd
.constructorArgumentsResolved
;
}
}
}
if (resolved
) {
if (autowireNecessary
) {
return autowireConstructor(beanName
, mbd
, null
, null
);
}
else {
return instantiateBean(beanName
, mbd
);
}
}
Constructor
<?>[] ctors
= determineConstructorsFromBeanPostProcessors(beanClass
, beanName
);
if (ctors
!= null
|| mbd
.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR
||
mbd
.hasConstructorArgumentValues() || !ObjectUtils
.isEmpty(args
)) {
return autowireConstructor(beanName
, mbd
, ctors
, args
);
}
ctors
= mbd
.getPreferredConstructors();
if (ctors
!= null
) {
return autowireConstructor(beanName
, mbd
, ctors
, null
);
}
return instantiateBean(beanName
, mbd
);
}
通过方法对象invoke,传入实例对象和入参
3.10 AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName)
寻找当前正在实例化的bean中有@Autowired注解的构造函数有参构造函数的时候,determineConstructorsFromBeanPostProcessors这个方法是 BeanPostProcessor 接口类的首次应用,最终会调到 AutowiredAnnotationBeanPostProcessor 类的方法,在方法中会扫描有注解的构造函数然后完成装配过程。然后把有@Autowired 注解的构造函数返回。
protected Constructor
<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class
<?> beanClass
, String beanName
)
throws BeansException
{
if (beanClass
!= null
&& hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp
: getBeanPostProcessors()) {
if (bp
instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp
= (SmartInstantiationAwareBeanPostProcessor
) bp
;
Constructor
<?>[] ctors
= ibp
.determineCandidateConstructors(beanClass
, beanName
);
if (ctors
!= null
) {
return ctors
;
}
}
}
}
return null
;
}
只有AutowiredAnnotationBeanPostProcessor这个类中的determineCandidateConstructors方法有具体实现,用来找到类中有Autowired注解的构造函数,其他几个类的determineCandidateConstructors方法都是空方法(因为其他的类并不关心构造函数上是否有注解)
获取到构造函数上的@Autowired注解信息
3.11 回到3.9步 createBeanInstance方法,AbstractAutowireCapableBeanFactory#autowireConstructor(beanName, mbd, ctors, args)
有@Autowired注解的有参构造函数,如果函数是一个引用类型,就会触发这个引用类型的getBean操作例如下面这种有@Autowired注解的构造函数
3.12 回到3.9步 createBeanInstance方法,AbstractAutowireCapableBeanFactory#instantiateBean(beanName, mbd);
无参构造函数的实例化包装成BeanWrapper对象并返回
3.13 回到3.8步doCreateBean(),AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
实例化完成后接下来就需要对类中的属性进行依赖注入操作,但是类里面属性和方法的依赖注入是用@Autowired 或者@Resource 注解完成的CommonAnnotationBeanPostProcessor 支持了@PostConstruct,@PreDestroy,@Resource注解AutowiredAnnotationBeanPostProcessor 支持 @Autowired,@Value注解这是一个搜集过程,为了ioc依赖注入,搜集完注解才知道要依赖注入什么东西
3.14 CommonAnnotationBeanPostProcessor#postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)
1、扫描类里面的属性或者方法 2、判断属性或者方法上面是否有@PostConstruct @PreDestroy @Resource注解 3、如果有注解的属性或者方法,包装成一个类
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition
, Class
<?> beanType
, String beanName
) {
super.postProcessMergedBeanDefinition(beanDefinition
, beanType
, beanName
);
InjectionMetadata metadata
= findResourceMetadata(beanName
, beanType
, null
);
metadata
.checkConfigMembers(beanDefinition
);
}
CommonAnnotationBeanPostProcessor类的构造方法,对@PostConstruct和@PreDestroy注解的搜集
这两种注解只能作用在方法(method)上
3.15 CommonAnnotationBeanPostProcessor#findResourceMetadata(String beanName, final Class<?> clazz, @Nullable PropertyValues pvs)
1、看缓存里面有没有 InjectionMetadata 对象 2、 如果没有就到类中去搜集注解@Resource,如果有注解封装成 ResourceElement 对象 3、最终把包含属性和方法的对象Member(field和method的顶层父类)封装到 InjectedElement对象中,再把InjectedElement封装到InjectionMetadata对象中,缓存到Map中并返回
3.16 回到3.13步, AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)
对@Autowired 注解的属性和方法的收集。收集过程基本上跟@Resource 注解的收集差不多,同样包装成InjectionMetadata对象,缓存daoMap中并返回。
搜集过程总结
首先走到一个beanpostprocessor,如果是CommonAnnotationBeanPostProcessor,拿到正在实例化的bean的反射对象,再拿到这个对象里面的所有属性和方法,循环这些属性和方法,判断是否有对应的注解(@PostConstruct,@PreDestroy,@Resource),如果有就包装成InjectedElement对象,放入集合,再包装成InjectionMetadata对象
3.17 回到3.8步doCreateBean(),AbstractAutowireCapableBeanFactory#populateBean(beanName, mbd, instanceWrapper);
ioc di,依赖注入的核心方法
protected void populateBean(String beanName
, RootBeanDefinition mbd
, @Nullable BeanWrapper bw
) {
if (bw
== null
) {
if (mbd
.hasPropertyValues()) {
throw new BeanCreationException(
mbd
.getResourceDescription(), beanName
, "Cannot apply property values to null instance");
}
else {
return;
}
}
boolean continueWithPropertyPopulation
= true;
if (!mbd
.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp
: getBeanPostProcessors()) {
if (bp
instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp
= (InstantiationAwareBeanPostProcessor
) bp
;
if (!ibp
.postProcessAfterInstantiation(bw
.getWrappedInstance(), beanName
)) {
continueWithPropertyPopulation
= false;
break;
}
}
}
}
if (!continueWithPropertyPopulation
) {
return;
}
PropertyValues pvs
= (mbd
.hasPropertyValues() ? mbd
.getPropertyValues() : null
);
if (mbd
.getResolvedAutowireMode() == AUTOWIRE_BY_NAME
|| mbd
.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE
) {
MutablePropertyValues newPvs
= new MutablePropertyValues(pvs
);
if (mbd
.getResolvedAutowireMode() == AUTOWIRE_BY_NAME
) {
autowireByName(beanName
, mbd
, bw
, newPvs
);
}
if (mbd
.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE
) {
autowireByType(beanName
, mbd
, bw
, newPvs
);
}
pvs
= newPvs
;
}
boolean hasInstAwareBpps
= hasInstantiationAwareBeanPostProcessors();
boolean needsDepCheck
= (mbd
.getDependencyCheck() != AbstractBeanDefinition
.DEPENDENCY_CHECK_NONE
);
PropertyDescriptor
[] filteredPds
= null
;
if (hasInstAwareBpps
) {
if (pvs
== null
) {
pvs
= mbd
.getPropertyValues();
}
for (BeanPostProcessor bp
: getBeanPostProcessors()) {
if (bp
instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp
= (InstantiationAwareBeanPostProcessor
) bp
;
PropertyValues pvsToUse
= ibp
.postProcessProperties(pvs
, bw
.getWrappedInstance(), beanName
);
if (pvsToUse
== null
) {
if (filteredPds
== null
) {
filteredPds
= filterPropertyDescriptorsForDependencyCheck(bw
, mbd
.allowCaching
);
}
pvsToUse
= ibp
.postProcessPropertyValues(pvs
, filteredPds
, bw
.getWrappedInstance(), beanName
);
if (pvsToUse
== null
) {
return;
}
}
pvs
= pvsToUse
;
}
}
}
if (needsDepCheck
) {
if (filteredPds
== null
) {
filteredPds
= filterPropertyDescriptorsForDependencyCheck(bw
, mbd
.allowCaching
);
}
checkDependencies(beanName
, mbd
, filteredPds
, pvs
);
}
if (pvs
!= null
) {
applyPropertyValues(beanName
, mbd
, bw
, pvs
);
}
}
3.18 AutowiredAnnotationBeanPostProcessor#postProcessProperties(PropertyValues pvs, Object bean, String beanName)
前面已经对@Resource@Autowired 注解进行了收集,这个方法就是根据收集到的注解进行反射调 用
注入方法
InjectionMetadata metadata
= findAutowiringMetadata(beanName
, bean
.getClass(), pvs
);
try {
metadata
.inject(bean
, beanName
, pvs
);
}
3.19 InjectionMetadata#inject(Object target, @Nullable String beanName, @Nullable PropertyValues pvs)
循环收集到的 metaData 中集合里的对象,然后调用里面的 InjectedElement 的 inject 方法完成依赖注入
3.20 AutowiredAnnotationBeanPostProcessor#inject(Object bean, @Nullable String beanName, @Nullable PropertyValues pvs)
和3.11的有参构造函数实例化一样,beanFactory.resolveDependency()最后会调到beanFactory.getBean(beanName)方法,从 spring 容器中获取到需要注入的实例,赋值给value。
把value作为属性field,赋给正在实例化的bean
MyAnnotationClass类正在实例化,通过@Autowired注解,把Student类作为属性注入到MyAnnotationClass中
如果是通过有参构造方法注入
members强转成method
arguments得到需要注入的构造方法
有参构造方法作为方法注入给正在实例化的bean
java反射,method.invoke(),field.set()
基于注解的ioc依赖注入完成基于xml配置的依赖注入在第3.17步,populateBean()方法中,建议不看,是老版本用< property name=“username” value=“Jack”/>标签做依赖注入的代码实现,很复杂,专门做 xml 配置依赖注入的,基本上现在基于 xml 配置的依赖很少使用。
3.21 回到3.8步doCreateBean()方法,AbstractAutowireCapableBeanFactory#initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
在bean实例化和ioc依赖注入完以后的,一些方法的调用首先是对某些 Aware 接口的调用;然后@PostConstruct 注解方法的调用;InitializingBean 接口调用,实现了 InitializingBean 接口的类就必然会调用到 afterPropertiesSet;init-method 属性调用,Init-method 属性调用是在 afterPropertiesSet 之后;afterPropertiesSet和Init-method和有@PostConstruct注解的方法核心功能都是一样的,只是调用时序不一样而已,都是在该类实例化和 IOC 做完后调用的,我们可以在这些方法中做一些在 spring 或者 servlet 容器启动的时候的初始化工作。比如缓存预热,比如缓存数据加载到内存,比如配置解析,等等初始化工作。
protected Object
initializeBean(final String beanName
, final Object bean
, @Nullable RootBeanDefinition mbd
) {
if (System
.getSecurityManager() != null
) {
AccessController
.doPrivileged((PrivilegedAction
<Object>) () -> {
invokeAwareMethods(beanName
, bean
);
return null
;
}, getAccessControlContext());
}
else {
invokeAwareMethods(beanName
, bean
);
}
Object wrappedBean
= bean
;
if (mbd
== null
|| !mbd
.isSynthetic()) {
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()) {
wrappedBean
= applyBeanPostProcessorsAfterInitialization(wrappedBean
, beanName
);
}
return wrappedBean
;
}
3.22 AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
@PostConstruct 注解方法的调用
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
;
}
CommonAnnotationBeanPostProcessor继承了InitDestroyAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor之前已经对@PostConstruct注解进行了搜集,所以这里进入InitDestroyAnnotationBeanPostProcessor调用@PostConstruct注解的方法
java反射调用
3.23 AbstractAutowireCapableBeanFactory#invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
InitializingBean接口的afterPropertiesSet方法调用
init-method属性调用
在mybatis里的xml解析就是使用InitializingBean接口的afterPropertiesSet方法,在bean实例化完成以后,调用afterPropertiesSet方法。
initializeBean()内调用过程总结
1、BeanNameAware接口,2、@PostConstruct,3、afterPropertiesSet(),4、init-Method属性
代码示例
测试类实现 InitializingBean和BeanNameAware接口,重写afterPropertiesSet和setBeanName方法,添加了@PostConstruct注解,又写了一个initMethod方法(使用< bean>设置init-method属性)
查看打印
@PostConstruct,InitializingBean接口,init-Method属性的作用是一样的,都是为了在bean实例化完成后做一些工作对应的,在bean销毁前要做一些工作使用 @PreDestroy、DisposableBean接口、destory-method属性
3.24 回到3.8步doCreateBean()方法,AbstractBeanFactory#registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd)
销毁方法
这个DisposableBeanAdapter对象就是负责bean销毁的类。在这个类中收集了该bean 是否实现了 DisposableBean 接口,是否配置 destroy-method 属性,过滤了 DestructionAwareBeanPostProcessor 类型的接口。
在 tomcat 关闭的时候就会调用到 servlet 中的销毁方法
总结
1.invokeBeanFactoryPostProcessors完成对BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor这两个接口的调用
获取beanFactory中所有实现了BeanDefinitionRegistryPostProcessor接口的类的beanName遍历这些beanName,分成实现PriorityOrdered、Ordered、没实现排序接口的三种实现类分别对这三类实现类进行排序,然后调用postProcessBeanDefinitionRegistry(如果没有使用spring.xml配置自定义标签解析,而是使用注解@ComponentScan(“com.example.demo”),那么此步中会调用ComponentScanAnnotationParser的parse方法创建注解扫描scaner),可以对beanDefinition的添加和修改
2.registerBeanPostProcessors把实现了BeanPostProcessor接口的类实例化,并且加入到BeanFactory中
拿到所有实现了BeanPostProcessor接口的类,判断接口类型,添加到beanPostProcessors集合中
3.finishBeanFactoryInitialization bean实例化过程,ioc,注解支持
如果不是抽象的,单例的,非懒加载的就实例化getBean(beanName)要么从缓存中拿到对象,要么去createBean这个对象,包括对父子BeanDefinition合并getSingleton如果缓存中有,则直接返回;如果没有,就把beanName添加到singletonsCurrentlyInCreation的Set容器中,在这个集合里面的bean都是正在实例化的bean,bean创建完成后singletonsCurrentlyInCreation要删除该bean;开始调用createBean方法创建对象,如果创建对象成功,把对象从singletonsCurrentlyInCreation中删除,然后缓存到singletonObjects一级缓存中
3.1、createBean
createBeanInstance-创建实例,通过推断出来的构造方法反射实例化对象,包装成BeanWrapper对象并返回
applyMergedBeanDefinitionPostProcessors-对类中注解的装配过程,扫描bean里面的属性或者方法,判断属性或者方法上面是否有@PostConstruct @PreDestroy @Resource @Autowired注解,如果有就包装成InjectionMetadata对象放入缓存,完成对注解的收集
addSingletonFactory-循环依赖,添加三级缓存
populateBean-依赖注入的核心方法,postProcessProperties()从缓存中拿到InjectionMetadata对象,使用inject方法,如果是把类作为属性注入就getBean,把Bean作为属性注入,如果是构造方法注入,就反射调用完成依赖注入,把有@Autowired注解的方法或属性注入到正在实例化的Bean中
initializeBean-实例化+ioc依赖注入完以后的调用,比如@PostConstruct注解方法的反射调用
registerDisposableBeanIfNecessary-负责bean销毁