从Spring @Configuration类自动装入一个字符串?

时间:2014-08-20 17:37:04

标签: java spring

我希望集中访问我的所有属性值,这样我就可以做一些事情,比如确保所有内容都使用相同的属性名称,相同的默认值等。我已经创建了一个类集中所有这些,但我不确定需要访问这些值的类应该如何获取它们,因为你不能自动装配字符串。

我的班级是这样的:

@Configuration
public class SpringConfig {
    @Autowired
    @Value("${identifier:asdf1234}")
    public String identifier;
}

我可以在多个班级中使用它

public class Foo {
    @Autowired 
    private String theIdentifier;
}

public class Bar {
    @Autowired 
    private String anIdentifier;
}

3 个答案:

答案 0 :(得分:10)

基于属性初始化String bean:

@Configuration
public class SpringConfig {

    @Bean
    public String identifier(@Value("${identifier:asdf1234}") identifier) {
       return identifier;
    }
}

然后在"#{beanName}注释中使用Spring's SpEL beanName表达式@Value通过bean名称注入它

@Component
public class Foo {
    @Value("#{identifier}")
    private String oneIdentifier;
}

public class Bar {
   @Value("#{identifier}")
   private String sameIdentifier;
}

答案 1 :(得分:7)

另一个解决方案是创建一个包含所有配置的Spring bean并自动装配它:

@Component
public class MyConfig {
    @Value("${identifier:asdf1234}")
    public String identifier;

    public String getIdentifier() {
        return identifier;
    }
}

在你的其他课程中:

public class Foo {
    @Autowired
    private MyConfig myConfig;

    public void someMethod() {
        doSomething(myConfig.getIdentifier());
    }
}

答案 2 :(得分:1)

在我看来,对此没有干净的解决方案。我能想到的最简单的方法是使用一个static常量String字段来保存属性占位符。

public final class Constants {
    private Constants() {}
    public static final String PROPERTY_NAME= "${identifier.12345}";
}

并让所有@Value注释使用它

public class Foo {
    @Value(Constants.PROPERTY_NAME)
    private String theIdentifier;
}

public class Bar {
    @Value(Constants.PROPERTY_NAME)
    private String anIdentifier;
}

现在,如果您需要更改属性名称,则只需在Constants中更改它。 但请务必重新编译所有内容。