1、概览 {#1概览}
在这本教程中,我们将了解如何在 Spring 应用中获取当前的 ApplicationContext
。
2、ApplicationContext {#2applicationcontext}
ApplicationContext
代表 Spring IoC 容器,其中包含应用程序创建的所有 Bean。它负责实例化、配置和创建 Bean。此外,它还从 XML 或 Java 中提供的配置元数据中获取 Bean 的信息。
ApplicationContext
是 BeanFactory
的子接口。除了 BeanFactory
的功能外,它还包括消息解析和国际化、资源加载和事件发布等功能。此外,它还具有加载多个 context 的功能。
每个 Bean 都是在容器启动后实例化的。
我们可能希望使用此容器访问应用中的其他 Bean 和资源。我们将学习两种在 Spring 应用中获取当前 ApplicationContext
的方法。
3、ApplicationContext Bean {#3applicationcontext-bean}
获取当前 ApplicationContext
的最简单方法是使用 @Autowired
注解将其注入到我们的 Bean 中。
首先,声明实例变量,并使用 @Autowired
对其进行注解:
@Component
public class MyBean {
@Autowired
private ApplicationContext applicationContext;
public ApplicationContext getApplicationContext() {
return applicationContext;
}
}
也可以使用 @Inject
来代替 @Autowired
。
为了验证容器是否已正确注入,让我们创建一个测试:
@Test
void whenGetApplicationContext_thenReturnApplicationContext(){
assertNotNull(myBean);
ApplicationContext context = myBean.getApplicationContext();
assertNotNull(context);
}
4、ApplicationContextAware 接口 {#4applicationcontextaware-接口}
另一种获取当前 context 的方法是实现 ApplicationContextAware
接口。该接口定义了 setApplicationContext()
方法,Spring 在创建 ApplicationContext
后会调用该方法。
当应用程序启动时,Spring 会自动检测该接口并注入对 ApplicationContext
的引用。
现在,创建实现 ApplicationContextAware
接口的 ApplicationContextProvider
类:
@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
变量,这样就可以在任何类中访问它。此外,我们还创建了一个 static
方法,用于获取 ApplicationContext
的引用。
现在,我们可以通过调用静态 getApplicationContext()
方法来获取当前的 ApplicationContext
对象:
@Test
void whenGetApplicationContext_thenReturnApplicationContext() {
ApplicationContext context = ApplicationContextProvider.getApplicationContext();
assertNotNull(context);
}
通过实现该接口,Bean 可以获得 ApplicationContext
的引用,并访问其他 Bean 或资源。
首先创建 ItemService
类:
@Service
public class ItemService {
// ...
}
其次,调用 ApplicationContext
上的 getBean()
方法,从 context 中获取 ItemService
Bean:
@Test
void whenGetBean_thenReturnItemServiceReference() {
ApplicationContext context = ApplicationContextProvider.getApplicationContext();
assertNotNull(context);
ItemService itemService = context.getBean(ItemService.class);
assertNotNull(context);
}
5、总结 {#5总结}
在这篇教程中,我们学习了如何在 Spring Boot 应用中获取当前 ApplicationContext
。简而言之,我们可以直接注入 ApplicationContext
Bean 或实现 ApplicationContextAware
接口。
参考:https://www.baeldung.com/spring-get-current-applicationcontext