SpringBoot五種獲取ApplicationContext的實(shí)現(xiàn)方式
之前每次想要獲取Spring上下文【ApplicationContext】的時(shí)候,都去現(xiàn)查方案。
本文針對(duì)獲取Spring ApplicationContext的方式做了梳理,總結(jié)。
1. 概念
ApplicationContext是什么?
簡單來說就是Spring中的容器,可以用來獲取容器中的各種bean組件,注冊監(jiān)聽事件,加載資源文件等功能
2. 獲取ApplicationContext的方式
2.1 創(chuàng)建工具類
通過此工具類,可以方便的獲取bean組件, 獲取配置信息等
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
public class SpringUtil {
private static ApplicationContext applicationContext = null;
private static Environment environment = null;
public static void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
environment = applicationContext.getEnvironment();
//TODO 設(shè)置后,可以做一些操作
}
}
//獲取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Environment getEnvironment() {
return environment;
}
//通過name獲取 Bean.
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
//通過class獲取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
//通過name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
public static String getString(String key) {
return environment.getProperty(key);
}
public static int getInt(String key) {
return NumberUtils.toInt(environment.getProperty(key));
}
public static long getLong(String key) {
return NumberUtils.toLong(environment.getProperty(key));
}
public static boolean getBoolean(String key) {
return BooleanUtils.toBoolean(environment.getProperty(key));
}
}方式1. 實(shí)現(xiàn)ApplicationContextInitializer接口
實(shí)現(xiàn)接口后,將此類注入到Spring容器中,有兩種方式。當(dāng)然也可以直接調(diào)用靜態(tài)方法
- 第一種: 在此類上加`@Component`注解
- 第二種:在 `resources/META-INF/spring.factories`文件中添加以下配置: org.springframework.context.ApplicationContextInitializer=CustomerApplicationContextInitializer的路徑
實(shí)現(xiàn)ApplicationContextInitializer的源碼示例:
public class CustomApplicationContextInitializer implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
SpringBeanUtils.setApplicationContext(applicationContext);
}
}
方式2. 實(shí)現(xiàn)ApplicationListener接口
實(shí)現(xiàn)接口后,將此類注入到Spring容器中,有兩種方式。當(dāng)然也可以直接調(diào)用靜態(tài)方法
- 第一種: 在此類上加`@Component`注解
- 第二種:在 `resources/META-INF/spring.factories`文件中添加以下配置: org.springframework.context.ApplicationContextInitializer=CustomerApplicationListener的路徑
實(shí)現(xiàn)ApplicationListener的源碼示例:
public class CustomApplicationListener implements ApplicationListener<ApplicationContextEvent> {
@Override
public void onApplicationEvent(ApplicationContextEvent event) {
SpringBeanUtils.setApplicationContext(event.getApplicationContext());
}
}
方式3. 在啟動(dòng)類main方法中設(shè)置
@SpringBootApplication
@EnableSwagger2
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(WangMikeSpringApplication.class, args);
SpringBeanUtils.setApplicationContext(applicationContext);
}
}方式4. 實(shí)現(xiàn)ApplicationContextAware接口
@Component
public class SpringBeanUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext){
SpringBeanUtils.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext(
return applicationContext;
}
}方式5. 直接通過@Resource注解注入
@Component
@Order(value = 1)
@Slf4j
public class AppStartRunner implements org.springframework.boot.ApplicationRunner {
protected static Logger logger = LoggerFactory.getLogger(AppStartRunner.class);
@Resource
ApplicationContext applicationContext;總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決mybatis使用char類型字段查詢oracle數(shù)據(jù)庫時(shí)結(jié)果返回null問題
這篇文章主要介紹了mybatis使用char類型字段查詢oracle數(shù)據(jù)庫時(shí)結(jié)果返回null問題的解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
java實(shí)現(xiàn)投票程序設(shè)計(jì)
這篇文章主要介紹了java實(shí)現(xiàn)投票程序設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-12-12
關(guān)于HashMap的put方法執(zhí)行全過程
這篇文章主要介紹了關(guān)于HashMap的put方法執(zhí)行全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
JAVA基礎(chǔ)之控制臺(tái)輸入輸出的實(shí)例代碼
下面小編就為大家?guī)硪黄狫AVA基礎(chǔ)之控制臺(tái)輸入輸出的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07
詳解Java枚舉類在生產(chǎn)環(huán)境中的使用方式
本文主要介紹了Java枚舉類在生產(chǎn)環(huán)境中的使用方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
Java同時(shí)處理多個(gè)數(shù)據(jù)的常見方法
在Java中,同時(shí)處理多個(gè)數(shù)據(jù)通常涉及多線程、并發(fā)編程或異步編程,這里我將提供一個(gè)使用多線程的示例,因?yàn)槎嗑€程是處理多個(gè)數(shù)據(jù)并行的常見方式,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-11-11
Java的Spring框架中AOP項(xiàng)目的一般配置和部署教程
這篇文章主要介紹了Java的Spring框架中AOP項(xiàng)目的一般配置和部署教程,AOP面向方面編程的項(xiàng)目部署結(jié)構(gòu)都比較類似,因而也被看作是Spring的一種設(shè)計(jì)模式使用,需要的朋友可以參考下2016-04-04
java 基礎(chǔ)之JavaBean屬性命名規(guī)范問題
這篇文章主要介紹了java 基礎(chǔ)之JavaBean屬性命名規(guī)范問題的相關(guān)資料,需要的朋友可以參考下2017-05-05
關(guān)于LinkedList集合對(duì)元素進(jìn)行增查刪操作
LinkedList集合內(nèi)部包含有兩個(gè)Node類型的first和last屬性維護(hù)一個(gè)雙向循環(huán)鏈表,在鏈表中的每一個(gè)元素都使用引用的方式來記住它的前一個(gè)元素和后一個(gè)元素,從而可以將所有的元素彼此連接起來,需要的朋友可以參考下2023-04-04

