Spring 源码解析四(Bean 的构造装载、属性值解析、注解扫描)

Spring 源码解析四:Bean 的构造装载、属性值解析、注解扫描 上一篇主要介绍了 Bean 的注册、解析、实例化,但留下一些点待解析:

  • ConstructorResolver.autowireConstructor 如何进行构造装载并实例化的
  • CglibSubclassingInstantiationStrategy.instantiate 如何动态实例化 bean 的
  • BeanDefinitionValueResolver.resolveValueIfNecessary 如何解析属性值的
  • MergedAnnotations.from 如何扫描注解的
这一节,就来解析这几个点
1. ConstructorResolver.autowireConstructor ConstructorResolver
的主要功能是在构造时载入依赖的 bean 和用 factory-method 实例化 bean,这里只讲第一个:在构造时载入依赖的 bean ConstructorResolver.autowireConstructor
class ConstructorResolver { public BeanWrapper autowireConstructor(String beanName, RootBeanDefinition mbd, @Nullable Constructor[] chosenCtors, @Nullable Object[] explicitArgs) { // 实例化一个封装对象 BeanWrapperImpl bw = new BeanWrapperImpl(); // 需要使用的构造方法 Constructor constructorToUse = null; // 需要使用的构造参数 Object[] argsToUse = null; // 如果指定了参数,就使用指定的参数 if (explicitArgs != null) { argsToUse = explicitArgs; } else { Object[] argsToResolve = null; // 并发处理 synchronized (mbd.constructorArgumentLock) { // 获取定义中已解析的构造方法 constructorToUse = (Constructor) mbd.resolvedConstructorOrFactoryMethod; if (constructorToUse != null && mbd.constructorArgumentsResolved) { // 获取定义中已解析的参数,首先是resolvedConstructorArguments,其次是preparedConstructorArguments argsToUse = mbd.resolvedConstructorArguments; if (argsToUse == null) { argsToResolve = mbd.preparedConstructorArguments; } } } if (argsToResolve != null) { // 把参数解析成实际要用的数据,如bean装配、属性载入 argsToUse = resolvePreparedArguments(beanName, mbd, bw, constructorToUse, argsToResolve); } }// 如果没有指定的构造方法或参数 if (constructorToUse == null || argsToUse == null) { Constructor[] candidates = chosenCtors; if (candidates == null) { // 如果传入的chosenCtors是空,则获取beanClass的构造方法 Class beanClass = mbd.getBeanClass(); try { candidates = (mbd.isNonPublicAccessAllowed() ? beanClass.getDeclaredConstructors() : beanClass.getConstructors()); } catch (Throwable ex) { // ... 代码省略 } }// 如果只有一个构造方法,并且没有指定explicitArgs和constructorArgumentValues if (candidates.length == 1 && explicitArgs == null && !mbd.hasConstructorArgumentValues()) { Constructor uniqueCandidate = candidates[0]; // 如果构造方法没有参数需要装配,直接实例化返回 if (uniqueCandidate.getParameterCount() == 0) { synchronized (mbd.constructorArgumentLock) { mbd.resolvedConstructorOrFactoryMethod = uniqueCandidate; mbd.constructorArgumentsResolved = true; mbd.resolvedConstructorArguments = EMPTY_ARGS; } // 实例化bean bw.setBeanInstance(instantiate(beanName, mbd, uniqueCandidate, EMPTY_ARGS)); return bw; } }// 有构造方法,且构造模式为AUTOWIRE_CONSTRUCTOR,则需要自动装配bean boolean autowiring = (chosenCtors != null || mbd.getResolvedAutowireMode() == AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR); ConstructorArgumentValues resolvedValues = null; // ... 代码省略// 选择一个参数数量、参数类型、参数顺序与需要实例化参数对象最接近的一个构造方法 // 这里的计算比较复杂,有兴趣的朋友可以自行探索一下 for (Constructor candidate : candidates) { // ... 代码省略 }// ... 代码省略 }// 实例化bean bw.setBeanInstance(instantiate(beanName, mbd, constructorToUse, argsToUse)); return bw; }// 实例化bean,默认使用CglibSubclassingInstantiationStrategy.instantiate来实例化 private Object instantiate( String beanName, RootBeanDefinition mbd, Constructor constructorToUse, Object[] argsToUse) {try { InstantiationStrategy strategy = this.beanFactory.getInstantiationStrategy(); if (System.getSecurityManager() != null) { return AccessController.doPrivileged((PrivilegedAction) () -> strategy.instantiate(mbd, beanName, this.beanFactory, constructorToUse, argsToUse), this.beanFactory.getAccessControlContext()); } else { return strategy.instantiate(mbd, beanName, this.beanFactory, constructorToUse, argsToUse); } } catch (Throwable ex) { // ... 代码省略 } } }
最终的实例化仍然需要CglibSubclassingInstantiationStrategy.instantiate来实现
2. CglibSubclassingInstantiationStrategy.instantiate CglibSubclassingInstantiationStrategy
的主要功能是使用 cglib 的方式实例化 bean
public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationStrategy {}

我们先来看看 SimpleInstantiationStrategy
public class SimpleInstantiationStrategy implements InstantiationStrategy { // 用于调用factory-method private static final ThreadLocal currentlyInvokedFactoryMethod = new ThreadLocal<>(); @Override public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) { // 没有方法需要重载 if (!bd.hasMethodOverrides()) { Constructor constructorToUse; synchronized (bd.constructorArgumentLock) { // 首先获取已解析的构造方法 constructorToUse = (Constructor) bd.resolvedConstructorOrFactoryMethod; if (constructorToUse == null) { // 没有已解析的构造方法,则用beanClass获取 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( (PrivilegedExceptionAction>) clazz::getDeclaredConstructor); } else { // 通过Class获取构造方法 constructorToUse = clazz.getDeclaredConstructor(); } // 设为已解析的构造方法 bd.resolvedConstructorOrFactoryMethod = constructorToUse; } catch (Throwable ex) { // 如果Class没有构造方法,报错 } } } // 调用Constructor..newInstance实例化 return BeanUtils.instantiateClass(constructorToUse); } else { // 有方法需要重载,则需要用cglib生成一个新的子类 return instantiateWithMethodInjection(bd, beanName, owner); } }// 方法注入实例化,留给子类实现 protected Object instantiateWithMethodInjection(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) { throw new UnsupportedOperationException("Method Injection not supported in SimpleInstantiationStrategy"); }@Override public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, final Constructor ctor, Object... args) { // 没有方法需要重载 if (!bd.hasMethodOverrides()) { // ... 代码省略// 调用Constructor.newInstance实例化 return BeanUtils.instantiateClass(ctor, args); } else { // 有方法需要重载,则需要用cglib生成一个新的子类 return instantiateWithMethodInjection(bd, beanName, owner, ctor, args); } }// 方法注入实例化,留给子类实现 protected Object instantiateWithMethodInjection(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, @Nullable Constructor ctor, Object... args) { throw new UnsupportedOperationException("Method Injection not supported in SimpleInstantiationStrategy"); }// 通过factory-method初始化 @Override public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, @Nullable Object factoryBean, final Method factoryMethod, Object... args) {try { // ... 代码省略// 直接调用Method.invoke实例化 Object result = factoryMethod.invoke(factoryBean, args); // 如果为null,实例化一个NullBean if (result == null) { result = new NullBean(); } return result; } catch (IllegalArgumentException ex) { // ... 代码省略 } catch (IllegalAccessException ex) { // ... 代码省略 } catch (InvocationTargetException ex) { // ... 代码省略 } } }

我们先来看看 CglibSubclassingInstantiationStrategy
public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationStrategy { @Override protected Object instantiateWithMethodInjection(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) { return instantiateWithMethodInjection(bd, beanName, owner, null); }@Override protected Object instantiateWithMethodInjection(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, @Nullable Constructor ctor, Object... args) { // 生成一个CglibSubclassCreator来实例化 return new CglibSubclassCreator(bd, owner).instantiate(ctor, args); } }

CglibSubclassCreatorCglibSubclassingInstantiationStrategy的内部类
private static class CglibSubclassCreator { // 实例化一个构造函数 public Object instantiate(@Nullable Constructor ctor, Object... args) { // 使用cglib Enhancer创建一个加强子类 Class subclass = createEnhancedSubclass(this.beanDefinition); Object instance; if (ctor == null) { // 如果没有指定构造函数,调用Constructor.newInstance实例化 instance = BeanUtils.instantiateClass(subclass); } else { try { // 获取与ctor参数匹配的子类构造函数,再调用Constructor.newInstance实例化 Constructor enhancedSubclassConstructor = subclass.getConstructor(ctor.getParameterTypes()); instance = enhancedSubclassConstructor.newInstance(args); } catch (Exception ex) { // ... 代码省略 } }// ... 代码省略return instance; }// 使用cglib Enhancer创建一个加强子类 private Class createEnhancedSubclass(RootBeanDefinition beanDefinition) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(beanDefinition.getBeanClass()); enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); if (this.owner instanceof ConfigurableBeanFactory) { ClassLoader cl = ((ConfigurableBeanFactory) this.owner).getBeanClassLoader(); enhancer.setStrategy(new ClassLoaderAwareGeneratorStrategy(cl)); } enhancer.setCallbackFilter(new MethodOverrideCallbackFilter(beanDefinition)); enhancer.setCallbackTypes(CALLBACK_TYPES); return enhancer.createClass(); } }

3. BeanDefinitionValueResolver.resolveValueIfNecessary BeanDefinitionValueResolver
的主要功能是将配置的属性值装载到 bean 中
class BeanDefinitionValueResolver { public Object resolveValueIfNecessary(Object argName, @Nullable Object value) { // 在运行时对其他bean的引用 if (value instanceof RuntimeBeanReference) { RuntimeBeanReference ref = (RuntimeBeanReference) value; // 解析引用bean return resolveReference(argName, ref); } // 在运行时对其他bean name的引用 else if (value instanceof RuntimeBeanNameReference) { String refName = ((RuntimeBeanNameReference) value).getBeanName(); // 使用doEvaluate解析bean名字,执行SpEL表达式 refName = String.valueOf(doEvaluate(refName)); if (!this.beanFactory.containsBean(refName)) { // 没注册过bean name,报错 } return refName; } // 包含别名的bean定义 else if (value instanceof BeanDefinitionHolder) { BeanDefinitionHolder bdHolder = (BeanDefinitionHolder) value; // 解析内部bean return resolveInnerBean(argName, bdHolder.getBeanName(), bdHolder.getBeanDefinition()); } // bean定义 else if (value instanceof BeanDefinition) { BeanDefinition bd = (BeanDefinition) value; // 内部bean名字 String innerBeanName = "(inner bean)" + BeanFactoryUtils.GENERATED_BEAN_NAME_SEPARATOR + ObjectUtils.getIdentityHexString(bd); // 解析内部bean return resolveInnerBean(argName, innerBeanName, bd); } // 注入依赖描述(类、方法、属性) else if (value instanceof DependencyDescriptor) { Set autowiredBeanNames = new LinkedHashSet<>(4); // 解析依赖 Object result = this.beanFactory.resolveDependency( (DependencyDescriptor) value, this.beanName, autowiredBeanNames, this.typeConverter); for (String autowiredBeanName : autowiredBeanNames) { if (this.beanFactory.containsBean(autowiredBeanName)) { // 注册依赖 this.beanFactory.registerDependentBean(autowiredBeanName, this.beanName); } } return result; }// ... 代码省略// 是字符类型的值 else if (value instanceof TypedStringValue) { TypedStringValue typedStringValue = https://www.it610.com/article/(TypedStringValue) value; // 使用evaluate解析bean名字,执行SpEL表达式 Object valueObject = evaluate(typedStringValue); try { // 解析类型 Class resolvedTargetType = resolveTargetType(typedStringValue); // 如果有类型,把valueObject转换成这个类型 if (resolvedTargetType != null) { return this.typeConverter.convertIfNecessary(valueObject, resolvedTargetType); } // 没有指定类型,则返回原本的 else { return valueObject; } } catch (Throwable ex) { // ... 代码省略 } } // 如果是NullBean,返回null else if (value instanceof NullBean) { return null; } // 默认当成SpEL表达式解析了 else { return evaluate(value); } } }

BeanDefinitionValueResolver.resolveReference
解析引用 bean
class BeanDefinitionValueResolver { private Object resolveReference(Object argName, RuntimeBeanReference ref) { try { Object bean; // 获取bean类型 Class beanType = ref.getBeanType(); if (ref.isToParent()) { // 指明从父BeanFactory中获取 BeanFactory parent = this.beanFactory.getParentBeanFactory(); if (beanType != null) { // 如果有beanType,直接通过类型获取bean bean = parent.getBean(beanType); } else { // 使用doEvaluate解析bean名字,执行SpEL表达式,然后根据名字查找bean bean = parent.getBean(String.valueOf(doEvaluate(ref.getBeanName()))); } } else { String resolvedName; if (beanType != null) { // 如果有beanType,直接通过类型获取bean NamedBeanHolder namedBean = this.beanFactory.resolveNamedBean(beanType); bean = namedBean.getBeanInstance(); resolvedName = namedBean.getBeanName(); } else { // 使用doEvaluate解析bean名字,执行SpEL表达式,然后根据名字查找bean resolvedName = String.valueOf(doEvaluate(ref.getBeanName())); bean = this.beanFactory.getBean(resolvedName); } // 注册依赖 this.beanFactory.registerDependentBean(resolvedName, this.beanName); } // 如果是NullBean,返回null if (bean instanceof NullBean) { bean = null; } return bean; } catch (BeansException ex) { // ... 代码省略 } }// 调用beanFactory来解析bean名字,执行SpEL表达式 private Object doEvaluate(String value) { return this.beanFactory.evaluateBeanDefinitionString(value, this.beanDefinition); } }

BeanDefinitionValueResolver.resolveInnerBean
解析内部 bean
class BeanDefinitionValueResolver { private Object resolveInnerBean(Object argName, String innerBeanName, BeanDefinition innerBd) { RootBeanDefinition mbd = null; try { // 获取合并父bean定义的bean定义 mbd = this.beanFactory.getMergedBeanDefinition(innerBeanName, innerBd, this.beanDefinition); String actualInnerBeanName = innerBeanName; if (mbd.isSingleton()) { // 如果同类型的bean被实例化多次,则使用后缀#1,#2...来命名之后的bean actualInnerBeanName = adaptInnerBeanName(innerBeanName); } // 把新生成的名字注册到beanFactory this.beanFactory.registerContainedBean(actualInnerBeanName, this.beanName); // 获取依赖 String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dependsOnBean : dependsOn) { // 注册依赖 this.beanFactory.registerDependentBean(dependsOnBean, actualInnerBeanName); // 确保加载 this.beanFactory.getBean(dependsOnBean); } } // 创建bean Object innerBean = this.beanFactory.createBean(actualInnerBeanName, mbd, null); // 如果bean实例是FactoryBean,则调用factory-method获取真正的bean if (innerBean instanceof FactoryBean) { boolean synthetic = mbd.isSynthetic(); innerBean = this.beanFactory.getObjectFromFactoryBean( (FactoryBean) innerBean, actualInnerBeanName, !synthetic); } // 如果是NullBean,返回null if (innerBean instanceof NullBean) { innerBean = null; } return innerBean; } catch (BeansException ex) { // ... 代码省略 } }// 如果同类型的bean被实例化多次,则使用后缀#1,#2...来命名之后的bean private String adaptInnerBeanName(String innerBeanName) { String actualInnerBeanName = innerBeanName; int counter = 0; String prefix = innerBeanName + BeanFactoryUtils.GENERATED_BEAN_NAME_SEPARATOR; while (this.beanFactory.isBeanNameInUse(actualInnerBeanName)) { counter++; actualInnerBeanName = prefix + counter; } return actualInnerBeanName; } }

4. MergedAnnotations.from MergedAnnotations.from
的底层实现其实是 TypeMappedAnnotations.from
TypeMappedAnnotations的主要功能就是搜索、操作注解
final class TypeMappedAnnotations implements MergedAnnotations { static MergedAnnotations from(AnnotatedElement element, SearchStrategy searchStrategy, RepeatableContainers repeatableContainers, AnnotationFilter annotationFilter) { // 没有可用的注解,直接返回NONE if (AnnotationsScanner.isKnownEmpty(element, searchStrategy)) { return NONE; } return new TypeMappedAnnotations(element, searchStrategy, repeatableContainers, annotationFilter); }static MergedAnnotations from(@Nullable Object source, Annotation[] annotations, RepeatableContainers repeatableContainers, AnnotationFilter annotationFilter) { // 没有要查找的注解,直接返回NONE if (annotations.length == 0) { return NONE; } return new TypeMappedAnnotations(source, annotations, repeatableContainers, annotationFilter); } }

final class TypeMappedAnnotations implements MergedAnnotations { // 检查是否有annotationType @Override publicboolean isPresent(Class annotationType) { // 过滤器没通过,返回false if (this.annotationFilter.matches(annotationType)) { return false; } // 扫描目标元素(类、方法、属性) return Boolean.TRUE.equals(scan(annotationType, IsPresent.get(this.repeatableContainers, this.annotationFilter, false))); }// 检查是否有annotationType @Override public boolean isPresent(String annotationType) { // 过滤器没通过,返回false if (this.annotationFilter.matches(annotationType)) { return false; } // 扫描目标元素(类、方法、属性) return Boolean.TRUE.equals(scan(annotationType, IsPresent.get(this.repeatableContainers, this.annotationFilter, false))); }// 获取目标元素的annotationType注解对象 @Override publicMergedAnnotation get(Class annotationType, @Nullable Predicate predicate, @Nullable MergedAnnotationSelector selector) { // 过滤器没通过,返回空 if (this.annotationFilter.matches(annotationType)) { return MergedAnnotation.missing(); } // 扫描目标元素(类、方法、属性) MergedAnnotation result = scan(annotationType, new MergedAnnotationFinder<>(annotationType, predicate, selector)); return (result != null ? result : MergedAnnotation.missing()); }// 获取目标元素的annotationType注解对象 @Override publicMergedAnnotation get(String annotationType, @Nullable Predicate predicate, @Nullable MergedAnnotationSelector selector) { // 过滤器没通过,返回空 if (this.annotationFilter.matches(annotationType)) { return MergedAnnotation.missing(); } // 扫描目标元素(类、方法、属性) MergedAnnotation result = scan(annotationType, new MergedAnnotationFinder<>(annotationType, predicate, selector)); return (result != null ? result : MergedAnnotation.missing()); }// 扫描目标元素(类、方法、属性) private R scan(C criteria, AnnotationsProcessor processor) { // 如果有传入的注解对象,就不扫描目标元素了 if (this.annotations != null) { R result = processor.doWithAnnotations(criteria, 0, this.source, this.annotations); return processor.finish(result); } // 有目标元素和扫描策略,扫描目标元素 if (this.element != null && this.searchStrategy != null) { return AnnotationsScanner.scan(criteria, this.element, this.searchStrategy, processor); } return null; } }

TypeMappedAnnotations.scan 的底层实现是 AnnotationsScanner.scan
abstract class AnnotationsScanner { // 扫描注解 static R scan(C context, AnnotatedElement source, SearchStrategy searchStrategy, AnnotationsProcessor processor) { // 实际扫描处理 R result = process(context, source, searchStrategy, processor); return processor.finish(result); }// 实际扫描处理 private static R process(C context, AnnotatedElement source, SearchStrategy searchStrategy, AnnotationsProcessor processor) { // 如果目标元素是类,按类处理 if (source instanceof Class) { return processClass(context, (Class) source, searchStrategy, processor); } // 如果目标元素是方法,按方法处理 if (source instanceof Method) { return processMethod(context, (Method) source, searchStrategy, processor); } // 不然按普通处理 return processElement(context, source, processor); } }

4.1. 按类处理
abstract class AnnotationsScanner { private static R processClass(C context, Class source, SearchStrategy searchStrategy, AnnotationsProcessor processor) {switch (searchStrategy) { // 只搜索自身的注解,按普通处理 case DIRECT: return processElement(context, source, processor); // 搜索自身与标记为@Inherited父类的注解 case INHERITED_ANNOTATIONS: return processClassInheritedAnnotations(context, source, searchStrategy, processor); // 搜索自身与父类的注解 case SUPERCLASS: return processClassHierarchy(context, source, processor, false, false); // 搜索自身、父类、接口的注解 case TYPE_HIERARCHY: return processClassHierarchy(context, source, processor, true, false); // 搜索自身、父类、接口、getEnclosingClass()的注解 case TYPE_HIERARCHY_AND_ENCLOSING_CLASSES: return processClassHierarchy(context, source, processor, true, true); } throw new IllegalStateException("Unsupported search strategy " + searchStrategy); }// 搜索自身与标记为@Inherited父类的注解 private static R processClassInheritedAnnotations(C context, Class source, SearchStrategy searchStrategy, AnnotationsProcessor processor) { try { // 如果除了自身以外,没有父类、接口、getEnclosingClass()的注解,按普通处理 if (isWithoutHierarchy(source, searchStrategy)) { return processElement(context, source, processor); } Annotation[] relevant = null; int remaining = Integer.MAX_VALUE; int aggregateIndex = 0; Class root = source; // source对象还可以继续向父类上溯 // 非Object,非Ordered,非"java."开头 while (source != null && source != Object.class && remaining > 0 && !hasPlainJavaAnnotationsOnly(source)) {// 聚合处理,如果有了,直接返回(默认未实现) R result = processor.doWithAggregate(context, aggregateIndex); if (result != null) { return result; }// 获取所有public的注解 Annotation[] declaredAnnotations = getDeclaredAnnotations(source, true); // ... 代码省略// 处理器自定义处理 result = processor.doWithAnnotations(context, aggregateIndex, source, declaredAnnotations); // 如果有了,返回 if (result != null) { return result; } // 上溯父类,继续扫描 source = source.getSuperclass(); aggregateIndex++; } } catch (Throwable ex) { // ... 代码省略 } return null; }// 搜索自身、父类、接口、getEnclosingClass()的注解 private static R processClassHierarchy(C context, int[] aggregateIndex, Class source, AnnotationsProcessor processor, boolean includeInterfaces, boolean includeEnclosing) { try { // 聚合处理,如果有了,直接返回(默认未实现) R result = processor.doWithAggregate(context, aggregateIndex[0]); if (result != null) { return result; } // 如果是Ordered或"java."开头,返回 if (hasPlainJavaAnnotationsOnly(source)) { return null; } // 获取所有public的注解 Annotation[] annotations = getDeclaredAnnotations(source, false); // 处理器自定义处理 result = processor.doWithAnnotations(context, aggregateIndex[0], source, annotations); // 如果有了,返回 if (result != null) { return result; } aggregateIndex[0]++; // 如果包括接口,继续搜索接口的 if (includeInterfaces) { for (Class interfaceType : source.getInterfaces()) { R interfacesResult = processClassHierarchy(context, aggregateIndex, interfaceType, processor, true, includeEnclosing); if (interfacesResult != null) { return interfacesResult; } } }// 如果有父类,继续搜索父类的 Class superclass = source.getSuperclass(); if (superclass != Object.class && superclass != null) { R superclassResult = processClassHierarchy(context, aggregateIndex, superclass, processor, includeInterfaces, includeEnclosing); if (superclassResult != null) { return superclassResult; } }// 如果包括getEnclosingClass(),继续搜索getEnclosingClass()的 if (includeEnclosing) { try { Class enclosingClass = source.getEnclosingClass(); if (enclosingClass != null) { R enclosingResult = processClassHierarchy(context, aggregateIndex, enclosingClass, processor, includeInterfaces, true); if (enclosingResult != null) { return enclosingResult; } } } catch (Throwable ex) { // ... 代码省略 } } } catch (Throwable ex) { // ... 代码省略 } return null; } }

4.2. 按方法处理
abstract class AnnotationsScanner { private static R processMethod(C context, Method source, SearchStrategy searchStrategy, AnnotationsProcessor processor) {switch (searchStrategy) { // 只搜索自身的注解 case DIRECT: // 搜索自身与标记为@Inherited父类的注解 case INHERITED_ANNOTATIONS: return processMethodInheritedAnnotations(context, source, processor); // 搜索自身与父类的注解 case SUPERCLASS: return processMethodHierarchy(context, new int[] {0}, source.getDeclaringClass(), processor, source, false); // 搜索自身、父类、接口的注解 case TYPE_HIERARCHY: // 搜索自身、父类、接口、getEnclosingClass()的注解 case TYPE_HIERARCHY_AND_ENCLOSING_CLASSES: return processMethodHierarchy(context, new int[] {0}, source.getDeclaringClass(), processor, source, true); } throw new IllegalStateException("Unsupported search strategy " + searchStrategy); }// 搜索自身与标记为@Inherited父类的注解 private static R processMethodInheritedAnnotations(C context, Method source, AnnotationsProcessor processor) {try { // 聚合处理,如果有了,直接返回(默认未实现) // 不然,用processMethodAnnotations处理 R result = processor.doWithAggregate(context, 0); return (result != null ? result : processMethodAnnotations(context, 0, source, processor)); } catch (Throwable ex) { // ... 代码省略 } return null; }// 处理方法的注解 private static R processMethodAnnotations(C context, int aggregateIndex, Method source, AnnotationsProcessor processor) {// 获取所有public的注解 Annotation[] annotations = getDeclaredAnnotations(source, false); // 处理器自定义处理 R result = processor.doWithAnnotations(context, aggregateIndex, source, annotations); // 如果有了,返回 if (result != null) { return result; }// ... 代码省略,桥接方法的处理return null; }// 搜索自身、父类、接口、getEnclosingClass()的注解 private static R processMethodHierarchy(C context, int[] aggregateIndex, Class sourceClass, AnnotationsProcessor processor, Method rootMethod, boolean includeInterfaces) { try { // 聚合处理,如果有了,直接返回(默认未实现) R result = processor.doWithAggregate(context, aggregateIndex[0]); if (result != null) { return result; } // 如果是Ordered或"java."开头,返回 if (hasPlainJavaAnnotationsOnly(sourceClass)) { return null; }boolean calledProcessor = false; // 如果rootMethod是sourceClass的,直接处理 if (sourceClass == rootMethod.getDeclaringClass()) { result = processMethodAnnotations(context, aggregateIndex[0], rootMethod, processor); calledProcessor = true; if (result != null) { return result; } } else { // 获取sourceClass的public方法 for (Method candidateMethod : getBaseTypeMethods(context, sourceClass)) { // 如果方法不是private,并且参数与rootMethod一直,直接处理 if (candidateMethod != null && isOverride(rootMethod, candidateMethod)) { result = processMethodAnnotations(context, aggregateIndex[0], candidateMethod, processor); calledProcessor = true; if (result != null) { return result; } } } } // 如果rootMethod是private,返回null if (Modifier.isPrivate(rootMethod.getModifiers())) { return null; }// 如果包括接口,继续搜索接口的 if (includeInterfaces) { for (Class interfaceType : sourceClass.getInterfaces()) { R interfacesResult = processMethodHierarchy(context, aggregateIndex, interfaceType, processor, rootMethod, true); if (interfacesResult != null) { return interfacesResult; } } }// 如果有父类,继续搜索父类的 Class superclass = sourceClass.getSuperclass(); if (superclass != Object.class && superclass != null) { R superclassResult = processMethodHierarchy(context, aggregateIndex, superclass, processor, rootMethod, includeInterfaces); if (superclassResult != null) { return superclassResult; } } } catch (Throwable ex) { // ... 代码省略 } return null; } }

4.3 按普通处理
abstract class AnnotationsScanner { private static R processElement(C context, AnnotatedElement source, AnnotationsProcessor processor) {try { // 聚合处理,如果有了,直接返回(默认未实现) // 不然,调用getDeclaredAnnotations获取注解来处理 R result = processor.doWithAggregate(context, 0); return (result != null ? result : processor.doWithAnnotations( context, 0, source, getDeclaredAnnotations(source, false))); } catch (Throwable ex) { // ... 代码省略 } return null; } }

后续 【Spring 源码解析四(Bean 的构造装载、属性值解析、注解扫描)】更多博客,查看 https://github.com/senntyou/blogs
作者:深予之 (@senntyou)
版权声明:自由转载-非商用-非衍生-保持署名(创意共享 3.0 许可证)

    推荐阅读