目录
第1步:createBeanInstance,得到实例BeanWrapper第1-1步:通过工厂方法实例化,先略过第1-2步:通过默认构造函数实例化第1-3步:通过有参构造函数实例化
第2步:applyMergedBeanDefinitionPostProcessors第3步:addSingletonFactory注册早期工厂第3-1步:getEarlyBeanReference第3-2步:addSingletonFactory
第4步:populateBean属性注入第4-2步:autowireByName得到依赖属性Bean第4-3步:autowireByType得到依赖属性Bean第4-4步: @Autowired注解方式的属性注入(InstantiationAwareBeanPostProcessor),见下篇分析
第5步:initializeBean初始化第5-1步:invokeAwareMethods第5-2步:applyBeanPostProcessorsBeforeInitialization第5-3步:invokeInitMethods初始化方法(InitializingBean实现类或自定义init-method)第5-4步:applyBeanPostProcessorsAfterInitialization
第6步:依赖检查附1:自动装配附2:SmartInstantiationAwareBeanPostProcessor附3:MergedBeanDefinitionPostProcessor
以BeanFactory的doCreateBean方法为入口,整理Bean的创建流程。
protected Object
doCreateBean(final String beanName
, final RootBeanDefinition mbd
, final Object
[] args
) {
BeanWrapper instanceWrapper
= null
;
if (mbd
.isSingleton()) {
instanceWrapper
= this.factoryBeanInstanceCache
.remove(beanName
);
}
if (instanceWrapper
== null
) {
instanceWrapper
= createBeanInstance(beanName
, mbd
, args
);
}
final Object bean
= (instanceWrapper
!= null
? instanceWrapper
.getWrappedInstance() : null
);
Class
<?> beanType
= (instanceWrapper
!= null
? instanceWrapper
.getWrappedClass() : null
);
synchronized (mbd
.postProcessingLock
) {
if (!mbd
.postProcessed
) {
applyMergedBeanDefinitionPostProcessors(mbd
, beanType
, beanName
);
mbd
.postProcessed
= true;
}
}
boolean earlySingletonExposure
= (mbd
.isSingleton() && this.allowCircularReferences
&&
isSingletonCurrentlyInCreation(beanName
));
if (earlySingletonExposure
) {
if (logger
.isDebugEnabled()) {
logger
.debug("Eagerly caching bean '" + beanName
+
"' to allow for resolving potential circular references");
}
addSingletonFactory(beanName
, new ObjectFactory<Object>() {
@Override
public Object
getObject() throws BeansException
{
return getEarlyBeanReference(beanName
, mbd
, bean
);
}
});
}
Object exposedObject
= bean
;
try {
populateBean(beanName
, mbd
, instanceWrapper
);
if (exposedObject
!= null
) {
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<String>(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
;
}
此方法的大概功能:
createBeanInstance,(默认bean实例化、工厂方法、构造函数自动装配)得到包装实例BeanWrapperapplyMergedBeanDefinitionPostProcessors,合并后的bean定义进行后期处理addSingletonFactory,提前暴露早期工厂populateBean,依赖属性装配initializeBean,调用初始化方法getSingleton,如果允许提前曝光,则检查循环依赖registerDisposableBeanIfNecessary
第1步:createBeanInstance,得到实例BeanWrapper
protected BeanWrapper
createBeanInstance(String beanName
, RootBeanDefinition mbd
, 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());
}
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() == RootBeanDefinition
.AUTOWIRE_CONSTRUCTOR
||
mbd
.hasConstructorArgumentValues() || !ObjectUtils
.isEmpty(args
)) {
return autowireConstructor(beanName
, mbd
, ctors
, args
);
}
return instantiateBean(beanName
, mbd
);
}
这个方法将实例化Bean的形式分为三类:
通过工厂方法通过默认构造函数通过自动装配(构造函数形式的自动装配)
第1-1步:通过工厂方法实例化,先略过
第1-2步:通过默认构造函数实例化
protected BeanWrapper
instantiateBean(final String beanName
, final RootBeanDefinition mbd
) {
try {
Object beanInstance
;
final BeanFactory parent
= this;
if (System
.getSecurityManager() != null
) {
beanInstance
= AccessController
.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object
run() {
return getInstantiationStrategy().instantiate(mbd
, beanName
, parent
);
}
}, getAccessControlContext());
}
else {
beanInstance
= getInstantiationStrategy().instantiate(mbd
, beanName
, parent
);
}
BeanWrapper bw
= new BeanWrapperImpl(beanInstance
);
initBeanWrapper(bw
);
return bw
;
}
catch (Throwable ex
) {
throw new BeanCreationException(mbd
.getResourceDescription(), beanName
, "Instantiation of bean failed", ex
);
}
}
其中有一个getInstantiationStrategy(),获取BeanFactory的实例化策略实现类。有关这个策略,InstantiationStrategy是根接口,实现类有两个:SimpleInstantiationStrategy、CglibSubclassingInstantiationStrategy。其中CglibSubclassingInstantiationStrategy又继承了SimpleInstantiationStrategy。
@Override
public Object
instantiate(RootBeanDefinition bd
, String beanName
, BeanFactory owner
) {
if (bd
.getMethodOverrides().isEmpty()) {
Constructor
<?> constructorToUse
;
synchronized (bd
.constructorArgumentLock
) {
constructorToUse
= (Constructor
<?>) bd
.resolvedConstructorOrFactoryMethod
;
if (constructorToUse
== null
) {
final Class
<?> clazz
= bd
.getBeanClass();
if (clazz
.isInterface()) {
throw new BeanInstantiationException(clazz
, "Specified class is an interface");
}
try {
if (System
.getSecurityManager() != null
) {
constructorToUse
= AccessController
.doPrivileged(new PrivilegedExceptionAction<Constructor
<?>>() {
@Override
public Constructor
<?> run() throws Exception
{
return clazz
.getDeclaredConstructor((Class
[]) null
);
}
});
}
else {
constructorToUse
= clazz
.getDeclaredConstructor((Class
[]) null
);
}
bd
.resolvedConstructorOrFactoryMethod
= constructorToUse
;
}
catch (Exception ex
) {
throw new BeanInstantiationException(clazz
, "No default constructor found", ex
);
}
}
}
return BeanUtils
.instantiateClass(constructorToUse
);
}
else {
return instantiateWithMethodInjection(bd
, beanName
, owner
);
}
}
方法首先判断了是否有MethodOverride值,也就是我们上文所说的 Spring(三)createBean方法源码分析lookup-method、replace-method属性。
如果没有MethodOverride, 通过反射创建实例 Constructor.newInstance()。如果有MethodOverride,则只能使用CglibSubclassingInstantiationStrategy策略的实例化逻辑,通过CGLib创建一个ASM增强的子类,来实现方法逻辑的代理。
第1-3步:通过有参构造函数实例化
有关自动装配见附1。 首先需要确定一个构造器:
Constructor
<?>[] ctors
= determineConstructorsFromBeanPostProcessors(beanClass
, beanName
);
if (ctors
!= null
||
mbd
.getResolvedAutowireMode() == RootBeanDefinition
.AUTOWIRE_CONSTRUCTOR
||
mbd
.hasConstructorArgumentValues() || !ObjectUtils
.isEmpty(args
)) {
return autowireConstructor(beanName
, mbd
, ctors
, args
);
}
determineConstructorsFromBeanPostProcessors方法:
protected Constructor
<?>[] determineConstructorsFromBeanPostProcessors(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
;
}
得到BeanFactory中所有的SmartInstantiationAwareBeanPostProcessor,遍历调用其determineCandidateConstructors方法。 有关SmartInstantiationAwareBeanPostProcessor详细解释见附2。
第2步:applyMergedBeanDefinitionPostProcessors
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd
, Class
<?> beanType
, String beanName
)
throws BeansException
{
try {
for (BeanPostProcessor bp
: getBeanPostProcessors()) {
if (bp
instanceof MergedBeanDefinitionPostProcessor) {
MergedBeanDefinitionPostProcessor bdp
= (MergedBeanDefinitionPostProcessor
) bp
;
bdp
.postProcessMergedBeanDefinition(mbd
, beanType
, beanName
);
}
}
}
catch (Exception ex
) {
throw new BeanCreationException(mbd
.getResourceDescription(), beanName
,
"Post-processing failed of bean type [" + beanType
+ "] failed", ex
);
}
}
这个方法中,获取全部的MergedBeanDefinitionPostProcessor,然后遍历执行其postProcessMergedBeanDefinition方法。 有关MergedBeanDefinitionPostProcessor详细解释见附3。
第3步:addSingletonFactory注册早期工厂
if (earlySingletonExposure
) {
if (logger
.isDebugEnabled()) {
logger
.debug("Eagerly caching bean '" + beanName
+
"' to allow for resolving potential circular references");
}
addSingletonFactory(beanName
, new ObjectFactory<Object>() {
@Override
public Object
getObject() throws BeansException
{
return getEarlyBeanReference(beanName
, mbd
, bean
);
}
});
}
这个方法中:
为此Bean创建提前暴露的工厂,工厂返回值为getEarlyBeanReferenceaddSingletonFactory,注册此工厂,处理循环依赖提前曝光
第3-1步:getEarlyBeanReference
protected Object
getEarlyBeanReference(String beanName
, RootBeanDefinition mbd
, Object bean
) {
Object exposedObject
= bean
;
if (bean
!= null
&& !mbd
.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp
: getBeanPostProcessors()) {
if (bp
instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp
= (SmartInstantiationAwareBeanPostProcessor
) bp
;
exposedObject
= ibp
.getEarlyBeanReference(exposedObject
, beanName
);
if (exposedObject
== null
) {
return exposedObject
;
}
}
}
}
return exposedObject
;
}
这个方法中,调用SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference方法。 在getEarlyBeanReference接口的实现过程中,有一个步骤
protected Object
wrapIfNecessary(Object bean
, String beanName
, Object cacheKey
) {
if (beanName
!= null
&& this.targetSourcedBeans
.contains(beanName
)) {
return bean
;
}
if (Boolean
.FALSE
.equals(this.advisedBeans
.get(cacheKey
))) {
return bean
;
}
if (isInfrastructureClass(bean
.getClass()) || shouldSkip(bean
.getClass(), beanName
)) {
this.advisedBeans
.put(cacheKey
, Boolean
.FALSE
);
return bean
;
}
Object
[] specificInterceptors
= getAdvicesAndAdvisorsForBean(bean
.getClass(), beanName
, null
);
if (specificInterceptors
!= DO_NOT_PROXY
) {
this.advisedBeans
.put(cacheKey
, Boolean
.TRUE
);
Object proxy
= createProxy(
bean
.getClass(), beanName
, specificInterceptors
, new SingletonTargetSource(bean
));
this.proxyTypes
.put(cacheKey
, proxy
.getClass());
return proxy
;
}
this.advisedBeans
.put(cacheKey
, Boolean
.FALSE
);
return bean
;
}
可以看到,如果存在切面,则创建一个代理,spring的 AOP是基于getEarlyBeanReference 实现的,之后详细分析。
第3-2步:addSingletonFactory
protected void addSingletonFactory(String beanName
, ObjectFactory
<?> singletonFactory
) {
Assert
.notNull(singletonFactory
, "Singleton factory must not be null");
synchronized (this.singletonObjects
) {
if (!this.singletonObjects
.containsKey(beanName
)) {
this.singletonFactories
.put(beanName
, singletonFactory
);
this.earlySingletonObjects
.remove(beanName
);
this.registeredSingletons
.add(beanName
);
}
}
}
在这一步中,如果一级缓存中不存在此Bean,则从二级缓存中移除,将早期工厂加入三级缓存。 在Spring(二)doGetBean方法源码分析中的第1步:尝试从缓存中获取Bean,如果一级缓存中不存在,就会从singletonFactories中获取,此时获取的是一个早期Bean。
第4步:populateBean属性注入
protected void populateBean(String beanName
, RootBeanDefinition mbd
, BeanWrapper bw
) {
PropertyValues pvs
= mbd
.getPropertyValues();
if (bw
== null
) {
if (!pvs
.isEmpty()) {
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;
}
if (mbd
.getResolvedAutowireMode() == RootBeanDefinition
.AUTOWIRE_BY_NAME
||
mbd
.getResolvedAutowireMode() == RootBeanDefinition
.AUTOWIRE_BY_TYPE
) {
MutablePropertyValues newPvs
= new MutablePropertyValues(pvs
);
if (mbd
.getResolvedAutowireMode() == RootBeanDefinition
.AUTOWIRE_BY_NAME
) {
autowireByName(beanName
, mbd
, bw
, newPvs
);
}
if (mbd
.getResolvedAutowireMode() == RootBeanDefinition
.AUTOWIRE_BY_TYPE
) {
autowireByType(beanName
, mbd
, bw
, newPvs
);
}
pvs
= newPvs
;
}
boolean hasInstAwareBpps
= hasInstantiationAwareBeanPostProcessors();
boolean needsDepCheck
= (mbd
.getDependencyCheck() != RootBeanDefinition
.DEPENDENCY_CHECK_NONE
);
if (hasInstAwareBpps
|| needsDepCheck
) {
PropertyDescriptor
[] filteredPds
= filterPropertyDescriptorsForDependencyCheck(bw
, mbd
.allowCaching
);
if (hasInstAwareBpps
) {
for (BeanPostProcessor bp
: getBeanPostProcessors()) {
if (bp
instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp
= (InstantiationAwareBeanPostProcessor
) bp
;
pvs
= ibp
.postProcessPropertyValues(pvs
, filteredPds
, bw
.getWrappedInstance(), beanName
);
if (pvs
== null
) {
return;
}
}
}
}
if (needsDepCheck
) {
checkDependencies(beanName
, mbd
, filteredPds
, pvs
);
}
}
applyPropertyValues(beanName
, mbd
, bw
, pvs
);
}
在此方法中,功能大概为:
调用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation,检查是否允许继续属性注入,如果返回值是false,则不继续属性注入,直接返回byName类型的自动装配(依赖Bean名、依赖Bean)byType类型的自动装配(依赖Bean名、依赖Bean)@Autowired注解方式的属性注入:调用InstantiationAwareBeanPostProcessor.postProcessPropertyValuescheckDependencies检查依赖,即配置文件中的dependency-check属性applyPropertyValues,将MutablePropertyValues应用到此BeanWrapper
第4-2步:autowireByName得到依赖属性Bean
protected void autowireByName(
String beanName
, AbstractBeanDefinition mbd
, BeanWrapper bw
, MutablePropertyValues pvs
) {
String
[] propertyNames
= unsatisfiedNonSimpleProperties(mbd
, bw
);
for (String propertyName
: propertyNames
) {
if (containsBean(propertyName
)) {
Object bean
= getBean(propertyName
);
pvs
.add(propertyName
, bean
);
registerDependentBean(propertyName
, beanName
);
if (logger
.isDebugEnabled()) {
logger
.debug("Added autowiring by name from bean name '" + beanName
+
"' via property '" + propertyName
+ "' to bean named '" + propertyName
+ "'");
}
}
else {
if (logger
.isTraceEnabled()) {
logger
.trace("Not autowiring property '" + propertyName
+ "' of bean '" + beanName
+
"' by name: no matching bean found");
}
}
}
}
根据名字自动装配:
首先得到 所有需要装配的非简单属性 ,(不是字符串等简单类型)也就是Bean类型的属性,并返回然后 循环调用getBean(propertyName) ,也就是依次创建它依赖的Bean记录依赖关系
第4-3步:autowireByType得到依赖属性Bean
protected void autowireByType(
String beanName
, AbstractBeanDefinition mbd
, BeanWrapper bw
, MutablePropertyValues pvs
) {
TypeConverter converter
= getCustomTypeConverter();
if (converter
== null
) {
converter
= bw
;
}
Set
<String> autowiredBeanNames
= new LinkedHashSet<String>(4);
String
[] propertyNames
= unsatisfiedNonSimpleProperties(mbd
, bw
);
for (String propertyName
: propertyNames
) {
try {
PropertyDescriptor pd
= bw
.getPropertyDescriptor(propertyName
);
if (Object
.class != pd
.getPropertyType()) {
MethodParameter methodParam
= BeanUtils
.getWriteMethodParameter(pd
);
boolean eager
= !PriorityOrdered
.class.isAssignableFrom(bw
.getWrappedClass());
DependencyDescriptor desc
= new AutowireByTypeDependencyDescriptor(methodParam
, eager
);
Object autowiredArgument
= resolveDependency(desc
, beanName
, autowiredBeanNames
, converter
);
if (autowiredArgument
!= null
) {
pvs
.add(propertyName
, autowiredArgument
);
}
for (String autowiredBeanName
: autowiredBeanNames
) {
registerDependentBean(autowiredBeanName
, beanName
);
if (logger
.isDebugEnabled()) {
logger
.debug("Autowiring by type from bean name '" + beanName
+ "' via property '" +
propertyName
+ "' to bean named '" + autowiredBeanName
+ "'");
}
}
autowiredBeanNames
.clear();
}
}
catch (BeansException ex
) {
throw new UnsatisfiedDependencyException(mbd
.getResourceDescription(), beanName
, propertyName
, ex
);
}
}
}
根据类型自动装配:
首先得到 所有需要装配的非简单属性 ,(不是字符串等简单类型)也就是Bean类型的属性,并返回检查此属性的set方法,存在的时候才可自动装配resolveDependency, 通过Type解析依赖关系,返回依赖的Bean实例 (找到所有类型为此Type的Bean,如果个数不为1,则抛出错误),具体的方法分析见下篇。记录依赖关系
第4-4步: @Autowired注解方式的属性注入(InstantiationAwareBeanPostProcessor),见下篇分析
第5步:initializeBean初始化
protected Object
initializeBean(final String beanName
, final Object bean
, RootBeanDefinition mbd
) {
if (System
.getSecurityManager() != null
) {
AccessController
.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object
run() {
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
;
}
此方法包括的操作有:
invokeAwareMethodsapplyBeanPostProcessorsBeforeInitializationinvokeInitMethodsapplyBeanPostProcessorsAfterInitialization
第5-1步:invokeAwareMethods
private void invokeAwareMethods(final String beanName
, final Object bean
) {
if (bean
instanceof Aware) {
if (bean
instanceof BeanNameAware) {
((BeanNameAware
) bean
).setBeanName(beanName
);
}
if (bean
instanceof BeanClassLoaderAware) {
((BeanClassLoaderAware
) bean
).setBeanClassLoader(getBeanClassLoader());
}
if (bean
instanceof BeanFactoryAware) {
((BeanFactoryAware
) bean
).setBeanFactory(AbstractAutowireCapableBeanFactory
.this);
}
}
}
这一步的目的是让开发者得到BeanFactory中的一些属性:BeanName、BeanClassLoader、BeanFactory
spring Aware是什么? spring IOC的特点是开发者对于spring容器是无感知的,而aware的意义却是"有感知"的。当我们在项目中需要用到spring容器本身的一些资源时,就需要用到spring提供的Aware接口。实现类有以下几个:BeanNameAware:获取容器中 Bean 的名称;BeanFactoryAware:获取当前 BeanFactory;ApplicationContextAware:获取当前ApplicationContext;MessageSourceAware:获取 Message Source 相关文本信息;ApplicationEventPublisherAware:发布事件;ResourceLoaderAware:获取资源加载器,获取外部资源文件。
第5-2步:applyBeanPostProcessorsBeforeInitialization
public Object
applyBeanPostProcessorsBeforeInitialization(Object existingBean
, String beanName
)
throws BeansException
{
Object result
= existingBean
;
for (BeanPostProcessor beanProcessor
: getBeanPostProcessors()) {
result
= beanProcessor
.postProcessBeforeInitialization(result
, beanName
);
if (result
== null
) {
return result
;
}
}
return result
;
}
在此方法中获取全部的BeanPostProcessor,然后遍历执行其postProcessBeforeInitialization方法。
第5-3步:invokeInitMethods初始化方法(InitializingBean实现类或自定义init-method)
protected void invokeInitMethods(String beanName
, final Object bean
, RootBeanDefinition mbd
)
throws Throwable
{
boolean isInitializingBean
= (bean
instanceof InitializingBean);
if (isInitializingBean
&& (mbd
== null
|| !mbd
.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger
.isDebugEnabled()) {
logger
.debug("Invoking afterPropertiesSet() on bean with name '" + beanName
+ "'");
}
if (System
.getSecurityManager() != null
) {
try {
AccessController
.doPrivileged(new PrivilegedExceptionAction<Object>() {
@Override
public Object
run() throws Exception
{
((InitializingBean
) bean
).afterPropertiesSet();
return null
;
}
}, getAccessControlContext());
}
catch (PrivilegedActionException pae
) {
throw pae
.getException();
}
}
else {
((InitializingBean
) bean
).afterPropertiesSet();
}
}
if (mbd
!= null
) {
String initMethodName
= mbd
.getInitMethodName();
if (initMethodName
!= null
&& !(isInitializingBean
&& "afterPropertiesSet".equals(initMethodName
)) &&
!mbd
.isExternallyManagedInitMethod(initMethodName
)) {
invokeCustomInitMethod(beanName
, bean
, mbd
);
}
}
}
在方法中
首先找到InitializingBean类型的Bean,调用其afterPropertiesSet方法通过反射调用自定义的Init-Method
第5-4步:applyBeanPostProcessorsAfterInitialization
public Object
applyBeanPostProcessorsAfterInitialization(Object existingBean
, String beanName
)
throws BeansException
{
Object result
= existingBean
;
for (BeanPostProcessor beanProcessor
: getBeanPostProcessors()) {
result
= beanProcessor
.postProcessAfterInitialization(result
, beanName
);
if (result
== null
) {
return result
;
}
}
return result
;
}
在此方法中获取全部的BeanPostProcessor,然后遍历执行其postProcessAfterInitialization方法。
第6步:依赖检查
这一步没看懂。。
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<String>(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.");
}
}
}
}
附1:自动装配
自动装配的意义在于,在xml中声明Bean之间的依赖关系; spring提供了4种自动装配的形式:
NO:必须使用"ref"来声明依赖关系
public class Animal {
private Cat cat
;
public Cat
getCat() {
return this.cat
;
}
public void setCat(Cat cat
) {
this.cat
= cat
;
}
}
public class Cat {
public String
toString() {
return "miao";
}
}
<bean id
="Animal" class="example.autowire.Animal">
<property name
="cat" ref
="cat"></property
>
</bean
>
<bean id
="cat" class="example.autowire.Cat"/>
ByName:把与Bean的属性具有 相同名字 的其他Bean自动装配到Bean的对应属性中
<bean id
="Animal" class="example.autowire.Animal" autowire
="byName">
</bean
>
<bean id
="cat" class="example.autowire.Cat"/>
ByType:把与Bean的属性具有 相同类型 的其他Bean自动装配到Bean的对应属性中
<bean id
="Animal" class="example.autowire.Animal" autowire
="byType">
<!--<property name
="cat" ref
="cat"></property
>-->
</bean
>
<bean id
="cat" class="example.autowire.Cat"/>
Constructor:把与Bean的 构造器入参 具有 相同类型 的其他Bean自动装配到Bean构造器的对应入参中
public class Animal {
private Cat cat
;
public Animal(Cat cat
) {
this.cat
= cat
;
}
public Cat
getCat() {
return this.cat
;
}
public void setCat(Cat cat
) {
this.cat
= cat
;
}
}
<bean id
="Animal" class="example.autowire.Animal" autowire
="constructor">
</bean
>
<bean id
="cat" class="example.autowire.Cat"/>
注意byName和byType的类型,都是使用默认构造器创建实例,然后使用setter进行属性的注入;而constructor是直接根据带参数的构造函数创建实例。本章中的第1-3步是指constructor类型。 默认情况下,default-autowire属性被设置为none,表示所有的Bean都不使用自动装配。 现在我们在工程中很少使用上述方法,而是使用@Autowired注解的方式。
附2:SmartInstantiationAwareBeanPostProcessor
该接口继承自InstantiationAwareBeanPostProcessor,除了继承的5个方法外,自己扩展了三个方法:
public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
Class
<?> predictBeanType(Class
<?> beanClass
, String beanName
) throws BeansException
;
Constructor
<?>[] determineCandidateConstructors(Class
<?> beanClass
, String beanName
) throws BeansException
;
Object
getEarlyBeanReference(Object bean
, String beanName
) throws BeansException
;
}
这是一个专用的接口,一般在框架内使用。通常应用程序提供的后处理器应该简单地实现普通的BeanPostProcessor接口,或者从InstantiationAwareBeanPostProcessorAdapter类派生。
predictBeanType 预测bean的类型,在beanFactory的getType时被调用。determineCandidateConstructors 该方法可以返回要用于beanClass的候选构造函数getEarlyBeanReference 获取对指定bean的早期访问的引用,通常用于解析循环引用。
附3:MergedBeanDefinitionPostProcessor
该接口继承自BeanPostProcessor,除了继承的3个方法外,自己扩展了一个方法:
public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {
void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition
, Class
<?> beanType
, String beanName
);
}
此方法对MergedBeanDefinition进行修改,即对合并后的 bean定义 进行后期处理,@Autowired通过此方法实现注入类型的预解析。