springboot java 解决构造方法在@Value赋值之前执行导致value值为null
原因: @Value("${属性名}") 注解是通过对象的set 方法赋值的,构造方法的执行在set方法之前,所以在构造方法中使用变量会发现变量为 null。方法1:将@Value("${spring.profiles.active}")放入构造方法的参数中,适用于单个@Value属性注入public K8sManager(@Value("${spring.profiles.active}")St
原因: @Value("${属性名}") 注解是通过对象的set 方法赋值的,构造方法的执行在set方法之前,所以在构造方法中使用变量会发现变量为 null。
方法1:
将@Value("${spring.profiles.active}")放入构造方法的参数中,适用于单个@Value属性注入
public K8sManager(@Value("${spring.profiles.active}")String profile) {
String kubeConfigPath = profile +"-"+"config";
File configFile = new File(kubeConfigPath);
...
}
若为多个@Value都需要注入到构造参数中,可参考方法2,3
方法2:这个方法应该是有点其他的问题
(1)将需要注入的参数放到对应环境的application.yml文件中,比如
application-test.yml
(可以在启动器中加入-Dspring.profiles.active=test指定使用某个环境的application-xxx.yml)
docker-properties:
docker-host: tcp://xxx.xx.xxx.xx:2375
registry-url: https://xxxxxx/
registry-username: xxxxx
registry-password: xxxxx
(2)创建config类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "docker-properties")
public class DockerProperties {
private String dockerhost;
private String registryurl;
private String registryUsername;
private String registrypassword;
}
(3)修改业务类
@EnableConfigurationProperties(DockerProperties.class) 声明要使用DockerProperties这个类的对象
@Bean方法的参数注入
@Service
@EnableConfigurationProperties(DockerProperties.class)
public class LocalDockerManager {
private static final Logger log = LoggerFactory.getLogger(DockerManager.class);
private DockerClient dockerClient;
DockerProperties dockerProperties;
public LocalDockerManager(DockerProperties dockerProperties) {
this.init(dockerProperties);
}
/**
* 初始化dockerClient
*/
@Bean
public DockerManager init(DockerProperties dockerProperties) {
DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost(dockerProperties.getDockerhost())
.withRegistryUrl(dockerProperties.getRegistryurl())
.withRegistryUsername(dockerProperties.getRegistryUsername())
.withRegistryPassword(dockerProperties.getRegistrypassword())
.build();
this.dockerClient = DockerClientBuilder.getInstance(config).build();
return this;
}
适用于有参构造需要传递配置中的参数到业务方法中赋值
方法3:
(1)(2)同法2
(3)修改业务类
@EnableConfigurationProperties(DockerProperties.class) 声明要使用DockerProperties这个类的对象
不需要@Bean参数注入
@Service
@EnableConfigurationProperties(DockerProperties.class)
public class LocalDockerManager implements DockerManager {
private static final Logger log = LoggerFactory.getLogger(DockerManager.class);
private DockerClient dockerClient;
public LocalDockerManager(DockerProperties dockerProperties) {
DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost(dockerProperties.getDockerhost())
.withRegistryUrl(dockerProperties.getRegistryurl())
.withRegistryUsername(dockerProperties.getRegistryUsername())
.withRegistryPassword(dockerProperties.getRegistrypassword())
.build();
this.dockerClient= DockerClientBuilder.getInstance(config).build();
}
参考链接:
SpringBoot-SpringBoot的属性注入
在构造函数里使用@Value注入的属性值获取不到
springboot的yml注入值的方式以及value等注解的使用
@Value("${属性名}")注解在对象的构造方法中的使用
更多推荐
所有评论(0)