春季多个@ConfigurationProperties具有相同的类

时间:2019-08-22 18:18:57

标签: java spring spring-boot properties

我有一个此类的课程:

@Data
@Component
@ConfigurationProperties("a.config.props")
public class ClientProperties {

    private String hostname;
    private String port;
    private String baseUrl;
    private String endpoint;
}

我有数十个属性上下文,但是对于1行,我必须重复整个类。是否有一种简单而优雅的方法来拥有一个类,并以某种方式动态地传递属性上下文(可能是数组或类似的东西),以便我使用同一类。

3 个答案:

答案 0 :(得分:0)

假设您希望将主机名作为属性文件的列表,则可以像这样重新排列代码:

@Component
@ConfigurationProperties("a.config.props")
@Data
public class ClientProperties {
    private List<String>  hostname;
    private String port;
    private String baseUrl;
    private String endpoint;
}

然后可以将配置属性放置在application.properties文件中,如下所示:

a.config.props.hostname[0]=host1.com
a.config.props.hostname[1]=host2.com
a.config.props.hostname[2]=host3.com
a.config.props.port=8080
a.config.props.baseUrl=baseurl
a.config.props.endpoint=/thisendpoint

然后只需@将您的ClientProperties自动连接到您想要的类并调用

List<String> hostnames = clientProperties.getHostname();

然后可以根据需要使用它们的值。如果我正确理解了您的问题,我认为它将回答您。让我知道您是否需要更多信息。

答案 1 :(得分:0)

您只有一个类来描述您的多个相同属性块;

@Data
public class ClientProperties {
    private String hostname;
    private String port;
    private String baseUrl;
    private String endpoint;
}

然后将其称为将单个类与不同的属性块链接在一起;

@Configuration
public class PropertyConfigurer {

    @Bean
    @ConfigurationProperties("props.one")
    private ClientProperties propsOne() {
        return new ClientProperties();
    }

    @Bean
    @ConfigurationProperties("props.two")
    private ClientProperties propsTwo() {
        return new ClientProperties();
    }

    @Bean
    @ConfigurationProperties("props.three")
    private ClientProperties propsThree() {
        return new ClientProperties();
    }
}

然后,您可以通过其方法名称作为限定符来访问它们;

@Component
public class SomeService {

    @Autowired
    private propsOne;
    @Autowired
    private propsTwo;
    @Autowired
    private propsThree;

    ... some logic
}

答案 2 :(得分:0)

我建议创建一个具有所有属性的抽象类,并为您拥有的所有属性变体扩展该抽象类。

@Data
public abstract class BaseClientProperties {
    private String hostname;
    private String port;
    private String baseUrl;
    private String endpoint;
}

@Configuration
@ConfigurationProperties("a.config.props1")
public class Client1Properties extends BaseClientProperties{

}

@Configuration
@ConfigurationProperties("a.config.props2")
public class Client2Properties extends BaseClientProperties{
}

按如下所示使用它们:

@Service
public class SomeService {

    @Autowired
    private Client1Properties client1Properties;
    @Autowired
    private Client2Properties client2Properties;

    ... service logic
}