前言
Spring是管理Bean的容器,Spring容器初始化的时候注册了BeanDefinition,getBean通过容器中的BeanDefinition来生成对应实例,我们简单了解下getBean的流程
一、BeanFactory
getBean方法定义在BeanFactory接口里面,有根据bean的name查找,也有根据Class类型查找
Object getBean(String name)
<T> T getBean(Class<T> requiredType)
我们看下根据bean的name查询创建实例的流程
二、AbstractBeanFactory
1.doGetBean
getBean首先调用进入到AbstractBeanFactory doGetBean方法里面
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);
Object bean;
// Eagerly check singleton cache for manually registered singletons.
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 {
// Fail if we're already creating this bean instance:
// We're assumably within a circular reference.
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
// Check if bean definition exists in this factory.
BeanFactory parentBeanFactory = getParentBeanFactory();
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
// Not found -> check parent.
String nameToLookup = originalBeanName(name);
if (parentBeanFactory instanceof AbstractBeanFactory) {
return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
nameToLookup, requiredType, args, typeCheckOnly);
}
else if (args != null) {
// Delegation to parent with explicit args.
return (T) parentBeanFactory.getBean(nameToLookup, args);
}
else if (requiredType != null) {
// No args -> delegate to standard getBean method.
return parentBeanFactory.getBean(nameToLookup, requiredType);
}
else {
return (T) parentBeanFactory.getBean(nameToLookup);
}
}
/**
* 获取FactoryBean 时是true
*/
if (!typeCheckOnly) {
markBeanAsCreated(beanName);
}
try {
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
checkMergedBeanDefinition(mbd, beanName, args);
// Guarantee initialization of beans that the current bean depends on.
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);
}
}
}
// Create bean instance.
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
// Explicitly remove instance from singleton cache: It might have been put there
// eagerly by the creation process, to allow for circular reference resolution.
// Also remove any beans that received a temporary reference to the bean.
destroySingleton(beanName);
throw ex;
}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
else if (mbd.isPrototype()) {
// It's a prototype -> create a new instance.
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;
}
}
// Check if required type matches the type of the actual bean instance.
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;
}
内容比较多,主要流程是这样的
- 转换一下Bean的name
doGetBean
方法第4行调用了transformedBeanName
,为啥getBean过程中先要有这一步操作呢,我们想想如果你传的是Bean 的别名呢 - getSingleton 获取单例bean实例
这个方法调用了DefaultSingletonBeanRegistry
类获取实例的方法
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
/**
* bean创建过程中 会打上singletonsCurrentlyInCreation标记
* 三级缓存 解决 AOP对象可能被代理
*/
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
// 装配早期 addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); 没有填充属性
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}
getSingleton整体流程是这样的从几个缓存对象里面获取对象
- getSingleton第2行代码从
singletonObjects
中获取对象实例,这个是存Bean的完整实例,在Bean创建后期所有流程都走完,bean的属性也填充好之后调用addSingleton
方法将Bean的完整实例存入singletonObjects
中,或者直接调用registerSingleton
注册一个单例对象,总之singletonObjects
这里存的就是一个完整的Bean实例(该有的功能属性都有了) - 第7行如果完整实例不存在,则尝试从其它缓存实例中拿到对象,当中的
isSingletonCurrentlyInCreation
什么意思呢,这里正在创建的单例bean都会打上这个标记(在Object getSingleton(String beanName, ObjectFactory<?> singletonFactory)
方法里面),创建完Bean实例后再清楚这个标记 allowEarlyReference
这个值的属性我们在按Bean的name获取bean时默认是true,也就是要get的单例bean正在创建的话会走到if里面的流程,去尝试从earlySingletonObjects
中获取早期保留的bean实例(这时候拿到的bean没有完整的属性,因为bean实例没有完全创建好,不过这没关系,Bean实例的地址没错就对了),开始earlySingletonObjects
这个对象也是拿不到对象的因为要在16行才能给这个早期bean实例map塞值进去- 解析来再看看
singletonFactories
,这个是在AbstractAutowireCapableBeanFactory
创建bean实例的doCreateBean
方法里面赋值的,在这之后还有填充Bean实例属性(populateBean
),调用Aware适配器接口(invokeAwareMethods
),初始化逻辑(invokeInitMethods
),虽然Bean实例还没完全创建完成(只是Bean实例的属性未填充),但先可以暴露出去(不用等到Bean实例完全创建好其它Bean才能引用,这样可以节省其它bean创建所需的事件)
-
获取Bean实例后有两个分支,我们先来看看Bean实例不为空并且getBean未传入除bean的name以外其它参数的情况
这里调用了getObjectForBeanInstance
方法,注意下后面的流程也有可能调用到这个方法,这里调用的时候第4个参数传的是null,这个方法里面如果是对应的bean是FactoryBean 则调用getObject方法拿到实例对象 -
接下来是Bean实例不存在,或者getBean传递了其它参数的情况,第一次getBean的时候Bean实例一般是不存在的我们看看后面else里面的逻辑
doGetBean 第27至29行检测了Bean是否正在创建,单例bean创建不涉及
第32至51行 如果当前容器不存在Bean,父容器存在的话到父容器去getBean如果能拿到Bean实例直接返回了
第56至58行标记一个状态,获取工厂beantypeCheckOnly
传的是true,一般Bean是否false,markBeanAsCreated方法里面主要是标记作用,
如果mergedBeanDefinitions
不包含当前BeanDefinition ,bean的stale
属性设为true,alreadyCreated
添加正在创建的bean定义
第61行getMergedLocalBeanDefinition
处理合并Bean定义,mergedBeanDefinitions
开始是没有值的所以第一个getBean进入的是getMergedBeanDefinition
分支,这里面如果Bean有parentName属性的话就会合并
protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {
RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);
if (mbd != null && !mbd.stale) {
return mbd;
}
return getMergedBeanDefinition(beanName, getBeanDefinition(beanName));
}
第65至81行如果有依赖的Bean的话,将Bean直接的依赖关系记录到DefaultSingletonBeanRegistry
并且先实例化对应Bean
DefaultSingletonBeanRegistry 有dependentBeanMap
dependenciesForBeanMap
两个Map记录依赖关系,
dependentBeanMap 记录的是Key值代表的Bean被其他多少bean依赖,dependenciesForBeanMap记录的是Key值代表的Bean依赖其它多少Bean
接下来就是创建Bean的流程,我们直接看下84至96行创建单例bean的逻辑,还是先调用getSingleton
获取完整Bean的实例(else逻辑分支里面有一种请求就是前面已经获取到了实例但是getBean还带了其它参数),如果没有实例就调用createBean方法创建,
if (mbd.isSingleton()) {
/**
* DefaultSingletonBeanRegistry getBean 调用这里的Lambda函数创建bean实例
*/
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
// Explicitly remove instance from singleton cache: It might have been put there
// eagerly by the creation process, to allow for circular reference resolution.
// Also remove any beans that received a temporary reference to the bean.
destroySingleton(beanName);
throw ex;
}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
正常情况下第一次getBean的情况下都会走到createBean
的逻辑里面,在这个里面创建实例,在Bean实例创建完成后调用addSingleton方法
将创建好的实例添加到DefaultSingletonBeanRegistry
缓存中,跟踪代码我们发现这里的createBean交给了AbstractAutowireCapableBeanFactory
实现
三 AbstractAutowireCapableBeanFactory createBean流程
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;
// Make sure bean class is actually resolved at this point, and
// clone the bean definition in case of a dynamically resolved Class
// which cannot be stored in the shared merged bean definition.
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
// Prepare method overrides.
try {
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName, "Validation of method overrides failed", ex);
}
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
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) {
// A previously detected exception with proper bean creation context already,
// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException(
mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
}
}
根据Bean定义来创建bean的实例
- 第7行重新定义了一个RootBeanDefinition 来作为后续创建bean的参数(创建bean过程中可能可能重新设置Bean的beanClass属性)
- 第12至16行resolveBeanClass解析原来Bean定义里的beanClass,这个字段属性值有可能是字符串,SpringEL表达式,当然也可能直接就是Class实例,如果不是Class实例就要进入if条件里面重新设置解析后的beanClass
- 第20行处理 lookup-method 和 replace-method 配置,这两个配置spring会解析成bean的methodOverrides属性
- 解下来第29行
resolveBeforeInstantiation
,看字幕意思Instantiation之前resolve,这里给了个几乎让容器中实现了InstantiationAwareBeanPostProcessor
接口的后处理器实现来扩展
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point.
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
- resolveBeforeInstantiation 方法第4行这个if条件第一次getBean的时候默认是null,条件满足,第6行两个条件synthetic默认是false,Spring容器中显然有这个后处理器,所有这个条件也是能进来的
- 第7行拿到准备交给后处理器扩展的类,对于这个determineTargetType跟踪源码可以看到,会先尝试获取BeanDefinition的
resolvedTargetType
(默认是没值,解析后就可能赋值),targetType
泛型类获取target类,都没有的话从工厂方法获取target类,最后才是前面提到的resolveBeanClass
拿到BeanDefinition的beanClass
(一般情况下注册的bean这个属性都是Class实例)
protected Class<?> determineTargetType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
Class<?> targetType = mbd.getTargetType();
if (targetType == null) {
targetType = (mbd.getFactoryMethodName() != null ?
getTypeForFactoryMethod(beanName, mbd, typesToMatch) :
resolveBeanClass(mbd, beanName, typesToMatch));
if (ObjectUtils.isEmpty(typesToMatch) || getTempClassLoader() == null) {
mbd.resolvedTargetType = targetType;
}
}
return targetType;
}
public Class<?> getTargetType() {
if (this.resolvedTargetType != null) {
return this.resolvedTargetType;
}
ResolvableType targetType = this.targetType;
return (targetType != null ? targetType.resolve() : null);
}
- 然后调用容器中实现了InstantiationAwareBeanPostProcessor接口的bean后处理applyBeanPostProcessorsBeforeInstantiation方法(接口默认方法是返回null)来增强前面拿到的bean解析的类
容器中重写了postProcessBeforeInstantiation方法的后处理器 | postProcessBeforeInstantiation方法返回 |
---|---|
AbstractAutoProxyCreator | 会生成AOP代理类 |
CommonAnnotationBeanPostProcessor | 返回null |
PersistenceAnnotationBeanPostProcessor | 返回null |
ScriptFactoryPostProcessor | 被代理的类是ScriptFactory子类返回不为null |
- 经过applyBeanPostProcessorsBeforeInstantiation增强处理后返回不为null后再调用Bean后处理的
postProcessAfterInitialization
方法(这个是BeanPostProcessor
定义的方法所有Bean后处理都会继承这个接口)
- 上一步提到的
resolveBeforeInstantiation
针对于aop场景下代理的类可能就直接交由对应Bean后处理器创建代理类返回了,其它情况还是要继续doCreateBean创建Bean实例
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// Instantiate the bean.
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;
}
// Allow post-processors to modify the merged bean definition.
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;
}
}
// Eagerly cache singletons to be able to resolve circular references
// even when triggered by lifecycle interfaces like BeanFactoryAware.
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));
}
// Initialize the bean instance.
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;
}
doCreateBean流程分析
- 第5到11行拿到一个BeanWrapper ,没有就创建
- 第12到16行拿到BeanWrapper包装的wrappedObject 和对应Class并设置到Bean定义的resolvedTargetType属性
- 第19到30行 容器中实现了
MergedBeanDefinitionPostProcessor
接口的Bean后处理器postProcessMergedBeanDefinition
方法对前面的resolvedTargetType增强处理,这里注意是通过后处理器处理spring中的一些注解注入
- 第34到41行暴露一个Bean实例的早期对象到
DefaultSingletonBeanRegistry
(要满足创建的Bean是单例bean,允许循环依赖,bean正在创建三个条件) - 第45到58行填充Bea的实例并初始化
- 第60到85行
- 第89行 注册一个DisposableBeanAdapter 到
DefaultSingletonBeanRegistry
的disposableBeans
key是当前创建Bean的name来管理bean的销毁,销毁bean destroySingleton方法调用了DisposableBean的destory方法
- 第34到41行暴露一个Bean实例的早期对象到
- 返回创建好的实例
createBeanInstance
前面有提到这个方法,这里创建了一个BeanWrapper包装bean的实例
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
// Make sure bean class is actually resolved at this point.
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);
}
// Shortcut when re-creating the same bean...
boolean resolved = false;
boolean autowireNecessary = false;
if (args == null) {
synchronized (mbd.constructorArgumentLock) {
/**
* ConstructorResolver 设值
*/
if (mbd.resolvedConstructorOrFactoryMethod != null) {
resolved = true;
autowireNecessary = mbd.constructorArgumentsResolved;
}
}
}
if (resolved) {
if (autowireNecessary) {
return autowireConstructor(beanName, mbd, null, null);
}
else {
return instantiateBean(beanName, mbd);
}
}
// Candidate constructors for autowiring?
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}
// Preferred constructors for default construction?
ctors = mbd.getPreferredConstructors();
if (ctors != null) {
return autowireConstructor(beanName, mbd, ctors, null);
}
// No special handling: simply use no-arg constructor.
return instantiateBean(beanName, mbd);
}
- createBeanInstance第10到13行通过Bean的Supplier接口创建实例
- 第14到16行通过工厂方法来创建bean实例
工厂方法创建Bean实例的代码实例
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
">
<!--配置静态工厂创建Car对象-->
<bean id="bean1" class="com.dlh.spring.StaticFactory" factory-method="getBean">
</bean>
<bean id="instanceFactory" class="com.dlh.spring.InstanceFactory"></bean>
<!--通过实例工厂对象创建car对象-->
<bean id="bean2" factory-bean="instanceFactory" factory-method="getBean" >
</bean>
<bean id="demo" class="com.dlh.spring.StructureDemo">
<constructor-arg ref="bean1"> </constructor-arg>
</bean>
</beans>
public class StaticFactory {
public static Bean getBean(){
Bean bean = new Bean();
bean.setDesc("这个是由静态工厂创建");
return bean;
}
}
public class InstanceFactory {
public InstanceFactory() {
}
public Bean getBean(){
Bean bean = new Bean();
bean.setDesc("这个是由实例工厂创建");
return bean;
}
}
- 如果也没有指定工厂方法的话,那就老老实实根据构造函数来创建Bean实例了,后面都是根据构造函数来创建Bean实例的逻辑
对应getBean入参不为空的情况
代码从第42行开始执行先获取Bean后处理器扩展的构造函数
第43行的条件如果getBean有入参,或者BeanDefinition的constructorArgumentValues属性有值都会调用autowireConstructor
第49行对应RootBeanDefinition拿到的构造函数是null
55行就是就用无参构造函数来创建实例了
第32至39行 resolved条件依然是false
总结
本文简单总结了下Spring容器getBean的流程,具体根据工厂方法,构造函数创建bean,Bean属性填充的流程还得细看下