1. 概述
在本簡短教程中,我們將學習如何在 Spring 應用中獲取當前的 ApplicationContext。
2. ApplicationContext
ApplicationContext 代表 Spring IoC 容器,它包含了應用程序創建的所有 Bean。它負責實例化、配置和創建這些 Bean。此外,它還會從 XML 或 Java 中提供的配置元數據中獲取 Bean 的信息。
ApplicationContext 是 BeanFactory 的子接口。除了 BeanFactory 的功能之外,它還包括消息解析、國際化、資源加載和事件發佈等特性。此外,它還具有加載多個上下文的功能。
每個 Bean 在容器啓動後才會被實例化,因為它使用了急加載。
我們可能需要使用這個容器來訪問應用程序中的其他 Bean 和資源。 我們將學習兩種獲取當前 ApplicationContext 引用的方法。
3. 應用上下文 Bean
獲取當前 應用上下文 的最簡單方法是使用 @Autowired 註解將它注入到我們的 Bean 中。
首先,聲明實例變量並使用 @Autowired 註解進行標註:
@Component
public class MyBean {
@Autowired
private ApplicationContext applicationContext;
public ApplicationContext getApplicationContext() {
return applicationContext;
}
}與其使用 @Autowired,我們可以使用 @Inject 註解。
為了驗證容器是否正確注入,我們創建一個測試:
@Test
void whenGetApplicationContext_thenReturnApplicationContext(){
assertNotNull(myBean);
ApplicationContext context = myBean.getApplicationContext();
assertNotNull(context);
}4. <em ApplicationContextAware</em>> 接口
通過實現 <em ApplicationContextAware</em>> 接口,可以獲取當前上下文的另一種方式。該接口包含 <em setApplicationContext()</em>> 方法,Spring 在創建 <em ApplicationContext</em>> 後會調用該方法。
此外,當應用程序啓動時,Spring 會自動檢測該接口並注入對 <em ApplicationContext</em>> 的引用。
現在,讓我們創建一個名為 <em ApplicationContextProvider</em>> 的類,該類實現了 <em ApplicationContextAware</em>> 接口:
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextProvider.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}我們聲明瞭 applicationContext 實例變量為 static,以便在任何類中訪問它。 此外,我們還創建了一個靜態方法來獲取 ApplicationContext 引用。
現在,我們可以通過調用靜態方法 getApplicationContext() 來獲取當前的 ApplicationContext 對象。
@Test
void whenGetApplicationContext_thenReturnApplicationContext() {
ApplicationContext context = ApplicationContextProvider.getApplicationContext();
assertNotNull(context);
}此外,通過實現接口,一個 Bean 可以獲取到 ApplicationContext 的引用,並訪問其他 Bean 或資源。
為了實現這一點,首先,讓我們創建一個 ItemService 類:
@Service
public class ItemService {
// ...
}其次,要從上下文中獲取 ItemService 組件,請調用 ApplicationContext 上的 getBean() 方法:
@Test
void whenGetBean_thenReturnItemServiceReference() {
ApplicationContext context = ApplicationContextProvider.getApplicationContext();
assertNotNull(context);
ItemService itemService = context.getBean(ItemService.class);
assertNotNull(context);
}5. 結論
在本文中,我們學習瞭如何在 Spring Boot 應用程序中獲取當前的 ApplicationContext。 總結一下,我們可以直接注入 ApplicationContext Bean,或者實現 ApplicationContextAware 接口。