在不使用 Singleton 的情况下从非 bean 对象获取 Spring Application 上下文,可以通过以下几种方法实现:
在 Spring 中,可以通过实现 ApplicationContextAware 接口来获取 ApplicationContext。首先,创建一个类并实现 ApplicationContextAware 接口,然后在 setApplicationContext 方法中保存 ApplicationContext 的引用。
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
context = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return context;
}
}
然后,在需要使用 ApplicationContext 的类中,可以通过调用 ApplicationContextProvider 的 getApplicationContext 方法来获取 ApplicationContext。
import org.springframework.context.ApplicationContext;
public class NonBeanClass {
public void someMethod() {
ApplicationContext context = ApplicationContextProvider.getApplicationContext();
// 使用 ApplicationContext 进行后续操作
}
}
在 Web 应用程序中,可以使用 WebApplicationContextUtils 类来获取 WebApplicationContext。该类提供了一个静态方法,可以根据 ServletContext 对象获取 WebApplicationContext。
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class NonBeanClass {
public void someMethod(ServletContext servletContext) {
WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
// 使用 WebApplicationContext 进行后续操作
}
}
在 Spring 中,可以通过实现 ApplicationListener 接口并监听 ContextRefreshedEvent 事件来获取 ApplicationContext。首先,创建一个类并实现 ApplicationListener 接口,然后在 onApplicationEvent 方法中保存 ApplicationContext 的引用。
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
public class ApplicationContextListener implements ApplicationListener<ContextRefreshedEvent> {
private static ApplicationContext context;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
context = event.getApplicationContext();
}
public static ApplicationContext getApplicationContext() {
return context;
}
}
然后,在需要使用 ApplicationContext 的类中,可以通过调用 ApplicationContextListener 的 getApplicationContext 方法来获取 ApplicationContext。
import org.springframework.context.ApplicationContext;
public class NonBeanClass {
public void someMethod() {
ApplicationContext context = ApplicationContextListener.getApplicationContext();
// 使用 ApplicationContext 进行后续操作
}
}
总之,在不使用 Singleton 的情况下从非 bean 对象获取 Spring Application 上下文,可以通过以上几种方法实现。
领取专属 10元无门槛券
手把手带您无忧上云