Spring 5 DefaultListableBeanFactory— isAutowireCandidate源码分析
原文链接:
isAutowireCandidate(String , DependencyDescriptor )
确定指定的bean定义是否可以自动注入:
- 获取此BeanFactory的自动装配候选解析器
交由isAutowireCandidate(String, DependencyDescriptor, AutowireCandidateResolver) 处理并将结果返回出去
/**
* 确定指定的bean定义是否可以自动注入
* @param beanName the name of the bean to check -- 要检查的bean名
* @param descriptor the descriptor of the dependency to resolve -- 要解决的依赖项的描述符
* @return 是否应将bean视为自动装配候选对象
* @throws NoSuchBeanDefinitionException 如果没有给定名称的bean
*/
@Override
public boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)
throws NoSuchBeanDefinitionException {
return isAutowireCandidate(beanName, descriptor, getAutowireCandidateResolver());
}
isAutowireCandidate(String, DependencyDescriptor, AutowireCandidateResolver)
确定指定的bean定义是否可以自动注入:
解决beanName存在于该工厂的情况:
- 去除开头的
’&'
字符,返回剩余的字符串作为转换后的Bean名称【全类名】【变量 beanDefinitionName】 - 如果工厂包含
beanDefinitionName
的BeanDefinition
对象,就确定beanDefinitionName
的合并后RootBeanDefinition
是否符合自动装配候选条件,以注入到声明匹配类型依赖项的其他bean中并将结果返回出去 - 如果
beanName
在该BeanFactory
的单例对象的高速缓存Map集合【DefaultSingletonBeanRegistry.singletonObjects
】中, 获取beanName
的Class
对象,从而构建出RootBeanDefinition
实例对象,最后确定该RootBeanDefinition
实例对象是否符合自动装 配候选条件,以注入到声明匹配类型依赖项的其他bean
中并将结果返回出去
- 解决beanName存在于该工厂的父工厂的情况:
- 获取父工厂【变量 parent】
- 如果父工厂是
DefaultListableBeanFactory
的实例对象,递归交由父工厂的该方法处理并将结果返回 - 如果父工厂是
ConfigurableListableBeanFactory
的实例对象,就递归交由父工厂的isAutowireCandidate(String, DependencyDescriptor)
进行处理并将结果返回出去
如果上面各种情况都没有涉及,默认是返回true,表示应将bean视为自动装配候选对象
/**
* <p>确定指定的bean定义是否可以自动注入 </p>
* Determine whether the specified bean definition qualifies as an autowire candidate,
* to be injected into other beans which declare a dependency of matching type.
* <p>确定指定的bean定义是否符合自动装配候选条件,以注入到声明匹配类型依赖项的其他bean中。</p>
* @param beanName the name of the bean definition to check
* -- 要检查的beanDefinition名称
* @param descriptor the descriptor of the dependency to resolve
* -- 要解析的依赖项的描述符
* @param resolver the AutowireCandidateResolver to use for the actual resolution algorithm
* -- AutowireCandidateResolver用于实际的解析算法
* @return whether the bean should be considered as autowire candidate
* -- 是否应将bean视为自动装配候选对象
* @see #isAutowireCandidate(String, RootBeanDefinition, DependencyDescriptor, AutowireCandidateResolver)
*/
protected boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor, AutowireCandidateResolver resolver)
throws NoSuchBeanDefinitionException {
// 去除开头的'&'字符,返回剩余的字符串作为转换后的Bean名称【全类名】
String beanDefinitionName = BeanFactoryUtils.transformedBeanName(beanName);
// 如果工厂包含beanDefinitionName得BeanDefinition对象
if (containsBeanDefinition(beanDefinitionName)) {
// 确定beanDefinitionName的合并后RootBeanDefinition是否符合自动装配候选条件,
// 以注入到声明匹配类型依赖项的其他bean中.并将结果返回出去
return isAutowireCandidate(beanName, getMergedLocalBeanDefinition(beanDefinitionName), descriptor, resolver);
}
//这里应该是直接调用registerSingeton(String,Object)方法的情况
//如果beanName在该BeanFactory的singletonObjects【单例对象的高速缓存Map集合】中
else if (containsSingleton(beanName)) {
//获取beanName的Class对象,从而构建出RootBeanDefinition实例对象,最后确定该RootBeanDefinition实例对象是否符合自动装
// 配候选条件,以注入到声明匹配类型依赖项的其他bean中并将结果返回出去
return isAutowireCandidate(beanName, new RootBeanDefinition(getType(beanName)), descriptor, resolver);
}
//获取父工厂
BeanFactory parent = getParentBeanFactory();
//如果父工厂是DefaultListableBeanFactory的实例对象
if (parent instanceof DefaultListableBeanFactory) {
// No bean definition found in this factory -> delegate to parent.
// 在该工厂中找不到BeanDefinition ->委托给父对象
// 递归交由父工厂处理并将结果返回
return ((DefaultListableBeanFactory) parent).isAutowireCandidate(beanName, descriptor, resolver);
}
//如果父工厂是ConfigurableListableBeanFactory的实例对象
else if (parent instanceof ConfigurableListableBeanFactory) {
// If no DefaultListableBeanFactory, can't pass the resolver along.
// 如果没有DefaultLisableBeanFactory,则无法传递解析器
// 这个时候,由于ConfigurableListableBeanFactory没有提供isAutowireCandidate(String, DependencyDescriptor, AutowireCandidateResolver)的
// 重载方法,所以递归交由父工厂的isAutowireCandidate(String, DependencyDescriptor)进行处理并将结果返回出去
return ((ConfigurableListableBeanFactory) parent).isAutowireCandidate(beanName, descriptor);
}
else {
//如果上面各种情况都没有涉及,默认是返回true,表示应将bean视为自动装配候选对象
return true;
}
}
isAutowireCandidate(String, RootBeanDefinition, DependencyDescriptor, AutowireCandidateResolver)
确定mbd可以自动注入到descriptor所包装的field/methodParam中:
- 去除开头的’&’字符,返回剩余的字符串作为转换后的Bean名称【可能是全类名】【变量 beanDefinitionName】
- 为mdb解析出对应的bean class对象
- 如果mbd指明了引用非重载方法的工厂方法名称【RootBeanDefinition.isFactoryMethodUnique】 且 mbd还没有缓存 用于自省的唯一工厂方法候选【RootBeanDefinition.factoryMethodToIntrospect】:如果可能,新建一个ConstuctorResolver 对象来解析mbd中factory方法
- 根据mbd,beanName,beanDefinitionName的别名构建一个BeanDefinitionHolder实例,交给resolver进行判断, 是否可以自动注入并将结果返回出去。resolver的判断依据还是看mdb的AbstractBeanDefinition.isAutowireCandidate()结果。
————————————————
[
](https://blog.csdn.net/qq_30321211/article/details/108362842)
/**
* <p>
* 确定mbd可以自动注入到descriptor所包装的field/methodParam中
* </p>
* Determine whether the specified bean definition qualifies as an autowire candidate,
* to be injected into other beans which declare a dependency of matching type.
* <p>确定指定的bean定义是否符合自动装配候选条件,以注入到声明匹配类型依赖项的其他bean中。</p>
* @param beanName the name of the bean definition to check -- 要检查的beanDefinition名
* @param mbd the merged bean definition to check -- 要检查的合并后BeanDefinition
* @param descriptor the descriptor of the dependency to resolve -- 要解析的依赖项的描述符
* @param resolver the AutowireCandidateResolver to use for the actual resolution algorithm
* -- AutowireCandidateResolver用于实际的分析算法
* @return whether the bean should be considered as autowire candidate
* -- 是否应将bean视为自动装配候选对象
*/
protected boolean isAutowireCandidate(String beanName, RootBeanDefinition mbd,
DependencyDescriptor descriptor, AutowireCandidateResolver resolver) {
//去除开头的'&'字符,返回剩余的字符串作为转换后的Bean名称【可能是全类名】
String beanDefinitionName = BeanFactoryUtils.transformedBeanName(beanName);
//为mdb解析出对应的bean class对象
resolveBeanClass(mbd, beanDefinitionName);
//如果mbd指明了引用非重载方法的工厂方法名称 且 mbd还没有缓存用于自省的唯一工厂方法候选
if (mbd.isFactoryMethodUnique && mbd.factoryMethodToIntrospect == null) {
//如果可能,新建一个ConstuctorResolver对象来解析mbd中factory方法
new ConstructorResolver(this).resolveFactoryMethodIfPossible(mbd);
}
// 根据mbd,beanName,beanDefinitionName的别名构建一个BeanDefinitionHolder实例,交给resolver进行判断
// 是否可以自动注入。resolver的判断依据还是看mdb的isAutowireCandidate()结果。这个需要看BeanDefinition的结果
return resolver.isAutowireCandidate(
new BeanDefinitionHolder(mbd, beanName, getAliases(beanDefinitionName)), descriptor);
}
其中 BeanDefinition
的autowireCandidate
属性是在创建BeanDefinition的阶段就默认是true的,可以参考下面的这个博客