Spring @Compoment bean注册过程
@ComponentScan注册bean
- 扫描path解析到BeanDefinitionHolder
- 赋值到BeanDefinitionRegistry.beanDefinitionMap
org.springframework.context.annotation.ConfigurationClassParser#doProcessConfigurationClass
protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)
throws IOException {
....
// Process any @ComponentScan annotations
Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(
sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);
if (!componentScans.isEmpty() &&
!this.conditionEvaluator.shouldSkip(sourceClass.getMetadata(), ConfigurationPhase.REGISTER_BEAN)) {
for (AnnotationAttributes componentScan : componentScans) {
// The config class is annotated with @ComponentScan -> perform the scan immediately
Set<BeanDefinitionHolder> scannedBeanDefinitions =
this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());
// Check the set of scanned definitions for any further config classes and parse recursively if needed
for (BeanDefinitionHolder holder : scannedBeanDefinitions) {
BeanDefinition bdCand = holder.getBeanDefinition().getOriginatingBeanDefinition();
if (bdCand == null) {
bdCand = holder.getBeanDefinition();
}
if (ConfigurationClassUtils.checkConfigurationClassCandidate(bdCand, this.metadataReaderFactory)) {
parse(bdCand.getBeanClassName(), holder.getBeanName());
}
}
}
}
...
}
注册Bean的后置处理器BeanPostProcessor
registerBeanPostProcessors(beanFactory);
AspectJ Aop BeanPostProcessor 增强对象
org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator
extends
org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator
extends
org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator
extends
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator
implements
org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor
extends
org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor
extends
org.springframework.beans.factory.config.BeanPostProcessor
实例化Bean
beanfinishBeanFactoryInitialization
1.创建BeanWrapper包装,放在BeanDefinitionMap
instanceWrapper = createBeanInstance(beanName, mbd, args);
BeanUtils#instantiateClass
2.后置处理器修改beanDefinition,修改包装bean对象,如Aop代理对象
getEarlyBeanReference(beanName, mbd, bean)
3.增加到三级缓存singletonFactories, 包装成ObjectFactory
DefaultSingletonBeanRegistry#addSingletonFactory
4.注入bean依赖对象,依赖对象不存在则创建依赖对象bean
populateBean(beanName, mbd, instanceWrapper);
三级转二级核心实现
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
// 一级singletonObjects不存在找二级earlySingletonObjects
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this.singletonObjects) {
// 二级earlySingletonObjects不存在找三级singletonFactories
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
// 三级singletonFactories找到则放在二级,删除三级
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}
5.最后如果是新实例,二级缓存增加到一级singletonObjects
DefaultSingletonBeanRegistry.java:247
if (newSingleton) {
addSingleton(beanName, singletonObject);
}
创建bean实现核心代码
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// 1.创建BeanWrapper包装
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;
}
// 2.允许后置处理器修改BeanDefinition
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;
}
}
// 3.增加到三级缓存singletonFactories, 包装成ObjectFactory
// getEarlyBeanReference会将三级缓存对象包装成proxy,addSingletonFactory再包装成ObjectFactory
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));
}
//4.注入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.");
}
}
}
}
// Register bean as disposable.
try {
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
catch (BeanDefinitionValidationException ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
}
return exposedObject;
}