确保某个BeanDefinitionRegistryPostProcessor Bean被最后执行的几种实现方式
发布日期:2021-05-09 09:34:29 浏览次数:18 分类:博客文章

本文共 13822 字,大约阅读时间需要 46 分钟。

������

������������������

��� ���������������������������������������������������JAR������������������������������������������������������������������������������������������������������������������������������JAR������������������������������������������������������������������������������BEAN������������������������������������������������������������������������������������������BEAN���������������������������������BEAN���������������������������������������������������������������������������������

������������������������

��� ���������������������������������������������������������BEAN������������������������������@Compent���������������������������������BEAN������������������������BeanDefinitionRegistryPostProcessor BEAN���������������������BEAN���������BEAN���������������������������������������������������������������������������BeanDefinitionRegistryPostProcessor BEAN���������postProcessBeanDefinitionRegistry������������������������������BEAN������������������������������������������BEAN���������������BeanDefinition���������������������BEAN������������������������������������������������������BEAN���������������������������������������������������������������������OK���������������������������������BEAN������������������������������������������������������������������������BeanDefinitionRegistryPostProcessor BEAN���������������������������������������BEAN������������BeanDefinitionRegistryPostProcessor BEAN���������������������������������������������������������BeanDefinitionRegistryPostProcessor BEAN���postProcessBeanDefinitionRegistry���������������������������������BEAN���������������BeanDefinition������������������������������������������������������������������������������������������������

���������������������������������������

��� ������������������������������������������������������BeanDefinitionRegistryPostProcessor ���������������������Bean������������������������������������������������������������������������BEAN������������BeanDefinitionRegistryPostProcessor BEAN������������OldBeanDefinitionRegistryPostProcessor���������������������������������������������������������������������������Bean���BeanDefinition,���������������������������BeanDefinition���������������������������������Bean������������������������������������Bean������������������������������������������������������������������������������������������������������������������������������������������������������������AOP���������������������������������������@Around������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������protected���������������������������BEAN������������������������������������������������������������������������������BEAN���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������AOP���������������������������������������������������������������������������������������������������������������������������������������������

���������������������������������������������������������������������BeanDefinitionRegistryPostProcessor ���������������������Bean���������������������������������������

���������������������

������������������������������������������BeanDefinitionRegistryPostProcessor ���BEAN������������������������������������������PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors���������������������BeanDefinitionRegistryPostProcessor BEAN������������������������BEAN������������������������������������������������������������������������������������������������������������������BeanDefinitionRegistryPostProcessor BEAN������������������������������������������������������������������

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();			}

���������������������������

//������������������������������BeanDefinitionRegistryPostProcessor BEAN������������������������������������BEAN������NewBeanDefinitionRegistryPostProcessor BEAN//author:zuowenjun@Componentpublic class FirstDynamicBeanPostProcessor implements BeanDefinitionRegistryPostProcessor {    @Override    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {   BeanDefinitionBuilder beanDefinitionBuilder=BeanDefinitionBuilder.genericBeanDefinition(NewBeanDefinitionRegistryPostProcessor.class);beanDefinitionRegistry.registerBeanDefinition("newBeanDefinitionRegistryPostProcessor",beanDefinitionBuilder.getBeanDefinition());        System.out.printf("���%1$tF %1$tT.%1$tL���%s,FirstDynamicBeanPostProcessor.postProcessBeanDefinitionRegistry%n", new Date());    }    @Override    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {        System.out.printf("���%1$tF %1$tT.%1$tL���%s,FirstDynamicBeanPostProcessor.postProcessBeanFactory%n", new Date());    }}//���������������������������Bean���������������������������������Bean(���������������������������������������������������)public class NewBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {    @Override    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {        System.out.printf("���%1$tF %1$tT.%1$tL���%s,NewBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry%n",new Date());        boolean isContainsSpecialBean = ((DefaultListableBeanFactory) beanDefinitionRegistry).containsBean("old������Bean������");        if (isContainsSpecialBean) {            beanDefinitionRegistry.removeBeanDefinition("old������Bean������");            BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(DemoCompentB.class);            beanDefinitionBuilder.addConstructorArgValue(((DefaultListableBeanFactory) beanDefinitionRegistry).getBean(NewBeanAdapter.class)); //NewBeanAdapter������������old������Bean���������������������������            AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();            beanDefinition.setPrimary(true);            beanDefinitionRegistry.registerBeanDefinition("old������Bean������", beanDefinition);        }    }    @Override    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {        System.out.printf("���%1$tF %1$tT.%1$tL���%s,NewBeanDefinitionRegistryPostProcessor.postProcessBeanFactory%n",new Date());    }}

