@Autowired依赖注入
本文源码基于spring-framework-5.3.10。 源码位置:org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(PropertyValues, Object, String) 他在Bean的生命周期的实例化后之后,初始化前(或者说各种Aware回调之前)之前调用。
@Autowired依赖注入的大致流程
寻找注入点:被@Autowired注解的方法和字段 遍历每个注入点 根据注入点类型去寻找bean:属性的类型、方法参数的类型 找到一个Bean进行注入。没有找到Bean,如果是必填的,抛异常。找到多个Bean,去取出唯一的Bean 判断是不是isAutowireCandidate 判断是不是数组、Map、列表… 这时候如果还有多个:取@Primary标注了的Bean 这时候如果还有多个:取优先级最高的Bean 这时候如果还有多个:根据名字(属性就是属性的名字,方法是参数的名字)筛选出唯一一个
@Autowired依赖注入源码分析
public PropertyValues postProcessProperties ( PropertyValues pvs, Object bean, String beanName) {
InjectionMetadata metadata = findAutowiringMetadata ( beanName, bean. getClass ( ) , pvs) ;
try {
metadata. inject ( bean, beanName, pvs) ;
}
catch ( BeanCreationException ex) {
throw ex;
}
catch ( Throwable ex) {
throw new BeanCreationException ( beanName, "Injection of autowired dependencies failed" , ex) ;
}
return pvs;
}
public void inject ( Object target, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {
Collection < InjectedElement > checkedElements = this . checkedElements;
Collection < InjectedElement > elementsToIterate =
( checkedElements != null ? checkedElements : this . injectedElements) ;
if ( ! elementsToIterate. isEmpty ( ) ) {
for ( InjectedElement element : elementsToIterate) {
element. inject ( target, beanName, pvs) ;
}
}
}
@Autowired针对字段的注入方式
protected void inject ( Object bean, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {
Field field = ( Field ) this . member;
Object value;
if ( this . cached) {
try {
value = resolvedCachedArgument ( beanName, this . cachedFieldValue) ;
}
catch ( NoSuchBeanDefinitionException ex) {
value = resolveFieldValue ( field, bean, beanName) ;
}
}
else {
value = resolveFieldValue ( field, bean, beanName) ;
}
if ( value != null ) {
ReflectionUtils . makeAccessible ( field) ;
field. set ( bean, value) ;
}
}
private Object resolveFieldValue ( Field field, Object bean, @Nullable String beanName) {
DependencyDescriptor desc = new DependencyDescriptor ( field, this . required) ;
desc. setContainingClass ( bean. getClass ( ) ) ;
Set < String > autowiredBeanNames = new LinkedHashSet < > ( 1 ) ;
Assert . state ( beanFactory != null , "No BeanFactory available" ) ;
TypeConverter typeConverter = beanFactory. getTypeConverter ( ) ;
Object value;
try {
value = beanFactory. resolveDependency ( desc, beanName, autowiredBeanNames, typeConverter) ;
}
catch ( BeansException ex) {
throw new UnsatisfiedDependencyException ( null , beanName, new InjectionPoint ( field) , ex) ;
}
synchronized ( this ) {
if ( ! this . cached) {
Object cachedFieldValue = null ;
if ( value != null || this . required) {
cachedFieldValue = desc;
registerDependentBeans ( beanName, autowiredBeanNames) ;
if ( autowiredBeanNames. size ( ) == 1 ) {
String autowiredBeanName = autowiredBeanNames. iterator ( ) . next ( ) ;
if ( beanFactory. containsBean ( autowiredBeanName) &&
beanFactory. isTypeMatch ( autowiredBeanName, field. getType ( ) ) ) {
cachedFieldValue = new ShortcutDependencyDescriptor (
desc, autowiredBeanName, field. getType ( ) ) ;
}
}
}
this . cachedFieldValue = cachedFieldValue;
this . cached = true ;
}
}
return value;
}
@Autowired针对方法的注入方式
protected void inject ( Object bean, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {
if ( checkPropertySkipping ( pvs) ) {
return ;
}
Method method = ( Method ) this . member;
Object [ ] arguments;
if ( this . cached) {
try {
arguments = resolveCachedArguments ( beanName) ;
}
catch ( NoSuchBeanDefinitionException ex) {
arguments = resolveMethodArguments ( method, bean, beanName) ;
}
}
else {
arguments = resolveMethodArguments ( method, bean, beanName) ;
}
if ( arguments != null ) {
try {
ReflectionUtils . makeAccessible ( method) ;
method. invoke ( bean, arguments) ;
}
catch ( InvocationTargetException ex) {
throw ex. getTargetException ( ) ;
}
}
}
private Object [ ] resolveMethodArguments ( Method method, Object bean, @Nullable String beanName) {
int argumentCount = method. getParameterCount ( ) ;
Object [ ] arguments = new Object [ argumentCount] ;
DependencyDescriptor [ ] descriptors = new DependencyDescriptor [ argumentCount] ;
Set < String > autowiredBeans = new LinkedHashSet < > ( argumentCount) ;
Assert . state ( beanFactory != null , "No BeanFactory available" ) ;
TypeConverter typeConverter = beanFactory. getTypeConverter ( ) ;
for ( int i = 0 ; i < arguments. length; i++ ) {
MethodParameter methodParam = new MethodParameter ( method, i) ;
DependencyDescriptor currDesc = new DependencyDescriptor ( methodParam, this . required) ;
currDesc. setContainingClass ( bean. getClass ( ) ) ;
descriptors[ i] = currDesc;
try {
Object arg = beanFactory. resolveDependency ( currDesc, beanName, autowiredBeans, typeConverter) ;
if ( arg == null && ! this . required) {
arguments = null ;
break ;
}
arguments[ i] = arg;
}
catch ( BeansException ex) {
throw new UnsatisfiedDependencyException ( null , beanName, new InjectionPoint ( methodParam) , ex) ;
}
}
synchronized ( this ) {
if ( ! this . cached) {
if ( arguments != null ) {
DependencyDescriptor [ ] cachedMethodArguments = Arrays . copyOf ( descriptors, arguments. length) ;
registerDependentBeans ( beanName, autowiredBeans) ;
if ( autowiredBeans. size ( ) == argumentCount) {
Iterator < String > it = autowiredBeans. iterator ( ) ;
Class < ? > [ ] paramTypes = method. getParameterTypes ( ) ;
for ( int i = 0 ; i < paramTypes. length; i++ ) {
String autowiredBeanName = it. next ( ) ;
if ( beanFactory. containsBean ( autowiredBeanName) &&
beanFactory. isTypeMatch ( autowiredBeanName, paramTypes[ i] ) ) {
cachedMethodArguments[ i] = new ShortcutDependencyDescriptor (
descriptors[ i] , autowiredBeanName, paramTypes[ i] ) ;
}
}
}
this . cachedMethodArguments = cachedMethodArguments;
}
else {
this . cachedMethodArguments = null ;
}
this . cached = true ;
}
}
return arguments;
}
获取要注入的值外部方法:resolveDependency源码分析
public Object resolveDependency ( DependencyDescriptor descriptor, @Nullable String requestingBeanName,
@Nullable Set < String > autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {
descriptor. initParameterNameDiscovery ( getParameterNameDiscoverer ( ) ) ;
if ( Optional . class == descriptor. getDependencyType ( ) ) {
return createOptionalDependency ( descriptor, requestingBeanName) ;
}
else if ( ObjectFactory . class == descriptor. getDependencyType ( ) ||
ObjectProvider . class == descriptor. getDependencyType ( ) ) {
return new DependencyObjectProvider ( descriptor, requestingBeanName) ;
}
else if ( javaxInjectProviderClass == descriptor. getDependencyType ( ) ) {
return new Jsr330Factory ( ) . createDependencyProvider ( descriptor, requestingBeanName) ;
}
else {
Object result = getAutowireCandidateResolver ( ) . getLazyResolutionProxyIfNecessary (
descriptor, requestingBeanName) ;
if ( result == null ) {
result = doResolveDependency ( descriptor, requestingBeanName, autowiredBeanNames, typeConverter) ;
}
return result;
}
}
获取要注入的值内部方法:doResolveDependency源码分析
public Object doResolveDependency ( DependencyDescriptor descriptor, @Nullable String beanName,
@Nullable Set < String > autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {
InjectionPoint previousInjectionPoint = ConstructorResolver . setCurrentInjectionPoint ( descriptor) ;
try {
Object shortcut = descriptor. resolveShortcut ( this ) ;
if ( shortcut != null ) {
return shortcut;
}
Class < ? > type = descriptor. getDependencyType ( ) ;
Object value = getAutowireCandidateResolver ( ) . getSuggestedValue ( descriptor) ;
if ( value != null ) {
if ( value instanceof String ) {
String strVal = resolveEmbeddedValue ( ( String ) value) ;
BeanDefinition bd = ( beanName != null && containsBean ( beanName) ?
getMergedBeanDefinition ( beanName) : null ) ;
value = evaluateBeanDefinitionString ( strVal, bd) ;
}
TypeConverter converter = ( typeConverter != null ? typeConverter : getTypeConverter ( ) ) ;
try {
return converter. convertIfNecessary ( value, type, descriptor. getTypeDescriptor ( ) ) ;
}
catch ( UnsupportedOperationException ex) {
return ( descriptor. getField ( ) != null ?
converter. convertIfNecessary ( value, type, descriptor. getField ( ) ) :
converter. convertIfNecessary ( value, type, descriptor. getMethodParameter ( ) ) ) ;
}
}
Object multipleBeans = resolveMultipleBeans ( descriptor, beanName, autowiredBeanNames, typeConverter) ;
if ( multipleBeans != null ) {
return multipleBeans;
}
Map < String , Object > matchingBeans = findAutowireCandidates ( beanName, type, descriptor) ;
if ( matchingBeans. isEmpty ( ) ) {
if ( isRequired ( descriptor) ) {
raiseNoMatchingBeanFound ( type, descriptor. getResolvableType ( ) , descriptor) ;
}
return null ;
}
String autowiredBeanName;
Object instanceCandidate;
if ( matchingBeans. size ( ) > 1 ) {
autowiredBeanName = determineAutowireCandidate ( matchingBeans, descriptor) ;
if ( autowiredBeanName == null ) {
if ( isRequired ( descriptor) || ! indicatesMultipleBeans ( type) ) {
return descriptor. resolveNotUnique ( descriptor. getResolvableType ( ) , matchingBeans) ;
}
else {
return null ;
}
}
instanceCandidate = matchingBeans. get ( autowiredBeanName) ;
}
else {
Map. Entry < String , Object > entry = matchingBeans. entrySet ( ) . iterator ( ) . next ( ) ;
autowiredBeanName = entry. getKey ( ) ;
instanceCandidate = entry. getValue ( ) ;
}
if ( autowiredBeanNames != null ) {
autowiredBeanNames. add ( autowiredBeanName) ;
}
if ( instanceCandidate instanceof Class ) {
instanceCandidate = descriptor. resolveCandidate ( autowiredBeanName, type, this ) ;
}
Object result = instanceCandidate;
if ( result instanceof NullBean ) {
if ( isRequired ( descriptor) ) {
raiseNoMatchingBeanFound ( type, descriptor. getResolvableType ( ) , descriptor) ;
}
result = null ;
}
if ( ! ClassUtils . isAssignableValue ( type, result) ) {
throw new BeanNotOfRequiredTypeException ( autowiredBeanName, type, instanceCandidate. getClass ( ) ) ;
}
return result;
}
finally {
ConstructorResolver . setCurrentInjectionPoint ( previousInjectionPoint) ;
}
}
针对数组、Map的特殊处理:resolveMultipleBeans源码分析
private Object resolveMultipleBeans ( DependencyDescriptor descriptor, @Nullable String beanName,
@Nullable Set < String > autowiredBeanNames, @Nullable TypeConverter typeConverter) {
Class < ? > type = descriptor. getDependencyType ( ) ;
if ( descriptor instanceof StreamDependencyDescriptor ) {
Map < String , Object > matchingBeans = findAutowireCandidates ( beanName, type, descriptor) ;
if ( autowiredBeanNames != null ) {
autowiredBeanNames. addAll ( matchingBeans. keySet ( ) ) ;
}
Stream < Object > stream = matchingBeans. keySet ( ) . stream ( )
. map ( name -> descriptor. resolveCandidate ( name, type, this ) )
. filter ( bean -> ! ( bean instanceof NullBean ) ) ;
if ( ( ( StreamDependencyDescriptor ) descriptor) . isOrdered ( ) ) {
stream = stream. sorted ( adaptOrderComparator ( matchingBeans) ) ;
}
return stream;
}
else if ( type. isArray ( ) ) {
Class < ? > componentType = type. getComponentType ( ) ;
ResolvableType resolvableType = descriptor. getResolvableType ( ) ;
Class < ? > resolvedArrayType = resolvableType. resolve ( type) ;
if ( resolvedArrayType != type) {
componentType = resolvableType. getComponentType ( ) . resolve ( ) ;
}
if ( componentType == null ) {
return null ;
}
Map < String , Object > matchingBeans = findAutowireCandidates ( beanName, componentType,
new MultiElementDescriptor ( descriptor) ) ;
if ( matchingBeans. isEmpty ( ) ) {
return null ;
}
if ( autowiredBeanNames != null ) {
autowiredBeanNames. addAll ( matchingBeans. keySet ( ) ) ;
}
TypeConverter converter = ( typeConverter != null ? typeConverter : getTypeConverter ( ) ) ;
Object result = converter. convertIfNecessary ( matchingBeans. values ( ) , resolvedArrayType) ;
if ( result instanceof Object [ ] ) {
Comparator < Object > comparator = adaptDependencyComparator ( matchingBeans) ;
if ( comparator != null ) {
Arrays . sort ( ( Object [ ] ) result, comparator) ;
}
}
return result;
}
else if ( Collection . class . isAssignableFrom ( type) && type. isInterface ( ) ) {
Class < ? > elementType = descriptor. getResolvableType ( ) . asCollection ( ) . resolveGeneric ( ) ;
if ( elementType == null ) {
return null ;
}
Map < String , Object > matchingBeans = findAutowireCandidates ( beanName, elementType,
new MultiElementDescriptor ( descriptor) ) ;
if ( matchingBeans. isEmpty ( ) ) {
return null ;
}
if ( autowiredBeanNames != null ) {
autowiredBeanNames. addAll ( matchingBeans. keySet ( ) ) ;
}
TypeConverter converter = ( typeConverter != null ? typeConverter : getTypeConverter ( ) ) ;
Object result = converter. convertIfNecessary ( matchingBeans. values ( ) , type) ;
if ( result instanceof List ) {
if ( ( ( List < ? > ) result) . size ( ) > 1 ) {
Comparator < Object > comparator = adaptDependencyComparator ( matchingBeans) ;
if ( comparator != null ) {
( ( List < ? > ) result) . sort ( comparator) ;
}
}
}
return result;
}
else if ( Map . class == type) {
ResolvableType mapType = descriptor. getResolvableType ( ) . asMap ( ) ;
Class < ? > keyType = mapType. resolveGeneric ( 0 ) ;
if ( String . class != keyType) {
return null ;
}
Class < ? > valueType = mapType. resolveGeneric ( 1 ) ;
if ( valueType == null ) {
return null ;
}
Map < String , Object > matchingBeans = findAutowireCandidates ( beanName, valueType,
new MultiElementDescriptor ( descriptor) ) ;
if ( matchingBeans. isEmpty ( ) ) {
return null ;
}
if ( autowiredBeanNames != null ) {
autowiredBeanNames. addAll ( matchingBeans. keySet ( ) ) ;
}
return matchingBeans;
}
else {
return null ;
}
}
@Autowire自己的ByName源码分析
protected String determineAutowireCandidate ( Map < String , Object > candidates, DependencyDescriptor descriptor) {
Class < ? > requiredType = descriptor. getDependencyType ( ) ;
String primaryCandidate = determinePrimaryCandidate ( candidates, requiredType) ;
if ( primaryCandidate != null ) {
return primaryCandidate;
}
String priorityCandidate = determineHighestPriorityCandidate ( candidates, requiredType) ;
if ( priorityCandidate != null ) {
return priorityCandidate;
}
for ( Map. Entry < String , Object > entry : candidates. entrySet ( ) ) {
String candidateName = entry. getKey ( ) ;
Object beanInstance = entry. getValue ( ) ;
if ( ( beanInstance != null && this . resolvableDependencies. containsValue ( beanInstance) ) ||
matchesBeanName ( candidateName, descriptor. getDependencyName ( ) ) ) {
return candidateName;
}
}
return null ;
}
获取方法入参名称:DefaultParameterNameDiscoverer源码分析
public DefaultParameterNameDiscoverer ( ) {
if ( KotlinDetector . isKotlinReflectPresent ( ) && ! NativeDetector . inNativeImage ( ) ) {
addDiscoverer ( new KotlinReflectionParameterNameDiscoverer ( ) ) ;
}
addDiscoverer ( new StandardReflectionParameterNameDiscoverer ( ) ) ;
addDiscoverer ( new LocalVariableTableParameterNameDiscoverer ( ) ) ;
}
结束语
获取更多本文的前置知识文章,以及新的有价值的文章,让我们一起成为架构师! 关注公众号,可以让你对MySQL、并发编程、spring源码有深入的了解! 关注公众号,后续持续高效的学习JVM! 这个公众号,无广告!!!每日更新!!!