ApplicationContextAware,BeanDefinitionRegistryPostProcessor,CommandLineRunner三个接口启动顺序

背景主要是初始化时扫描自定义注解后,导致@Autowired扫描失败

一、三个接口启动顺序先说结论 

BeanDefinitionRegistryPostProcessor:在容器初始化开始时,

ApplicationContextAware:在容器初始化结束前

CommandLineRunner:在容器初始化结束后,程序启动后

二、使用方法

1、BeanDefinitionRegistryPostProcessor

Spring启动时扫描注解,是通过BeanFactoryPostProcessor接口的postProcessBeanFactory方法,configurableListableBeanFactory.getBeansWithAnnotation(MyAnnotation.class);获取每一个有自定义注解的Bean。

这种方法可以在程序的最最开始就扫描所有注解,将自定义注解过滤出来。但是有个比较严重的问题:

在添加自定义注解的类中,@Autowired的自动注入会失败

例如:

@Component
@Lazy(true)
public class EventAnnotationScannerConfig implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        Map<String, Object> map = configurableListableBeanFactory.getBeansWithAnnotation(EventOperate.class);
        Map<String, String> eventMap = new HashMap<>();
        Iterator it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, Object> entry = (Map.Entry) it.next();
            String name = entry.getKey();
            Object object = entry.getValue();
            if (object.getClass().isAnnotationPresent(EventOperate.class)) {//判断方法是否有MyAnnotation注解
                EventOperate eventOperate = object.getClass().getAnnotation(EventOperate.class);
                String eventType=eventOperate.eventType();
                if(StringUtils.isEmpty(eventType)){
                    continue;
                }
//              多个事件类型对应相同的处理方法
                String[] eventTypeArr = eventType.split(",");
                for (String event:eventTypeArr){
                    eventMap.put(event, name);
                }
            }
        }
        EventConfigUtils.setEventMap(eventMap);

    }

}

2、ApplicationContextAware

3、CommandLineRunner

参考链接:https://blog.csdn.net/ztchun/article/details/90814135

猜你喜欢

转载自blog.csdn.net/luansj/article/details/103403411