Заменить среду на @Value в Spring

#java #spring #spring-boot

#java #весна #весенняя загрузка

Вопрос:

Как я могу заменить Environment на @Value ?

У меня есть конфигурация, и я хочу заменить Environment и getProperty :

 @Configuration
public class RabbitConfig {

    @Autowired
    Environment environment;

    @Bean("googleRabbitService")
    public RabbitService getGoogleRabbitService(RabbitTemplate rabbitTemplate) {
        return new RabbitService(
                environment.getProperty("rabbit-service.google.request-exchange-name"),
                environment.getProperty("rabbit-service.google.request-queue-name"),
                environment.getProperty("rabbit-service.google.response-exchange-name"),
                environment.getProperty("rabbit-service.google.dead-exchange-name"),
                rabbitTemplate
        );
    }

    @Bean("amazonRabbitService")
    public RabbitService getAmazonRabbitService(RabbitTemplate rabbitTemplate) {
        return new RabbitService(
                environment.getProperty("rabbit-service.amazon.request-exchange-name"),
                environment.getProperty("rabbit-service.amazon.request-queue-name"),
                environment.getProperty("rabbit-service.amazon.response-exchange-name"),
                environment.getProperty("rabbit-service.amazon.dead-exchange-name"),
                rabbitTemplate
        );
    }
 

С @Value("${rabbit-service.google.request-exchange-name}") прямым в конструкторе я получаю ошибку: Annotations are not allowed here .

Я мог бы использовать поля:

 @Value("${rabbit-service.gogle.request-exchange-name}")
private String googleRequestExchange;
@Value("${rabbit-service.gogle.request-exchange-name}")
private String googleResponseExchange;
...
 

И затем:

 public RabbitService getGoogleRabbitService(RabbitTemplate rabbitTemplate) {
        return new RabbitService(
                googleRequestExchange,
                googleResponseExchange,
                ...
                rabbitTemplate
        );
 

Но мне придется создать кучу полей. Есть ли какой-нибудь способ использовать @Value ?

Комментарии:

1. попробуйте использовать @ConfigurationProperties

2. Затем вам также нужно определить поля, представляющие свойства, которые не понравились бы пользователю.

3. например public RabbitService getAmazonRabbitService(RabbitTemplate rabbitTemplate, @Value("${rabbit-service.gogle.request-exchange-name}") ) {//...} , не работает для вас? Просто попробовал что-то подобное локально без каких-либо проблем

4. Поскольку вы используете Spring Boot, продолжайте и используйте @ConfigurationProperties , как предложено. Вероятно, вы захотите определить POJO RabbitTemplateProperties и иметь a Map<String,RabbitTemplateProperties> в своем базовом классе для хранения нескольких параллельных конфигураций.

Ответ №1:

Вы можете сделать следующее:

 @Configuration
public class RabbitConfig {

    @Bean("googleRabbitService")
    public RabbitService getGoogleRabbitService(
                    @Value("rabbit-service.google.request-exchange-name") String requestExchangeName,
                    @Value("rabbit-service.google.request-queue-name") String requestQueueName,
                    @Value("rabbit-service.google.response-exchange-name") String responseExchangeName,
                    @Value("rabbit-service.google.dead-exchange-name") String deadExchangeName,
                    RabbitTemplate rabbitTemplate) {
        return new RabbitService(
                requestExchangeName,
                requestQueueName,
                responseExchangeName,
                deadExchangeName,
                rabbitTemplate
        );
    }