在 @Configuration 类 中使用配置属性
Use of configuration properties in @Configuration classes
是否期望配置属性 classes 应该在 @Configuration
classes 中可用。
环境
- Spring 启动 2.0.2
- java 版本 "10.0.1" 2018-04-17
Java(TM) SE 运行时环境 18.3(内部版本 10.0.1+10),
Java HotSpot(TM) 64 位服务器 VM 18.3(内部版本 10.0.1+10,混合模式)
- OSX 10.13.4
我的代码
申请-local.properties:
s3.bucketName=test-bucket
配置属性
@Validated
@ConfigurationProperties(prefix = "s3")
public class S3ConfigurationProperties {
@NotBlank
private String bucketName;
public String getBucketName() {
return bucketName;
}
public void setBucketName(final String bucketName) {
this.bucketName = bucketName;
}
}
配置Class
@Configuration
@Profile("local")
@EnableConfigurationProperties(S3ConfigurationProperties.class)
public class LocalS3Configuration {
@Autowired
private S3ConfigurationProperties properties;
@Value("${s3.bucketName}")
private String bucket;
@Bean(destroyMethod = "shutdown")
public AmazonS3 amazonS3(@Value("${local.s3.endpoint}") final String s3Endpoint, @Value("${s3.bucketName}") final String bucketName) {
// use properties...
final String bucketInjectedToMethod = bucketName; // works
final String bucketInjectedViaProperties = properties.getBucketName(); // null
final String bucketInjectedInClass = bucket; // null
}
}
观察到的行为
如果我将 S3ConfigurationProperties
作为字段注入配置 class 或 amazonS3
方法的参数,则实例为 non-null
,但 bucketName
属性里面是null
。
通过@Value
将字符串注入class也是null
。
我能让它工作的唯一方法是使用带有字符串的注释为 @Value
的方法参数。
这是预期的行为还是可能是错误?
在您的情况下,没有必要使用 @EnableConfigurationProperties
。你可以把 @Configuration
放在 S3ConfigurationProperties
:
@Configuration
@ConfigurationProperties(prefix = "s3")
public class S3ConfigurationProperties {
private String bucketName;
//getter and setter
}
因此,现在您可以将其注入 LocalS3Configuration
:
@Profile("local")
@Configuration
public class LocalS3Configuration {
@Autowired
private S3ConfigurationProperties properties;
@Value(("${s3.bucketName}"))
private String bucketName;
@Bean(destroyMethod = "shutdown")
public AmazonS3 amazonS3() {
final String bucketInjectedToMethod = bucketName;
final String bucketInjectedViaProperties = properties.getBucketName();
...
}
}
注释 @Configuration
将 class 注册为一个 bean,并允许您将其注入另一个 bean。
是否期望配置属性 classes 应该在 @Configuration
classes 中可用。
环境
- Spring 启动 2.0.2
- java 版本 "10.0.1" 2018-04-17 Java(TM) SE 运行时环境 18.3(内部版本 10.0.1+10), Java HotSpot(TM) 64 位服务器 VM 18.3(内部版本 10.0.1+10,混合模式)
- OSX 10.13.4
我的代码
申请-local.properties:
s3.bucketName=test-bucket
配置属性
@Validated
@ConfigurationProperties(prefix = "s3")
public class S3ConfigurationProperties {
@NotBlank
private String bucketName;
public String getBucketName() {
return bucketName;
}
public void setBucketName(final String bucketName) {
this.bucketName = bucketName;
}
}
配置Class
@Configuration
@Profile("local")
@EnableConfigurationProperties(S3ConfigurationProperties.class)
public class LocalS3Configuration {
@Autowired
private S3ConfigurationProperties properties;
@Value("${s3.bucketName}")
private String bucket;
@Bean(destroyMethod = "shutdown")
public AmazonS3 amazonS3(@Value("${local.s3.endpoint}") final String s3Endpoint, @Value("${s3.bucketName}") final String bucketName) {
// use properties...
final String bucketInjectedToMethod = bucketName; // works
final String bucketInjectedViaProperties = properties.getBucketName(); // null
final String bucketInjectedInClass = bucket; // null
}
}
观察到的行为
如果我将 S3ConfigurationProperties
作为字段注入配置 class 或 amazonS3
方法的参数,则实例为 non-null
,但 bucketName
属性里面是null
。
通过@Value
将字符串注入class也是null
。
我能让它工作的唯一方法是使用带有字符串的注释为 @Value
的方法参数。
这是预期的行为还是可能是错误?
在您的情况下,没有必要使用 @EnableConfigurationProperties
。你可以把 @Configuration
放在 S3ConfigurationProperties
:
@Configuration
@ConfigurationProperties(prefix = "s3")
public class S3ConfigurationProperties {
private String bucketName;
//getter and setter
}
因此,现在您可以将其注入 LocalS3Configuration
:
@Profile("local")
@Configuration
public class LocalS3Configuration {
@Autowired
private S3ConfigurationProperties properties;
@Value(("${s3.bucketName}"))
private String bucketName;
@Bean(destroyMethod = "shutdown")
public AmazonS3 amazonS3() {
final String bucketInjectedToMethod = bucketName;
final String bucketInjectedViaProperties = properties.getBucketName();
...
}
}
注释 @Configuration
将 class 注册为一个 bean,并允许您将其注入另一个 bean。