处理实现了Ordered接口的BeanDefinitionRegistryPostProcessor
//...省略之前代码片段 //调用ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry方法 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); //清空,以便处理后面的后置处理器 currentRegistryProcessors.clear(); //再次查找实现了BeanDefinitionRegistryPostProcessor接口的BeanName,这里就是从配置类中解析出来的一些 postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { //不包括已经处理过的,并且先处理实现Ordered接口的 if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } //根据Ordered排序 sortPostProcessors(currentRegistryProcessors, beanFactory); //将后置处理器放到已注册的集合中 registryProcessors.addAll(currentRegistryProcessors); //调用所有后置处理器的postProcessBeanDefinitionRegistry方法 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); //再次清理,因为后面还要处理未实现Ordered接口的 currentRegistryProcessors.clear();最后需要循环处理剩下的所有后置处理器,因为可能从剩下的后置处理器中又解析出新的后置处理器
//下面的逻辑和上面的一模一样,while循环处理所有剩下的后置处理器,直到全部处理完毕 boolean reiterate = true; while (reiterate) { reiterate = false; postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (!processedBeans.contains(ppName)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); reiterate = true; } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); currentRegistryProcessors.clear(); }调用所有后置处理器的postProcessBeanFactory方法
/** * 调用所有后置处理器的postProcessBeanFactory方法, * 如果自己没实现的话,Spring中只有一个内置的ConfigurationClassPostProcessor * ConfigurationClassPostProcessor中的postProcessBeanFactory方法主要是将配置类换成动态代理 */ invokeBeanFactoryPostProcessors(registryProcessors, beanFactory); invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);ConfigurationClassPostProcessor#postProcessBeanFactory
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { //将所有配置类进行动态代理,这样@Bean中依赖其他的Bean就可以从容器中拿bean了 /** * example: * @Bean * public Car car(){ * return new Car(wheel()); * } * @Bean * public Wheel wheel(){ * return new Wheel(); * } * 如果配置类不换成动态代理的话,每次从容器中拿car都将new一个wheel * 注意,这里只有full类型的配置类才会生成代理类,lite类型的不会, * 所以lite类型的配置类每次获取car都会生成一个wheel */ enhanceConfigurationClasses(beanFactory); //添加一个beanPostProcessor beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory)); }