日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot 学习系列(09)—自定义Bean的顺序加载

發布時間:2025/4/16 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot 学习系列(09)—自定义Bean的顺序加载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

此文已由作者易國強授權網易云社區發布。

歡迎訪問網易云社區,了解更多網易技術產品運營經驗。

Bean 的順序加載

  • 有些場景中,我們希望編寫的Bean能夠按照指定的順序進行加載。比如,有UserServiceBean和OrderServiceBean,我們需要在OrderServiceBean中調用UserServiceBean,獲取其提供的一些數據信息。針對這一場景,通常來說,有這么幾種方式:

  • 1、將UserServiceBean封裝成一個服務類(如采用@Service注解),然后在OrderServiceBean中引入這個服務類,直接調用即可,簡單快捷。示例如下所示:

    ??@Service("userServiceBean")??public?class?UserServiceBean?{??????public?String?print()?{System.out.println("this?is?UserServiceBean?print");??????????return?"print?ok";}}??@Service("orderServiceBean")??public?class?OrderServiceBean?{??????@ResourceUserServiceBean?userServiceBean;??????public?void?invoke(){String?ret?=?userServiceBean.print();System.out.println("this?is?OrderServiceBean?invoke?"?+?ret?);}}
  • 2、然而有些時候,我們的xxxServiceBean是沒有封裝成服務的,只是作為一個單純的Bean注入到Spring容器中。這個時候如果我們需要使用這個Bean實例,通常會考慮直接從ApplicationContext中以getBean("xxxServiceBean")的方式獲取。

    • 在傳統的項目中,我們一般都會在xml配置文件中注入xxxServiceBean,這個時候Spring容器會依據xml中代碼編寫的順序依次加載各個Bean,示例如下所示:

      <!--?按代碼編寫順序依次加載?--><!--?訂單服務Bean?--><bean?id="orderServiceBean"?class="com.example.a.OrderServiceBean"></bean><!--?演示服務--><bean?id="depService"?class="com.example.a.DepService"></bean><!--?演示服務--><bean?id="demoService"?class="com.example.a.OtherDemoServiceImpl"></bean><!--?用戶服務Bean--><bean?id="userServiceBean"?class="com.example.a.UserServiceBean"></bean>

      在各構造函數中加入日志輸出可發現,會按照順序依次加載。如下圖所示:

