springboot能在@Configuration配置类中获取到applicationContext吗?

我有一个需求需要在配置类调用中获取到applicationContext上下文以获取到其它bean
于是使用SpringUtils.getApplicationContext()去调用,但获取到的是null

其中SpringUtils已经实现了ApplicationContextAware接口
  • 在配置类中获取上下文
@Configuration
public class DataSourceConfig {
    @Bean
    public Object beanObj() {
        ApplicationContext applicationContext = SpringUtils.getApplicationContext();
        // 打印null
        System.out.println(applicationContext);
        return new beanObj();
    }
}
结果为null
  • 在其它bean中获取上下文
@Component
public class SomeComponent{

@PostConstruct
    public void init() {
        ApplicationContext applicationContext = SpringUtils.getApplicationContext();
        // 打印null
        System.out.println(applicationContext);
    }

}
结果也为null

但是在其它地方,比如控制器,使用SpringUtils.getApplicationContext()可以获取到applicationContext上下文。

我该如何在其它Bean或者配置类中获取到上下文?

阅读 2.8k
2 个回答

SpringUtil 调用静态方法的时候,未必 ApplicationContext 被注入了吧,除非你使用@Autowire的方式注入SpringUtil 且放弃静态方法。即使没有被spirng初始化,这个方法依然不会受到任何影响,调用情况就有可能出现预期之外的结果。如果你想确定的调用,就得保证在这个创建bean的时候,SpringUtil已经被确定的初始化过了。还是用ApplicationContextAwar吧,层次结构也清晰些。

不知道你的 SpringUtils 是哪来的,应该不是官方提供的。

如果获取不到,用注入的方式肯定是可以获取的。

@Configuration
public class DataSourceConfig {
    @Autowired
    private ApplicationContext applicationContext;

    @Bean
    public Object beanObj() {
        System.out.println(SpringUtils.getApplicationContext());
        System.out.println(applicationContext);
        return new beanObj();
    }
}
推荐问题