【学习笔记】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啟動類的包掃描路徑, 將該類放到第一個掃描的位置即可,如下:
三、參考文檔
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 太平洋证券:金融信创与数字人民币双轮驱动
- 下一篇: Centos下无线网卡的安装配置