Spring 多个 @ConfigurationProperties 具有相同的类

Rag*_*eer 7 java spring properties spring-boot

我有一类这样的:

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

    private String hostname;
    private String port;
    private String baseUrl;
    private String endpoint;
}
Run Code Online (Sandbox Code Playgroud)

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

小智 6

我建议创建一个包含所有属性的抽象类,并为您拥有的尽可能多的属性变体扩展该抽象类。

@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{
}
Run Code Online (Sandbox Code Playgroud)

按如下方式使用它们:

@Service
public class SomeService {

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

    ... service logic
}
Run Code Online (Sandbox Code Playgroud)


bur*_*ete 5

你可以只用一个类来描述你的众多相同的属性块;

@Data
public class ClientProperties {
    private String hostname;
    private String port;
    private String baseUrl;
    private String endpoint;
}
Run Code Online (Sandbox Code Playgroud)

然后引用它以将单个类与不同的属性块链接起来;

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@Component
public class SomeService {

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

    ... some logic
}
Run Code Online (Sandbox Code Playgroud)