中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot怎么選擇自有bean優先加載

發布時間:2023-03-14 10:13:02 來源:億速云 閱讀:134 作者:iii 欄目:開發技術

本篇內容主要講解“SpringBoot怎么選擇自有bean優先加載”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“SpringBoot怎么選擇自有bean優先加載”吧!

    實現方法

    DependsOn注解

    這個@DependsOn網上實現方法很多,依賴的bean數目較少的話,比較好弄,但數目變多后,就比較麻煩了,每個類都需要重新寫一遍,因此推薦第二種方法。

    ApplicationContextInitializer

    通過注冊 ApplicationContextInitializer 后,就可以注冊 BeanDefinitionRegistryPostProcessor 到 Spring里面。最后實現 BeanDefinitionRegistryPostProcessor ,注冊目標 bean。

     class DemoApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
      @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<String, String> 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<ConfigurableApplicationContext> {
        /**
         *  第二步: 注冊 自己的 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優先加載”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    静宁县| 宜都市| 永康市| 丘北县| 垣曲县| 社旗县| 许昌市| 莱阳市| 临沂市| 安国市| 福海县| 镇巴县| 栖霞市| 黄平县| 长汀县| 高碑店市| 奇台县| 修水县| 岫岩| 杨浦区| 平果县| 华池县| 南皮县| 民权县| 灵山县| 华蓥市| 兰州市| 太和县| 镇原县| 泸州市| 陆河县| 涟源市| 绍兴市| 常山县| 和田市| 博白县| 大连市| 昌吉市| 武宁县| 高陵县| 廉江市|