Spring获取上下文的四种方式方式
1.创建一个SpringContextHolder对象用来保存ApplicationContext对象。2.在启动类中注册ApplicationContextInitializer接口的匿名对象。
·
一、使用ApplicationContextInitializer,让SpringApplication启动时进行回调,然后获取ApplicationContext
1.创建一个SpringContextHolder对象用来保存ApplicationContext对象
import org.springframework.context.ApplicationContext;
public class SpringContextHolder {
/**
* 保存ApplicationContext,可在项目中任意位置中取出ApplicationContext
*/
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static void setApplicationContext(ApplicationContext applicationContext) {
SpringContextHolder.applicationContext = applicationContext;
}
/**
* 通过name获取 Bean.
* @param name
* @return
*/
public static Object getBean(String name){
return applicationContext.getBean(name);
}
/**
* 通过class获取class下的全部Bean.
* @param clazz
* @param <T>
* @return
*/
public static <T> Map<String, T> getBeans(Class<T> clazz){
return applicationContext.getBeansOfType(clazz);
}
/**
* 通过class获取Bean.
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz){
return applicationContext.getBean(clazz);
}
}
2.在启动类中注册ApplicationContextInitializer接口的匿名对象
import com.yxs.demo.utils.SpringContextHolder;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(DemoApplication.class);
//注册ApplicationContextInitializer接口
//让SpringApplication启动时进行回调
//调用SpringContextHolder静态方法设置上下文对象
//org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
springApplication.addInitializers(SpringContextHolder::setApplicationContext);
springApplication.run(args);
}
}
二、SpringApplication的run方法的返回值就是ApplicationContext实例对象
import com.yxs.demo.utils.SpringContextHolder;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);
SpringContextHolder.setApplicationContext(applicationContext);
}
}
三、实现ApplicationContextAware接口,利用Spring Bean的生命周期,在Bean初始化时获取ApplicationContext
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class SpringContextHolder implements ApplicationContextAware {
/**
* 保存ApplicationContext,可在项目中任意位置取出ApplicationContext
*/
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
//org.springframework.web.context.support.GenericWebApplicationContext
this.applicationContext = applicationContext;
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
* @param name
* @return
*/
public Object getBean(String name){
return applicationContext.getBean(name);
}
/**
* 通过class获取class下的全部Bean.
* @param clazz
* @param <T>
* @return
*/
public <T> Map<String, T> getBeans(Class<T> clazz){
return applicationContext.getBeansOfType(clazz);
}
/**
* 通过class获取Bean.
* @param clazz
* @param <T>
* @return
*/
public <T> T getBean(Class<T> clazz){
return applicationContext.getBean(clazz);
}
}
四、实现ApplicationListener接口,在SpringApplication启动时,监听ApplicationContextEvent事件触发回调,获取ApplicationContext
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ApplicationContextEvent;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class SpringContextHolder implements ApplicationListener<ApplicationContextEvent> {
/**
* 保存ApplicationContext,可在项目中任意位置取出ApplicationContext
*/
private ApplicationContext applicationContext;
@Override
public void onApplicationEvent(ApplicationContextEvent applicationContextEvent) {
//org.springframework.web.context.support.GenericWebApplicationContext
this.applicationContext = applicationContextEvent.getApplicationContext();
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
* @param name
* @return
*/
public Object getBean(String name){
return applicationContext.getBean(name);
}
/**
* 通过class获取class下的全部Bean.
* @param clazz
* @param <T>
* @return
*/
public <T> Map<String, T> getBeans(Class<T> clazz){
return applicationContext.getBeansOfType(clazz);
}
/**
* 通过class获取Bean.
* @param clazz
* @param <T>
* @return
*/
public <T> T getBean(Class<T> clazz){
return applicationContext.getBean(clazz);
}
}
更多推荐
已为社区贡献6条内容
所有评论(0)