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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【学习笔记】springBoot中获取sping管理的bean

發布時間:2024/3/26 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学习笔记】springBoot中获取sping管理的bean 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、使用場景
  • 二、springBoot中獲取sping管理的bean
    • 2.1 生成工具類SpringContextUtil
    • 2.2 使用工具類SpringContextUtil
    • 2.3 注意事項:getApplicationContext為Null問題
  • 三、參考文檔

一、使用場景

某些場景下,需要在某個普通的java類(非Spring框架管理)中使用Spring管理的bean,這個時候可以使用實現 ApplicationContextAware 的方式來獲取目標bean.

二、springBoot中獲取sping管理的bean

2.1 生成工具類SpringContextUtil

寫一個工具類SpringContextUtil,該類實現 ApplicationContextAware,通過 beanName、bean對應的Class、beanName+bean對應的Class 三種方式來獲取目標bean,具體如下:

package com.bigbear.test.utils; @Component @Slf4j public class SpringContextUtil implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {if (SpringContextUtil.applicationContext == null) {SpringContextUtil.applicationContext = applicationContext;}log.info("ApplicationContext配置成功,applicationContext對象:"+SpringContextUtil.applicationContext);}public static ApplicationContext getApplicationContext(){return applicationContext;}/*** 通過beanName獲取 Bean* @param beanName* @return*/public static Object getBean(String beanName){return getApplicationContext().getBean(beanName);}/*** 通過class獲取Bean* @param clazz* @return*/public static <T> T getBean(Class<T> clazz) {return getApplicationContext().getBean(clazz);}/*** 通過beanName,以及Clazz返回指定的Bean* @param name* @param clazz* @param <T>* @return*/public static <T> T getBean(String beanName, Class<T> clazz) {return getApplicationContext().getBean(beanName, clazz);} }

1、實現ApplicationContextAware接口:Spring項目啟動初始化的過程中,會有一個步驟執行ApplicationContextAware接口的實現類的setApplicationContext方法,這樣我們就能拿到applicationContext信息,進而可以通過sprig上下文獲取想要的bean。

2、需要使用 @Component ,讓spring能夠掃描到該工具類;

3、根據需求,可以通過 beanName 或 bean對應的class 獲取目標bean;

2.2 使用工具類SpringContextUtil

這里有個被Spring管理的bean : myTestDemo

@Service("myTestDemo") public class MyTestDemo {@Autowiredprivate UserService userService;public String getPasswordByAppId(String loginName) {UserDo userDo = userService.findUserByLoginName(loginName);if(ObjectUtils.isEmpty(userDo) || StringUtils.isEmpty(userDo.getPassword())){return "";}return userDo.getPassword();} }

在另外一個java類中通過Spring上下文獲取這個 “myTestDemo” bean,并用來生成一個對象:

@Configuration public class ApiIdentificatorConfig {@Bean("apiIdentificator")public ApiIdentificator getApiIdentificator(){// 獲取Spring上下文ApplicationContext context = SpringContextUtil.getApplicationContext();//從Spring上下文中取出 myTestBean beanMyTestDemo myTestDemo = (MyTestDemo)context.getBean("myTestDemo");// myTestBean 是生成 apiIdentificator 對象 的構造參數return new DefaultApiIdentificatorImpl(myTestDemo);} }

2.3 注意事項:getApplicationContext為Null問題

在上述使用過程中可能會出現 “getApplicationContext為Null問題 ”,原因是Spring初始化過程中SpringContextUtil.setApplicationContext() 方法沒有被執行,導致 applicationContext 沒有獲取到。

解決辦法:在SpringBoot啟動類掃描的時候,該SpringContextUtil類必須優先執行類掃描。

具體來說有兩種解法:
way1: 將 SpringContextUtil.java 這個類和springboot啟動類放同一包下;
way2: 更改springboot啟動類的包掃描路徑, 將該類放到第一個掃描的位置即可,如下:

@SpringBootApplication(scanBasePackages = {"com.bigbear.test.utils","com.bigbear.test.*"}) public class SpringBootHelloApplication {public static void main(String[] args) {SpringApplication.run(SpringBootHelloApplication.class, args);} }

三、參考文檔

1、spring boot獲取spring容器中的bean對象:https://blog.csdn.net/qq_29235677/article/details/119652555
2、spring啟動流程的源碼分析:https://blog.csdn.net/qq_29235677/article/details/118458990
3、SpringApplication.run執行流程詳解:https://blog.csdn.net/javaheheda/article/details/104963485

總結

以上是生活随笔為你收集整理的【学习笔记】springBoot中获取sping管理的bean的全部內容,希望文章能夠幫你解決所遇到的問題。

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