代码之家  ›  专栏  ›  技术社区  ›  David

在@configuration classes中使用配置属性

  •  0
  • David  · 技术社区  · 6 年前

    是否期望配置属性类在 @Configuration 课程。

    环境

    • 弹簧套2.0.2
    • Java版本“100.1”2018—04-17 Java(TM)SE运行时环境18.3(构建100.1+ 10), Java热点(TM)64位服务器VM 18.3(构建100.1+10,混合模式)
    • OSX 10.13.4版

    我的代码

    应用程序本地属性:

    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 也是 无效的

    我能让它工作的唯一方法是使用注释为 @值 用一根绳子。

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   vallim    6 年前

    在您的情况下,不需要使用 @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。