SpringBoot怎么选择自有bean优先加载

实现方法

DependsOn注解

这个@dependson网上实现方法很多,依赖的bean数目较少的话,比较好弄,但数目变多后,就比较麻烦了,每个类都需要重新写一遍,因此推荐第二种方法。

ApplicationContextInitializer

通过注册 ApplicationContextInitializer 后,就可以注册 BeanDefinitionRegistryPostProcessor 到 Spring里面。最后实现 BeanDefinitionRegistryPostProcessor ,注册目标 bean。

 class DemoApplicationContextInitializer implements ApplicationContextInitializer {  @Override  public void initialize(ConfigurableApplicationContext applicationContext) {      applicationContext.addBeanFactoryPostProcessor(new DemoBeanDefinitionRegistryPostProcessor());  }}

登录后复制

实现 BeanDefinitionRegistryPostProcessor:

public class DemoBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {  // from BeanDefinitionRegistryPostProcessor interface  @Override  public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {// 重点在这里,这里可以把自己的 想要提起 实现的 或者初始化的 bean  加到这里beanDefinitionRegistry.registerBeanDefinition("DemoService",new RootBeanDefinition(DemoService.class));  }  // from BeanDefinitionRegistryPostProcessor interface  @Override  public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {  }// from PriorityOrdered  interface  @Override  public int getOrder() {  // 排在 ConfigurationClassPostProcessor 之前即可      return Ordered.LOWEST_PRECEDENCE - 1;  }}

登录后复制

这里需要注意的是,不能使用 @Componet 或者其他的注解进行注册 BeanDefinitionRegistryPostProcessor。

因为@Componet 注解方式能注册的前提是 被 ConfigurationClassPostProcessor 扫描到,而现在,我们需要考虑我们的bean注册,要在这些bean之前,所以一定不能被“它-ConfigurationClassPostProcessor”管理 。 换一个角度思考,如果被 “它” 管理类 注册出来的bean 一定不可能排在 ConfigurationClassPostProcessor 的前面。

注意:@Order 这个只能控制 spring 自身 bean的顺序,对于 @Service @Component 、@Repository这些注解是不能控制的。

简单Demo

需求:笔者想让TestService 提前被注册,并且执行后,其他bean 才能被注册。

public class TestService {    // 存放系统配置    private static Map GLOBAL_CONF = new HashMap();    @PostConstruct    public void init() {        // 先做初始化 GLOBAL_CONF 或者其他 IO操作        // GLOBAL_CONF.put(key, value);    }    //其他 bean 通过这个方法获得系统配置    public static String getGlobalConfig(String key) {        return GLOBAL_CONF.get(key);    }}

登录后复制

实现:(为了简单,直接实现上述的3个接口)

public class DemoBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered, ApplicationContextInitializer {    /**     *  第二步: 注册 自己的 bean     *     * @param beanDefinitionRegistry     */    // from BeanDefinitionRegistryPostProcessor interface    @Override    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {        beanDefinitionRegistry.registerBeanDefinition("TestService",new RootBeanDefinition(TestService.class));    }    // from BeanDefinitionRegistryPostProcessor interface    @Override    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {    }// from PriorityOrdered  interface    @Override    public int getOrder() {        return Ordered.LOWEST_PRECEDENCE - 1;    }    /**     *  第一步 先注册 到 configurableApplicationContext 中     *     * @param configurableApplicationContext     */    // from ApplicationContextInitializer  interface    @Override    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {        configurableApplicationContext.addBeanFactoryPostProcessor(new DemoBeanDefinitionRegistryPostProcessor());    }}

登录后复制

以上就是SpringBoot怎么选择自有bean优先加载的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2627015.html

(0)
上一篇 2025年3月7日 00:59:28
下一篇 2025年2月18日 09:34:22

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论