Spring 源码解析九:默认的注解处理器
在 Spring 源码解析五:Bean 的配置、定义、注册 中,有一些默认的注解处理器还未解析
- ConfigurationClassPostProcessor
- AutowiredAnnotationBeanPostProcessor
- CommonAnnotationBeanPostProcessor
- PersistenceAnnotationBeanPostProcessor
- EventListenerMethodProcessor
- DefaultEventListenerFactory
1. ConfigurationClassPostProcessor
ConfigurationClassPostProcessor
的次要性能是解决@Configuration
类
public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered, ResourceLoaderAware, ApplicationStartupAware, BeanClassLoaderAware, EnvironmentAware { // 后置解决registry @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { // ... 代码省略 // 解决配置类bean定义 processConfigBeanDefinitions(registry); } // 后置解决registry @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { // ... 代码省略 // 解决配置类bean定义 processConfigBeanDefinitions((BeanDefinitionRegistry) beanFactory); // 应用ConfigurationClassEnhancer对@Configuration的class进行cglib加强 enhanceConfigurationClasses(beanFactory); // ... 代码省略 }}
public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered, ResourceLoaderAware, ApplicationStartupAware, BeanClassLoaderAware, EnvironmentAware { // 解决配置类bean定义 public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) { // 配置类汇合 List<BeanDefinitionHolder> configCandidates = new ArrayList<>(); // 所有bean的名字 String[] candidateNames = registry.getBeanDefinitionNames(); // 遍历 for (String beanName : candidateNames) { // 获取bean定义 BeanDefinition beanDef = registry.getBeanDefinition(beanName); // ... 代码省略 // 如果是@Configuration标记的类,退出汇合 if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) { configCandidates.add(new BeanDefinitionHolder(beanDef, beanName)); } } // 没有@Configuration标记的类,返回 if (configCandidates.isEmpty()) { return; } // ... 代码省略 // 获取 @Configuration 类解析器 ConfigurationClassParser parser = new ConfigurationClassParser( this.metadataReaderFactory, this.problemReporter, this.environment, this.resourceLoader, this.componentScanBeanNameGenerator, registry); // 待解析汇合 Set<BeanDefinitionHolder> candidates = new LinkedHashSet<>(configCandidates); // 已解析汇合 Set<ConfigurationClass> alreadyParsed = new HashSet<>(configCandidates.size()); do { // ... 代码省略 // 解析配置类 parser.parse(candidates); // 验证配置类 parser.validate(); // 获取所有的配置类,包含以前注册的 Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.getConfigurationClasses()); // 移除已解析的 configClasses.removeAll(alreadyParsed); if (this.reader == null) { // 应用ConfigurationClassBeanDefinitionReader创立配置类bean定义读取器 this.reader = new ConfigurationClassBeanDefinitionReader( registry, this.sourceExtractor, this.resourceLoader, this.environment, this.importBeanNameGenerator, parser.getImportRegistry()); } // 读取bean定义 this.reader.loadBeanDefinitions(configClasses); // 增加到已解析 alreadyParsed.addAll(configClasses); // ... 代码省略 } while (!candidates.isEmpty()); // ... 代码省略 }}
对@Configuration
类的解决外围是 ConfigurationClassParser
实现的
class ConfigurationClassParser { public void parse(Set<BeanDefinitionHolder> configCandidates) { for (BeanDefinitionHolder holder : configCandidates) { BeanDefinition bd = holder.getBeanDefinition(); try { // AnnotatedBeanDefinition解决 if (bd instanceof AnnotatedBeanDefinition) { parse1(((AnnotatedBeanDefinition) bd).getMetadata(), holder.getBeanName()); } // AbstractBeanDefinition+beanClass解决 else if (bd instanceof AbstractBeanDefinition && ((AbstractBeanDefinition) bd).hasBeanClass()) { parse2(((AbstractBeanDefinition) bd).getBeanClass(), holder.getBeanName()); } // 默认解决 else { parse3(bd.getBeanClassName(), holder.getBeanName()); } } catch (BeanDefinitionStoreException ex) { // ... 代码省略 } // ... 代码省略 } // ... 代码省略 } protected final void parse1(AnnotationMetadata metadata, String beanName) throws IOException { processConfigurationClass(new ConfigurationClass(metadata, beanName), DEFAULT_EXCLUSION_FILTER); } protected final void parse2(Class<?> clazz, String beanName) throws IOException { processConfigurationClass(new ConfigurationClass(clazz, beanName), DEFAULT_EXCLUSION_FILTER); } protected final void parse3(@Nullable String className, String beanName) throws IOException { MetadataReader reader = this.metadataReaderFactory.getMetadataReader(className); processConfigurationClass(new ConfigurationClass(reader, beanName), DEFAULT_EXCLUSION_FILTER); }}
class ConfigurationClassParser { protected void processConfigurationClass(ConfigurationClass configClass, Predicate<String> filter) throws IOException { // ... 代码省略 // 包裹成SourceClass SourceClass sourceClass = asSourceClass(configClass, filter); // 遍历解决配置类,及其父类 do { sourceClass = doProcessConfigurationClass(configClass, sourceClass, filter); } while (sourceClass != null); // ... 代码省略 } // 解决配置类 protected final SourceClass doProcessConfigurationClass( ConfigurationClass configClass, SourceClass sourceClass, Predicate<String> filter) throws IOException { // 解决@Component注解 if (configClass.getMetadata().isAnnotated(Component.class.getName())) { // 遍历解决外部类(非动态外部类) processMemberClasses(configClass, sourceClass, filter); } // 解决@PropertySource注解,装载属性都bean中 for (AnnotationAttributes propertySource : AnnotationConfigUtils.attributesForRepeatable( sourceClass.getMetadata(), PropertySources.class, org.springframework.context.annotation.PropertySource.class)) { // 装载属性都bean中 processPropertySource(propertySource); } // 解决@ComponentScan注解,扫描指定的包 Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable( sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class); if (!componentScans.isEmpty() && !this.conditionEvaluator.shouldSkip(sourceClass.getMetadata(), ConfigurationPhase.REGISTER_BEAN)) { // 遍历扫描 for (AnnotationAttributes componentScan : componentScans) { // 扫描到的bean定义 Set<BeanDefinitionHolder> scannedBeanDefinitions = this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName()); // 遍历bean定义 for (BeanDefinitionHolder holder : scannedBeanDefinitions) { BeanDefinition bdCand = holder.getBeanDefinition().getOriginatingBeanDefinition(); // 如果也标记有@Configuration,持续解析 if (ConfigurationClassUtils.checkConfigurationClassCandidate(bdCand, this.metadataReaderFactory)) { parse(bdCand.getBeanClassName(), holder.getBeanName()); } } } } // 解决@Import注解 processImports(configClass, sourceClass, getImports(sourceClass), filter, true); // 解决@ImportResource注解 AnnotationAttributes importResource = AnnotationConfigUtils.attributesFor(sourceClass.getMetadata(), ImportResource.class); if (importResource != null) { // ... 代码省略 } // 解决类中标记为@Bean的办法 Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass); for (MethodMetadata methodMetadata : beanMethods) { configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass)); } // 如果类是接口,注入默认的办法 processInterfaces(configClass, sourceClass); // 如果有父类,返回父类,持续遍历 if (sourceClass.getMetadata().hasSuperClass()) { // ... 代码省略 } // 没有父类,完结遍历 return null; }}
2. AutowiredAnnotationBeanPostProcessor
ConfigurationClassPostProcessor
的次要性能是解决 bean 的主动拆卸
public class AutowiredAnnotationBeanPostProcessor implements SmartInstantiationAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware { // 默认解决@Autowired、@Value、@Inject三个注解 public AutowiredAnnotationBeanPostProcessor() { this.autowiredAnnotationTypes.add(Autowired.class); this.autowiredAnnotationTypes.add(Value.class); try { this.autowiredAnnotationTypes.add((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader())); } catch (ClassNotFoundException ex) { // ... 代码省略 } } // 解决属性注入 @Override 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) { // ... 代码省略 } return pvs; } // 查找须要注入的元信息 private InjectionMetadata findAutowiringMetadata(String beanName, Class<?> clazz, @Nullable PropertyValues pvs) { // 加锁的形式取出 InjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey); if (InjectionMetadata.needsRefresh(metadata, clazz)) { synchronized (this.injectionMetadataCache) { metadata = this.injectionMetadataCache.get(cacheKey); if (InjectionMetadata.needsRefresh(metadata, clazz)) { if (metadata != null) { metadata.clear(pvs); } // 构建元信息 metadata = buildAutowiringMetadata(clazz); this.injectionMetadataCache.put(cacheKey, metadata); } } } return metadata; }}
public class AutowiredAnnotationBeanPostProcessor implements SmartInstantiationAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware { // 构建元信息 private InjectionMetadata buildAutowiringMetadata(final Class<?> clazz) { // ... 代码省略 // 注入元素汇合 List<InjectionMetadata.InjectedElement> elements = new ArrayList<>(); Class<?> targetClass = clazz; do { // 以后元素汇合 final List<InjectionMetadata.InjectedElement> currElements = new ArrayList<>(); // 遍历本地属性 ReflectionUtils.doWithLocalFields(targetClass, field -> { // 获取@Autowired、@Value、@Inject注解 MergedAnnotation<?> ann = findAutowiredAnnotation(field); if (ann != null) { if (Modifier.isStatic(field.getModifiers())) { // 动态属性不能注入 return; } // required 配置 boolean required = determineRequiredStatus(ann); // 退出属性元素 currElements.add(new AutowiredFieldElement(field, required)); } }); // 遍历本地办法 ReflectionUtils.doWithLocalMethods(targetClass, method -> { Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); // ... 代码省略 // 获取@Autowired、@Value、@Inject注解 MergedAnnotation<?> ann = findAutowiredAnnotation(bridgedMethod); if (ann != null) { if (Modifier.isStatic(method.getModifiers())) { // 静态方法不能注入 return; } // required 配置 boolean required = determineRequiredStatus(ann); PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); // 退出办法元素 currElements.add(new AutowiredMethodElement(method, required, pd)); } }); // 增加进注入元素汇合 elements.addAll(0, currElements); // 遍历父类 targetClass = targetClass.getSuperclass(); } while (targetClass != null && targetClass != Object.class); return InjectionMetadata.forElements(elements, clazz); }}
属性的注入是 AutowiredFieldElement.inject
实现的,办法参数的注入是 AutowiredMethodElement.inject
实现的
private class AutowiredFieldElement extends InjectionMetadata.InjectedElement { @Override protected void inject(Object bean, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable { Field field = (Field) this.member; Object value; if (this.cached) { // 先从缓存中获取bean,其次从registry获取bean value = resolvedCachedArgument(beanName, this.cachedFieldValue); } else { // 实例化一个DependencyDescriptor对象 DependencyDescriptor desc = new DependencyDescriptor(field, this.required); // ... 代码省略 try { // 从registry获取bean value = beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter); } catch (BeansException ex) { // ... 代码省略 } synchronized (this) { // ... 代码省略 // 把autowiredBeanNames注册为beanName的依赖 registerDependentBeans(beanName, autowiredBeanNames); // ... 代码省略 } } // 把bean注入到属性中 if (value != null) { ReflectionUtils.makeAccessible(field); field.set(bean, value); } }}
private class AutowiredMethodElement extends InjectionMetadata.InjectedElement { @Override protected void inject(Object bean, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable { // ... 代码省略 Method method = (Method) this.member; Object[] arguments; if (this.cached) { // 先从缓存中获取参数bean汇合,其次从registry获取参数bean汇合 arguments = resolveCachedArguments(beanName); } else { // 参数个数 int argumentCount = method.getParameterCount(); // 参数汇合 arguments = new Object[argumentCount]; // ... 代码省略 for (int i = 0; i < arguments.length; i++) { // 参数对象 MethodParameter methodParam = new MethodParameter(method, i); // ... 代码省略 try { // 获取参数注入的bean Object arg = beanFactory.resolveDependency(currDesc, beanName, autowiredBeans, typeConverter); // ... 代码省略 arguments[i] = arg; } catch (BeansException ex) { // ... 代码省略 } } // ... 代码省略 } // 把bean注入到参数中 if (arguments != null) { try { ReflectionUtils.makeAccessible(method); method.invoke(bean, arguments); } catch (InvocationTargetException ex) { // ... 代码省略 } } }}
3. CommonAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
的次要性能是解决通用 java 注解javax.annotation.*
public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor implements InstantiationAwareBeanPostProcessor, BeanFactoryAware, Serializable { // 解决属性注入 @Override public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) { // 查找须要注入的元信息 InjectionMetadata metadata = findResourceMetadata(beanName, bean.getClass(), pvs); try { // 注入 metadata.inject(bean, beanName, pvs); } catch (Throwable ex) { // ... 代码省略 } return pvs; } // 查找须要注入的元信息 private InjectionMetadata findResourceMetadata(String beanName, final Class<?> clazz, @Nullable PropertyValues pvs) { // 加锁的形式取出 InjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey); if (InjectionMetadata.needsRefresh(metadata, clazz)) { synchronized (this.injectionMetadataCache) { metadata = this.injectionMetadataCache.get(cacheKey); if (InjectionMetadata.needsRefresh(metadata, clazz)) { if (metadata != null) { metadata.clear(pvs); } // 构建元信息 metadata = buildResourceMetadata(clazz); this.injectionMetadataCache.put(cacheKey, metadata); } } } return metadata; }}
public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor implements InstantiationAwareBeanPostProcessor, BeanFactoryAware, Serializable { // 构建元信息 private InjectionMetadata buildResourceMetadata(final Class<?> clazz) { // ... 代码省略 // 注入元素汇合 List<InjectionMetadata.InjectedElement> elements = new ArrayList<>(); Class<?> targetClass = clazz; do { // 以后元素汇合 final List<InjectionMetadata.InjectedElement> currElements = new ArrayList<>(); // 遍历本地属性 ReflectionUtils.doWithLocalFields(targetClass, field -> { // @WebServiceRef 注解 if (webServiceRefClass != null && field.isAnnotationPresent(webServiceRefClass)) { if (Modifier.isStatic(field.getModifiers())) { // 动态属性不能注入 } currElements.add(new WebServiceRefElement(field, field, null)); } // @EJB 注解 else if (ejbClass != null && field.isAnnotationPresent(ejbClass)) { if (Modifier.isStatic(field.getModifiers())) { // 动态属性不能注入 } currElements.add(new EjbRefElement(field, field, null)); } // @Resource 注解 else if (field.isAnnotationPresent(Resource.class)) { if (Modifier.isStatic(field.getModifiers())) { // 动态属性不能注入 } if (!this.ignoredResourceTypes.contains(field.getType().getName())) { currElements.add(new ResourceElement(field, field, null)); } } }); // 遍历本地办法 ReflectionUtils.doWithLocalMethods(targetClass, method -> { Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); // ... 代码省略 // @WebServiceRef 注解 if (webServiceRefClass != null && bridgedMethod.isAnnotationPresent(webServiceRefClass)) { if (Modifier.isStatic(method.getModifiers())) { // 静态方法不能注入 } PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); currElements.add(new WebServiceRefElement(method, bridgedMethod, pd)); } // @EJB 注解 else if (ejbClass != null && bridgedMethod.isAnnotationPresent(ejbClass)) { if (Modifier.isStatic(method.getModifiers())) { // 静态方法不能注入 } PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); currElements.add(new EjbRefElement(method, bridgedMethod, pd)); } // @Resource 注解 else if (bridgedMethod.isAnnotationPresent(Resource.class)) { if (Modifier.isStatic(method.getModifiers())) { // 静态方法不能注入 } if (!this.ignoredResourceTypes.contains(paramTypes[0].getName())) { PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); currElements.add(new ResourceElement(method, bridgedMethod, pd)); } } }); // 增加进注入元素汇合 elements.addAll(0, currElements); // 遍历父类 targetClass = targetClass.getSuperclass(); } while (targetClass != null && targetClass != Object.class); return InjectionMetadata.forElements(elements, clazz); }}
4. PersistenceAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
的次要性能是解决长久化 java 注解javax.persistence.*
public class PersistenceAnnotationBeanPostProcessor implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware, Serializable { // 解决属性注入 @Override public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) { // 查找须要注入的元信息 InjectionMetadata metadata = findPersistenceMetadata(beanName, bean.getClass(), pvs); try { // 注入 metadata.inject(bean, beanName, pvs); } catch (Throwable ex) { // ... 代码省略 } return pvs; } // 查找须要注入的元信息 private InjectionMetadata findPersistenceMetadata(String beanName, final Class<?> clazz, @Nullable PropertyValues pvs) { // 加锁的形式取出 InjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey); if (InjectionMetadata.needsRefresh(metadata, clazz)) { synchronized (this.injectionMetadataCache) { metadata = this.injectionMetadataCache.get(cacheKey); if (InjectionMetadata.needsRefresh(metadata, clazz)) { if (metadata != null) { metadata.clear(pvs); } // 构建元信息 this.injectionMetadataCache.put(cacheKey, metadata); } } } return metadata; }}
public class PersistenceAnnotationBeanPostProcessor implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware, Serializable { // 构建元信息 private InjectionMetadata buildPersistenceMetadata(final Class<?> clazz) { // ... 代码省略 // 注入元素汇合 List<InjectionMetadata.InjectedElement> elements = new ArrayList<>(); Class<?> targetClass = clazz; do { // 以后元素汇合 final List<InjectionMetadata.InjectedElement> currElements = new ArrayList<>(); // 遍历本地属性 ReflectionUtils.doWithLocalFields(targetClass, field -> { // 有 @PersistenceContext、@PersistenceUnit 注解 if (field.isAnnotationPresent(PersistenceContext.class) || field.isAnnotationPresent(PersistenceUnit.class)) { if (Modifier.isStatic(field.getModifiers())) { // 动态属性不能注入 } currElements.add(new PersistenceElement(field, field, null)); } }); // 遍历本地办法 ReflectionUtils.doWithLocalMethods(targetClass, method -> { Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); // ... 代码省略 // 有 @PersistenceContext、@PersistenceUnit 注解 if ((bridgedMethod.isAnnotationPresent(PersistenceContext.class) || bridgedMethod.isAnnotationPresent(PersistenceUnit.class)) && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) { if (Modifier.isStatic(method.getModifiers())) { // 静态方法不能注入 } PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); currElements.add(new PersistenceElement(method, bridgedMethod, pd)); } }); // 增加进注入元素汇合 elements.addAll(0, currElements); // 遍历父类 targetClass = targetClass.getSuperclass(); } while (targetClass != null && targetClass != Object.class); return InjectionMetadata.forElements(elements, clazz); }}
5. EventListenerMethodProcessor
EventListenerMethodProcessor
的次要性能是处理事件监听@EventListener
public class EventListenerMethodProcessor implements SmartInitializingSingleton, ApplicationContextAware, BeanFactoryPostProcessor { // 单例bean初始化后 @Override public void afterSingletonsInstantiated() { ConfigurableListableBeanFactory beanFactory = this.beanFactory; // 获取所有的bean String[] beanNames = beanFactory.getBeanNamesForType(Object.class); for (String beanName : beanNames) { Class<?> type = null; try { // 获取bean类型 type = AutoProxyUtils.determineTargetClass(beanFactory, beanName); } catch (Throwable ex) { // ... 代码省略 } if (type != null) { // ... 代码省略 try { // 解决 bean processBean(beanName, type); } catch (Throwable ex) { // ... 代码省略 } } } } // 解决 bean private void processBean(final String beanName, final Class<?> targetType) { // 是以 org.springframework. 结尾的类或有 @EventListener 注解 if (!this.nonAnnotatedClasses.contains(targetType) && AnnotationUtils.isCandidateClass(targetType, EventListener.class) && !isSpringContainerClass(targetType)) { Map<Method, EventListener> annotatedMethods = null; try { // 抉择有 @EventListener 注解的办法 annotatedMethods = MethodIntrospector.selectMethods(targetType, (MethodIntrospector.MetadataLookup<EventListener>) method -> AnnotatedElementUtils.findMergedAnnotation(method, EventListener.class)); } catch (Throwable ex) { // ... 代码省略 } // 上下文对象 ConfigurableApplicationContext context = this.applicationContext; // 监听器工厂 List<EventListenerFactory> factories = this.eventListenerFactories; // 遍历办法 for (Method method : annotatedMethods.keySet()) { // 遍历工厂 for (EventListenerFactory factory : factories) { // 如果工厂间接解析监听办法 if (factory.supportsMethod(method)) { // 包装办法 Method methodToUse = AopUtils.selectInvocableMethod(method, context.getType(beanName)); // 封装为规范的监听器 ApplicationListener<?> applicationListener = factory.createApplicationListener(beanName, targetType, methodToUse); // ... 代码省略 // 增加进上下文 context.addApplicationListener(applicationListener); break; } } } } }}
6. DefaultEventListenerFactory
DefaultEventListenerFactory
的次要性能是封装有@EventListener
注解的办法为规范的监听器
public class DefaultEventListenerFactory implements EventListenerFactory, Ordered { @Override public ApplicationListener<?> createApplicationListener(String beanName, Class<?> type, Method method) { return new ApplicationListenerMethodAdapter(beanName, type, method); }}
实质上就是用 ApplicationListenerMethodAdapter
public class ApplicationListenerMethodAdapter implements GenericApplicationListener { // 调用监听办法 @Override public void onApplicationEvent(ApplicationEvent event) { processEvent(event); } // 处理事件 public void processEvent(ApplicationEvent event) { // 获取调用办法的参数,如果有payload,获取payload,没有就是event自身 Object[] args = resolveArguments(event); // 如果合乎@EventListener的condition设置,则触发 if (shouldHandle(event, args)) { // 调用method.invoke获取后果 Object result = doInvoke(args); if (result != null) { // 以此后果,持续派发其余事件 handleResult(result); } } }}
后续
更多博客,查看 https://github.com/senntyou/blogs
作者:深予之 (@senntyou)
版权申明:自在转载-非商用-非衍生-放弃署名(创意共享 3.0 许可证)