在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;
    }
}

其中代码已经贴出