Spring Boot集成Jasypt加载解密后密码出现null值问题咨询
问题原因
核心问题是Spring Bean的生命周期执行顺序导致的:
- Spring实例化Bean时,会先执行类的构造方法完成对象创建,之后才会对
@Value标注的属性执行注入赋值。你在构造方法中直接读取secret属性时,注入动作还未执行,因此拿到的是null。 - 至于替换为不存在的
abc.def会直接抛出异常,是因为Spring对占位符的解析校验早于Bean实例化阶段,只要占位符对应的配置不存在,会在校验阶段直接报错,不会走到Bean实例化的步骤,因此和你当前遇到的null值问题并不冲突。
解决方案
你可以任选以下任意一种方式修复:
- 使用构造方法注入
把@Value注解放到构造方法的参数上,Spring实例化Bean时就会将解析好的属性值传入构造方法:
@Component public class MyOtherClass { private static final Logger LOGGER = LoggerFactory.getLogger(MyOtherClass.class); String secret; public MyOtherClass(@Value("${secret.property}") String secret) { this.secret = secret; LOGGER.info("PW: " + secret); } }
- 使用@PostConstruct初始化方法
@PostConstruct标注的方法会在Bean所有属性注入完成后执行,此时读取属性就能拿到正确值:
@Component public class MyOtherClass { private static final Logger LOGGER = LoggerFactory.getLogger(MyOtherClass.class); @Value("${secret.property}") String secret; @PostConstruct public void init() { LOGGER.info("PW: " + secret); } }
内容的提问来源于stack exchange,提问作者gaout5
相关产品推荐
相关产品推荐

