在@Configuration类

时间:2018-05-29 22:07:33

标签: spring-boot spring-boot-configuration

是否应该在@Configuration类中使用配置属性类。

环境

  • Spring Boot 2.0.2
  • java版" 10.0.1" 2018年4月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

我的代码

application-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;
    }
}

配置类

@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作为字段注入配置类或amazonS3方法的参数,则实例为non-null,但其中的bucketName属性为null

通过@Value将字符串注入课程也是null

我能让它工作的唯一方法是使用带有字符串的注释为@Value的方法参数。

这是预期的行为还是可能是错误?

1 个答案:

答案 0 :(得分:2)

在您的情况下,没有必要使用Topic。您可以将@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(); ... } } 将类注册为bean,并允许您将其注入另一个bean。