结构:
AutowiredAnnotationBeanPostProcessor 类组织结构:
从类结构可以得知AutowiredAnnotationBeanPostProcessor 依赖的顶层接口为Ordered BeanPostProcessor Aware 这3个接口。
我们依次看一下这3个顶层接口的作用:
Ordered :
是一个可排序的注解标示,用于标示类的一个执行顺序,值最小,表示优先级越高。
在Ordered 基础上, PriorityOrdered 表示优先的顺序,其执行顺序总是在Ordered 之前。
我们看一个典型的Ordered 使用调用场景(invokeBeanFactoryPostProcessors),spring 进行BeanFactoryPostProcessors 钩子函数调用:
1. 无论怎样PriorityOrdered 的优先级是最高的,先是PriorityOrdered 的工厂钩子进行排序调用。
2.之后的Ordered 的调用,Ordered 进行排序后进行工厂钩子的调用。
3.没有实现排序接口的工厂钩子调用。
///获取所有实现了BeanFactoryPostProcessor 接口的bean String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false); // Separate between BeanFactoryPostProcessors that implement PriorityOrdered, // Ordered, and the rest. List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); List<String> orderedPostProcessorNames = new ArrayList<>(); List<String> nonOrderedPostProcessorNames = new ArrayList<>(); for (String ppName : postProcessorNames) { if (processedBeans.contains(ppName)) { // skip - already processed in first phase above } else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class)); } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered. sortPostProcessors(priorityOrderedPostProcessors, beanFactory); //1. 首先无论order 等级多大,先调用PriorityOrdered 的bean invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); // Next, invoke the BeanFactoryPostProcessors that implement Ordered. List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(); for (String postProcessorName : orderedPostProcessorNames) { orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } sortPostProcessors(orderedPostProcessors, beanFactory); //2.再调用ordered 排序的bean invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory); // Finally, invoke all other BeanFactoryPostProcessors. List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(); for (String postProcessorName : nonOrderedPostProcessorNames) { nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } //3.再调用没有实现ordered 注解的bean invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);