项目场景:
springboot项目中通过@Value给属性附值失败
问题描述
给参数赋值失败,打印为空值
@Value("${python.server.port}")
private int port;
@Value("${python.server.host}")
private String host;
public PythonSocketClient(){
System.out.println("Host: " + host);
System.out.println("Port: " + port);
connect();
}
测试发现是成功注入的
@SpringBootTest
public class ValueTest {
@Value("${python.server.host}")
private String host;
@Test
public void testConfiguration() {
System.out.println("Host configured as: " + host);
}
}
可以看到是正确赋值了
原因分析:
这是因为在 Spring Bean 的生命周期中,构造函数是最先被调用的,此时依赖注入还没有完成,因此
@Value
注入的字段尚未被初始化。
也就是说还没附上值就运行了构造器
解决方案:
使用
@PostConstruct
注解的方法来确保在所有字段注入完成之后再执行初始化逻辑。
@Value("${python.server.port}")
private int port;
@Value("${python.server.host}")
private String host;
@PostConstruct
public void init() {
System.out.println("Host: " + host);
System.out.println("Port: " + port);
connect();
}
再次运行
发现已经可以正常获取值了。