Springboot 如何獲取上下文對(duì)象
Springboot上下文對(duì)象獲取
package it.benjamin.aspirinweb.mem;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* 獲取Springboot上下文,通過(guò)上下文可以拿到配置文件中的配置參數(shù)
*/
@Component
public class AppContextTool implements ApplicationContextAware {
private static ApplicationContext context;
public String getConfig(String key) {
return context.getEnvironment().getProperty(key);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
}
或者更簡(jiǎn)單的寫法:
定義一個(gè)AppUtil.java類:
public class AppUtil {
public static ConfigurableApplicationContext CONTEXT;
}
在啟動(dòng)類中進(jìn)行賦值
public static void main(String[] args) {
AppUtil.CONTEXT = SpringApplication.run(RedisFlinkApplication.class, args);
}
spring boot獲取上下文 隨時(shí)取出被spring管理的bean對(duì)象
方法一:
實(shí)現(xiàn)ApplicationContextAware,重寫setApplicationContext方法。這個(gè)方式下,工具類也被注冊(cè)成了Bean,既然這樣,那就必須確保該類能被Spring自動(dòng)掃描到。
@Component
public class SpringContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtils.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> cls) {
if (applicationContext == null) {
throw new RuntimeException("applicationContext注入失敗");
}
return applicationContext.getBean(cls);
}
public static Object getBean(String name) {
if (applicationContext == null) {
throw new RuntimeException("applicationContext注入失敗");
}
return applicationContext.getBean(name);
}
public static <T> T getBean(String name, Class<T> cls) {
if (applicationContext == null) {
throw new RuntimeException("applicationContext注入失敗");
}
return applicationContext.getBean(name, cls);
}
public static HttpServletRequest getRequest() {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
return requestAttributes == null ? null : requestAttributes.getRequest();
}
}
方式二:
我想要的工具類,往往會(huì)部署在公共jar中,一般情況下不能被SpringBoot程序掃描到。所有就有手動(dòng)注入上下文的方式。
@Slf4j
public class SpringUtils {
private SpringUtils() {
}
private static ApplicationContext context = null;
/**
* 初始化Spring上下文
*
* @param ctx 上下文對(duì)象
*/
public static void initContext(ApplicationContext ctx) {
if(ctx == null) {
log.warn("ApplicationContext is null.");
return;
}
context = ctx;
}
/**
* 根據(jù)類型獲取Bean
*
* @param cls Bean類
* @param <T> Bean類型
* @return Bean對(duì)象
*/
public static <T> T getBean(Class<T> cls) {
return context == null ? null : context.getBean(cls);
}
/**
* 根據(jù)名稱獲取Bean
*
* @param name Bean名稱
* @return Bean對(duì)象
*/
public static Object getBean(String name) {
return context == null ? null : context.getBean(name);
}
/**
* 根據(jù)Bean名稱和類獲取Bean對(duì)象
*
* @param name Bean名稱
* @param cls Bean類
* @param <T> Bean類型
* @return Bean對(duì)象
*/
public static <T> T getBean(String name, Class<T> cls) {
return context == null ? null : context.getBean(name, cls);
}
}
此種方式不用實(shí)現(xiàn)ApplicationContextAware接口,但是需要手動(dòng)設(shè)置上下文。所以在程序入口處,需要調(diào)用initContext方法,完成上下文的初始化。
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(YCloudsServiceBApplication.class, args);
SpringUtils.initContext(context);
}
GitHub地址:https://github.com/ye17186/spring-boot-learn
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot詳解線程池與多線程及阻塞隊(duì)列的應(yīng)用詳解
本例應(yīng)用線程池、多線程、阻塞隊(duì)列處理一個(gè)流程任務(wù)。本例處理一個(gè)訂單流程,主要包括生成訂單、訂單處理、訂單入庫(kù),下面我們一起看看2022-06-06
java數(shù)據(jù)結(jié)構(gòu)之插入排序
這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)之插入排序的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
Java并發(fā)編程之ConcurrentLinkedQueue解讀
這篇文章主要介紹了Java并發(fā)編程之ConcurrentLinkedQueue解讀,非阻塞的實(shí)現(xiàn)方式則可以使用循環(huán)CAS的方式來(lái)實(shí)現(xiàn),而ConcurrentLinkedQueue就是juc包中自帶的經(jīng)典非堵塞方式實(shí)現(xiàn)的工具類,需要的朋友可以參考下2023-12-12
Java責(zé)任鏈設(shè)計(jì)模式實(shí)例分析
這篇文章主要介紹了Java責(zé)任鏈設(shè)計(jì)模式,結(jié)合實(shí)例形式詳細(xì)分析了Java責(zé)任鏈設(shè)計(jì)模式的原理與相關(guān)操作技巧,需要的朋友可以參考下2019-07-07
SpringBoot結(jié)合Quartz實(shí)現(xiàn)數(shù)據(jù)庫(kù)存儲(chǔ)
本文主要介紹了SpringBoot+Quartz+數(shù)據(jù)庫(kù)存儲(chǔ),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
java?中如何實(shí)現(xiàn)?List?集合去重
這篇文章主要介紹了java?中如何實(shí)現(xiàn)?List?集合去重,List?去重指的是將?List?中的重復(fù)元素刪除掉的過(guò)程,下文操作操作過(guò)程介紹需要的小伙伴可以參考一下2022-05-05

