在SpringBoot项目中,经常会在static 方法 或一些非spring管理的类中,获取一个被spring所管理的对象.
这个时候,我们就需要先获取spring的上下文信息.
我见过最糟心的在SpringBoot项目中获取上下文的办法是:
直接在启动类的main 方法中获取,如下:
@SpringBootApplication
public class AuthCommApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(AuthCommApplication.class, args);
}
}
然后将context赋值到一个工具类中,通过这种方法获取spring的上下文,存在一定的弊端.
- 无法确保获取到的context是完整初始化的
- 无法使用SpringBoot的测试模块....
正确的使用方式应该是:
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* 功能:获取spring的上下文,并编写其获取对象实例所对应的方法
*
* @Author:JIUNLIU
* @data : 2020/3/16 18:49
*/
public class ContextUtil implements ApplicationContextAware {
//spring 上下文实例对象
private static ApplicationContext context;
// 根据class获取对象实例
public static <T> T getObj(Class<T> tClass) {
return context.getBean(tClass);
}
// 根据配置的 bean name 获取对象实例
public static Object getObj(String beanName) {
return context.getBean(beanName);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
}
其中代码已经贴出