@PostConstruct 与 ApplicationContextAware实现类冲突问题解决

一般@PostConstruct 是可以在bean注册时执行的方法.

而我们经常会需要用到spring上下文的一些参数,就可以用一个工具类如SpringContextUtil

public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }
 }

比较常用的就是getBean(), getProperty()等等.

今天就碰到一个问题,一个配置类中使用了@PostConstruct ,里面需要去读yml的配置,而我使用的就是这个工具类去获取属性.

但是因为ApplicationContextAware接口还没实例化完成,导致空指针异常.

有两个比较简单易懂的实现方法

1. @ConditionalOnProperty

使用这个注解明确指出需要哪个属性才会注册该类,这样这个配置类就会等到ApplicationContextAware实例完成,去读属性后判断成功才会来注册这个类,如:

@ConditionalOnProperty(name = "req-log.file")

2.@DependsOn(“SpringContextUtil”)

同样也是加在这个配置类上, 让他依赖于SpringContextUtil工具类, 这样就必须先去找到这个Bean才会注册配置类,再执行自然就没有问题了.

不过比较麻烦的是需要在SpringContextUtil头上加个注解

@Component("SpringContextUtil")

版权声明:本文为weixin_45369440原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。