【学习笔记】springBoot中获取sping管理的bean
文章目錄
- 一、使用場(chǎng)景
- 二、springBoot中獲取sping管理的bean
- 2.1 生成工具類(lèi)SpringContextUtil
- 2.2 使用工具類(lèi)SpringContextUtil
- 2.3 注意事項(xiàng):getApplicationContext為Null問(wèn)題
- 三、參考文檔
一、使用場(chǎng)景
某些場(chǎng)景下,需要在某個(gè)普通的java類(lèi)(非Spring框架管理)中使用Spring管理的bean,這個(gè)時(shí)候可以使用實(shí)現(xiàn) ApplicationContextAware 的方式來(lái)獲取目標(biāo)bean.
二、springBoot中獲取sping管理的bean
2.1 生成工具類(lèi)SpringContextUtil
寫(xiě)一個(gè)工具類(lèi)SpringContextUtil,該類(lèi)實(shí)現(xiàn) ApplicationContextAware,通過(guò) beanName、bean對(duì)應(yīng)的Class、beanName+bean對(duì)應(yīng)的Class 三種方式來(lái)獲取目標(biāo)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對(duì)象:"+SpringContextUtil.applicationContext);}public static ApplicationContext getApplicationContext(){return applicationContext;}/*** 通過(guò)beanName獲取 Bean* @param beanName* @return*/public static Object getBean(String beanName){return getApplicationContext().getBean(beanName);}/*** 通過(guò)class獲取Bean* @param clazz* @return*/public static <T> T getBean(Class<T> clazz) {return getApplicationContext().getBean(clazz);}/*** 通過(guò)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、實(shí)現(xiàn)ApplicationContextAware接口:Spring項(xiàng)目啟動(dòng)初始化的過(guò)程中,會(huì)有一個(gè)步驟執(zhí)行ApplicationContextAware接口的實(shí)現(xiàn)類(lèi)的setApplicationContext方法,這樣我們就能拿到applicationContext信息,進(jìn)而可以通過(guò)sprig上下文獲取想要的bean。
2、需要使用 @Component ,讓spring能夠掃描到該工具類(lèi);
3、根據(jù)需求,可以通過(guò) beanName 或 bean對(duì)應(yīng)的class 獲取目標(biāo)bean;
2.2 使用工具類(lèi)SpringContextUtil
這里有個(gè)被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();} }在另外一個(gè)java類(lèi)中通過(guò)Spring上下文獲取這個(gè) “myTestDemo” bean,并用來(lái)生成一個(gè)對(duì)象:
@Configuration public class ApiIdentificatorConfig {@Bean("apiIdentificator")public ApiIdentificator getApiIdentificator(){// 獲取Spring上下文ApplicationContext context = SpringContextUtil.getApplicationContext();//從Spring上下文中取出 myTestBean beanMyTestDemo myTestDemo = (MyTestDemo)context.getBean("myTestDemo");// myTestBean 是生成 apiIdentificator 對(duì)象 的構(gòu)造參數(shù)return new DefaultApiIdentificatorImpl(myTestDemo);} }2.3 注意事項(xiàng):getApplicationContext為Null問(wèn)題
在上述使用過(guò)程中可能會(huì)出現(xiàn) “getApplicationContext為Null問(wèn)題 ”,原因是Spring初始化過(guò)程中SpringContextUtil.setApplicationContext() 方法沒(méi)有被執(zhí)行,導(dǎo)致 applicationContext 沒(méi)有獲取到。
解決辦法:在SpringBoot啟動(dòng)類(lèi)掃描的時(shí)候,該SpringContextUtil類(lèi)必須優(yōu)先執(zhí)行類(lèi)掃描。
具體來(lái)說(shuō)有兩種解法:
way1: 將 SpringContextUtil.java 這個(gè)類(lèi)和springboot啟動(dòng)類(lèi)放同一包下;
way2: 更改springboot啟動(dòng)類(lèi)的包掃描路徑, 將該類(lèi)放到第一個(gè)掃描的位置即可,如下:
三、參考文檔
1、spring boot獲取spring容器中的bean對(duì)象:https://blog.csdn.net/qq_29235677/article/details/119652555
2、spring啟動(dòng)流程的源碼分析:https://blog.csdn.net/qq_29235677/article/details/118458990
3、SpringApplication.run執(zhí)行流程詳解:https://blog.csdn.net/javaheheda/article/details/104963485
總結(jié)
以上是生活随笔為你收集整理的【学习笔记】springBoot中获取sping管理的bean的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 太平洋证券:金融信创与数字人民币双轮驱动
- 下一篇: 最近大火的高性能计算ChatGPT究竟是