一般@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版权协议,转载请附上原文出处链接和本声明。