项目过程中,发现需要一个Bean在所有Bean被加载前被容器初始化,并向后面初始化的Bean提供一些功能,于是有了如下需求,阅读源码解决了该需求。
通过实现BeanDefinitionRegistryPostProcessor和PriorityOrdered接口实现
@Component
public class SpringCoreUtil implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// 不做任何业务处理,仅仅让spring优先加载这个SpringCoreUtil类
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// 不做任何业务处理,仅仅让spring优先加载这个SpringCoreUtil类
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
}
源码:
首先要知道BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子类
进入refresh()方法中,找到如下方法
该方法会注册所有 实现了BeanFactoryPostProcessor接口的类,在容器中获得对应的Bean,
在此处将我们定义的类通过getBean()方法优先注入到容器中