#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
, как предложено. Вероятно, вы захотите определить POJORabbitTemplateProperties
и иметь aMap<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
);
}