������������������������������(������������NewBeanDefinitionRegistryPostProcessor������OldBeanDefinitionRegistryPostProcessor���������������������������������������������Bean���������)

FirstDynamicBeanPostProcessor.postProcessBeanDefinitionRegistry (���������)

OldBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry (���������)

NewBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry ���������������

FirstDynamicBeanPostProcessor.postProcessBeanFactory

OldBeanDefinitionRegistryPostProcessor.postProcessBeanFactory

NewBeanDefinitionRegistryPostProcessor.postProcessBeanFactory

���������������������

������������������������������������BeanDefinitionRegistryPostProcessor BEAN���������PriorityOrdered���BeanFactoryAware������������������BEAN���������������(Order=0)������������postProcessBeanDefinitionRegistry���������������applicationContext.setDependencyComparator������������������������������������������BeanDefinitionRegistryPostProcessor BEAN���������������������������������������������������������������BeanDefinitionRegistryPostProcessor BEAN������������������sortPostProcessors������������������������������������������������DependencyComparator������������������������������������������������������������������������������������������

private static void sortPostProcessors(List
postProcessors, ConfigurableListableBeanFactory beanFactory) { Comparator comparatorToUse = null; if (beanFactory instanceof DefaultListableBeanFactory) { comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator(); } if (comparatorToUse == null) { comparatorToUse = OrderComparator.INSTANCE; } postProcessors.sort(comparatorToUse); }//���������invokeBeanFactoryPostProcessors���������������sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);

���������������������������

@Component    public static class FirstBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered        , BeanFactoryAware {        private BeanFactory beanFactory;        @Override        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {            this.beanFactory=beanFactory;       }        @Override        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {            ((DefaultListableBeanFactory) beanFactory).setDependencyComparator(new OrderComparator(){                @Override                protected int getOrder(Object obj) {                    if (obj instanceof NewBeanDefinitionRegistryPostProcessor){ //���������NewBeanDefinitionRegistryPostProcessor���������������������������������������                        return Integer.MAX_VALUE;                    }                    return super.getOrder(obj)-1; //������������������������������1                }            });            System.out.printf("���%1$tF %1$tT.%1$tL���%s,FirstBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry%n", new Date());        }        @Override        public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {            System.out.printf("���%1$tF %1$tT.%1$tL���%s,FirstBeanDefinitionRegistryPostProcessor.postProcessBeanFactory%n", new Date());        }        @Override        public int getOrder() {            return 0;//������        }    }

���������������������������������NewBeanDefinitionRegistryPostProcessor���OldBeanDefinitionRegistryPostProcessor���������������

FirstBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry ������1������������PriorityOrdered���������

OldBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry ������3������������BEAN���������

NewBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry ������3������������BEAN���������

FirstBeanDefinitionRegistryPostProcessor.postProcessBeanFactory

OldBeanDefinitionRegistryPostProcessor.postProcessBeanFactory

NewBeanDefinitionRegistryPostProcessor.postProcessBeanFactory

���������������������

���������������������������DeferredImportSelector������������@Import���������������NewBeanDefinitionRegistryPostProcessor������������������������BEAN������������������������������������������������������������������DeferredImportSelector���������������������������@Configuration������bean���������������

���������������������������

public static class BeansImportSelector implements DeferredImportSelector {        @Override        public String[] selectImports(AnnotationMetadata importingClassMetadata) {            return new String[]{NewBeanDefinitionRegistryPostProcessor.class.getName()};        }    }@Configuration@Import(BeansImportSelector.class)public class BeansConfig {    }

���������������������������������NewBeanDefinitionRegistryPostProcessor���OldBeanDefinitionRegistryPostProcessor���������������

OldBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry

NewBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry

OldBeanDefinitionRegistryPostProcessor.postProcessBeanFactory

NewBeanDefinitionRegistryPostProcessor.postProcessBeanFactory

���������������������

������������������������������������������������������������������������������������������������������������������������������������������������������������������DependencyComparator���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BEAN������������������PriorityOrdered���Order���������������@Order������������������������������������������������������������������������������������������������������������������������������Order���������������������������������������������������������������

@Componentpublic class OldBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor,Order {            @Override        public int getOrder() {            return 100;        }        ...}@Componentpublic class NewBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor,Order {            @Override        public int getOrder() {            return 101;//���������������OldBeanDefinitionRegistryPostProcessor.getOrder������������        }        ...}
上一篇:NVelocity的基本用法
下一篇:feignclient各种使用技巧说明

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月21日 02时27分10秒