![image](https://github.com/siyuyifang/image/blob/master/spring-boot/9/9-1.png?raw=true)-?如果我們在OrderServiceBean中有調用UserServiceBean,那么UserServiceBean則會優先于DepService和OtherDemoServiceImpl加載,調用代碼如下:```public?class?OrderServiceBean?{public?OrderServiceBean()?{System.out.println("OrderServiceBean?constructor?init.");UserServiceBean??userServiceBean?=??SpringContextHolder.getBean("userServiceBean");String?ret?=?userServiceBean.print();System.out.println("this?is?OrderServiceBean?invoke?"?+?ret?); } } ``` 這個時候觀察加載的順序如下圖所示:![image](https://github.com/siyuyifang/image/blob/master/spring-boot/9/9-2.png?raw=true)-?在Spring?Boot項目中,我們一般用@Configuration?+?@Bean注解的方式來替代xml中Bean的注入,這個時候定義Bean的加載順序也很簡單,在同一個配置類中,也是按照代碼的編寫順序加載實例化的。示例如下所示:```@Configurationpublic?class?MyConfigs?{@Bean("userServiceBean")public?UserServiceBean?userServiceBean(){????return?new?UserServiceBean(); }@Bean("orderServiceBean")public?OrderServiceBean?orderServiceBean(){????return?new?OrderServiceBean(); } ```
  • 有這么一個使用場景,如果UserServiceBean 采用@Bean + @Configuration的方式注入,而OrderServiceBean采用@Service注解的形式提供服務,同時在OrderServiceBean中仍然通過ApplicationContext的getBean()方式獲取UserServiceBean的示例,那么在編譯時候會報如下錯誤:

其中SpringContextHolder.java的代碼如下所示:

@Component("springContextHolder")public?class?SpringContextHolder?implements?ApplicationContextAware?{????private?static?ApplicationContext?applicationContext;????/***?實現ApplicationContextAware接口的context注入函數,?將其存入靜態變量.*/@Overridepublic?void?setApplicationContext(ApplicationContext?applicationContext)?{SpringContextHolder.applicationContext?=?applicationContext;}????/***?取得存儲在靜態變量中的ApplicationContext.*/public?static?ApplicationContext?getApplicationContext()?{checkApplicationContext();????????return?applicationContext;}????/***?從靜態變量ApplicationContext中取得Bean,?自動轉型為所賦值對象的類型.*/@SuppressWarnings("unchecked")????public?static?<T>?T?getBean(String?name)?{checkApplicationContext();????????return?(T)?applicationContext.getBean(name);}????private?static?void?checkApplicationContext()?{????????if?(applicationContext?==?null)?{????????????throw?new?IllegalStateException("applicaitonContext未注入,請在applicationContext.xml中定義SpringContextUtil");}} }
  • 這個時候,我們需要在OrderServiceBean類前加入如下注解,表示此Bean依賴于springContextHolder實例的加載,代碼示例如下所示,再次編譯通過。

@Service @DependsOn("springContextHolder")public?class?OrderServiceBean?{????public?OrderServiceBean()?{System.out.println("OrderServiceBean?constructor?init.");UserServiceBean??userServiceBean?=??SpringContextHolder.getBean("userServiceBean");String?ret?=?userServiceBean.print();System.out.println("this?is?OrderServiceBean?invoke?"?+?ret?);}}
  • 此外,如果需要指定一個Bean A 先于 Bean B加載,那么可以在Bean B類前加入@DependsOn("beanA"),指定依賴加載順序。

  • 不足之處,歡迎指正,謝謝~


免費體驗云安全(易盾)內容安全、驗證碼等服務

更多網易技術、產品、運營經驗分享請點擊。



相關文章:
【推薦】?如何能低成本地快速獲取大量目標用戶,而不是與競爭對手持久戰?
【推薦】?小白用shiro(1)

轉載于:https://www.cnblogs.com/163yun/p/9887317.html

總結

以上是生活随笔為你收集整理的Spring Boot 学习系列(09)—自定义Bean的顺序加载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天射美女| 黄色网页在线看 | 永久免费黄色 | av免费资源| 国产福利视频在线 | 91麻豆精品久久久久蜜臀 | 欧美成人性生活 | 综合久久久久久久 | 无码人妻精品一区二区蜜桃视频 | 美女扒开腿让男人捅 | 又紧又大又爽精品一区二区 | 久久九色| 精品人妻一区二区免费视频 | 成人激情开心 | 第九色激情 | 天天躁日日摸久久久精品 | 一级毛片aa | 亚洲成年人免费观看 | 麻豆自拍视频 | 色婷婷av一区二区三区gif | 91中文字日产乱幕4区 | 欧美一级一级 | 爱爱视频一区二区 | 日本老小玩hd老少配 | 亚洲阿v天堂| 国产男女自拍 | 亚洲精品在线免费看 | 一级一级黄色片 | 亚洲伦理在线观看 | 久久成人在线观看 | 久久久久a | 性色AV无码久久一区二区三 | 免费在线黄色网 | 国产资源一区 | 大胸美女被爆操 | 亚洲自拍偷拍第一页 | 久久久久网站 | 四虎影院在线视频 | 99热这里只有精品18 | 国产精品一卡二卡 | 亚洲视频区 | 亚洲狠狠丁香婷婷综合久久久 | 天天摸天天看 | 亚洲激情网址 | 99久久久国产精品无码免费 | 黄色aa级片| 亚洲欧美日韩偷拍 | 中文字幕1| 麻豆tube | 成年在线观看视频 | 精品国产一区二区三区四 | 在线天堂6 | 日日射天天干 | xxxx精品| 国产美女无遮挡网站 | 特级丰满少妇一级aaaa爱毛片 | 日本大尺度吃奶做爰久久久绯色 | 天天搞天天 | 久艹在线播放 | 黄色小视频大全 | 女人夜夜春| 国产wwww| 亚洲色图欧美日韩 | www.com操| 精品国产a线一区二区三区东京热 | 日产精品久久久久 | 麻豆av网站| 色婷婷狠狠爱 | 魔性诱惑 | 日韩成人在线免费观看 | 国产成人精品aa毛片 | 一区二区三区美女视频 | 欧美男女视频 | 波多野结衣视频免费观看 | 少妇人妻一区二区三区 | 欧美丰满少妇 | 成人作爱视频 | 色婷婷电影网 | 黄色三级免费观看 | 国产永久精品大片wwwapp | 亚洲国产成人精品激情在线 | 国产乱国产乱老熟 | 爱情岛论坛亚洲自拍 | 成人手机看片 | 人妻丰满熟妇岳av无码区hd | 秋霞免费av | 天天色网站| 亚洲美女屁股眼交8 | 免费的黄色av | 成人动漫一区二区 | 午夜免费网 | 亚洲69av| 欧美乱子伦 | 一级片免费| 99色在线视频 | 国产精品久久久久久久久久久不卡 | 午夜精品视频在线 | 最好看的2019中文大全在线观看 | 色av免费 |