背景主要是初始化时扫描自定义注解后,导致@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