Skip to content

Commit 9c73312

Browse files
committed
Use ConditionalOnSingleCandidate when appropriate
This commit updates various auto-configuration to use `@ConditionalOnSingleCandidate` rather than assuming that at most one bean of a given type will be available. Closes gh-2784
1 parent 4ebba98 commit 9c73312

File tree

2 files changed

+85
-66
lines changed

2 files changed

+85
-66
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/amqp/RabbitAutoConfiguration.java

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3535
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3636
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
37+
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
3738
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3839
import org.springframework.context.annotation.Bean;
3940
import org.springframework.context.annotation.Configuration;
@@ -84,50 +85,6 @@
8485
@Import(RabbitAnnotationDrivenConfiguration.class)
8586
public class RabbitAutoConfiguration {
8687

87-
@Bean
88-
@ConditionalOnProperty(prefix = "spring.rabbitmq", name = "dynamic", matchIfMissing = true)
89-
@ConditionalOnMissingBean(AmqpAdmin.class)
90-
public AmqpAdmin amqpAdmin(ConnectionFactory connectionFactory) {
91-
return new RabbitAdmin(connectionFactory);
92-
}
93-
94-
@Autowired
95-
private ConnectionFactory connectionFactory;
96-
97-
@Autowired
98-
private ObjectProvider<MessageConverter> messageConverter;
99-
100-
@Bean
101-
@ConditionalOnMissingBean(RabbitTemplate.class)
102-
public RabbitTemplate rabbitTemplate(RabbitProperties config) {
103-
RabbitTemplate rabbitTemplate = new RabbitTemplate(this.connectionFactory);
104-
MessageConverter messageConverter = this.messageConverter.getIfUnique();
105-
if (messageConverter != null) {
106-
rabbitTemplate.setMessageConverter(messageConverter);
107-
}
108-
Template template = config.getTemplate();
109-
Retry retry = template.getRetry();
110-
if (retry.isEnabled()) {
111-
RetryTemplate retryTemplate = new RetryTemplate();
112-
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
113-
retryPolicy.setMaxAttempts(retry.getMaxAttempts());
114-
retryTemplate.setRetryPolicy(retryPolicy);
115-
ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
116-
backOffPolicy.setInitialInterval(retry.getInitialInterval());
117-
backOffPolicy.setMultiplier(retry.getMultiplier());
118-
backOffPolicy.setMaxInterval(retry.getMaxInterval());
119-
retryTemplate.setBackOffPolicy(backOffPolicy);
120-
rabbitTemplate.setRetryTemplate(retryTemplate);
121-
}
122-
if (template.getReceiveTimeout() != null) {
123-
rabbitTemplate.setReceiveTimeout(template.getReceiveTimeout());
124-
}
125-
if (template.getReplyTimeout() != null) {
126-
rabbitTemplate.setReplyTimeout(template.getReplyTimeout());
127-
}
128-
return rabbitTemplate;
129-
}
130-
13188
@Configuration
13289
@ConditionalOnMissingBean(ConnectionFactory.class)
13390
protected static class RabbitConnectionFactoryCreator {
@@ -185,11 +142,67 @@ public CachingConnectionFactory rabbitConnectionFactory(RabbitProperties config)
185142

186143
}
187144

145+
@Configuration
146+
@Import(RabbitConnectionFactoryCreator.class)
147+
protected static class RabbitTemplateConfiguration {
148+
149+
@Autowired
150+
private ObjectProvider<MessageConverter> messageConverter;
151+
152+
@Autowired
153+
private RabbitProperties properties;
154+
155+
@Bean
156+
@ConditionalOnSingleCandidate(ConnectionFactory.class)
157+
@ConditionalOnMissingBean(RabbitTemplate.class)
158+
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
159+
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
160+
MessageConverter messageConverter = this.messageConverter.getIfUnique();
161+
if (messageConverter != null) {
162+
rabbitTemplate.setMessageConverter(messageConverter);
163+
}
164+
Template template = this.properties.getTemplate();
165+
Retry retry = template.getRetry();
166+
if (retry.isEnabled()) {
167+
RetryTemplate retryTemplate = new RetryTemplate();
168+
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
169+
retryPolicy.setMaxAttempts(retry.getMaxAttempts());
170+
retryTemplate.setRetryPolicy(retryPolicy);
171+
ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
172+
backOffPolicy.setInitialInterval(retry.getInitialInterval());
173+
backOffPolicy.setMultiplier(retry.getMultiplier());
174+
backOffPolicy.setMaxInterval(retry.getMaxInterval());
175+
retryTemplate.setBackOffPolicy(backOffPolicy);
176+
rabbitTemplate.setRetryTemplate(retryTemplate);
177+
}
178+
if (template.getReceiveTimeout() != null) {
179+
rabbitTemplate.setReceiveTimeout(template.getReceiveTimeout());
180+
}
181+
if (template.getReplyTimeout() != null) {
182+
rabbitTemplate.setReplyTimeout(template.getReplyTimeout());
183+
}
184+
return rabbitTemplate;
185+
}
186+
187+
@Bean
188+
@ConditionalOnSingleCandidate(ConnectionFactory.class)
189+
@ConditionalOnProperty(prefix = "spring.rabbitmq", name = "dynamic", matchIfMissing = true)
190+
@ConditionalOnMissingBean(AmqpAdmin.class)
191+
public AmqpAdmin amqpAdmin(ConnectionFactory connectionFactory) {
192+
return new RabbitAdmin(connectionFactory);
193+
}
194+
195+
196+
}
197+
198+
@Configuration
188199
@ConditionalOnClass(RabbitMessagingTemplate.class)
189200
@ConditionalOnMissingBean(RabbitMessagingTemplate.class)
201+
@Import(RabbitTemplateConfiguration.class)
190202
protected static class MessagingTemplateConfiguration {
191203

192204
@Bean
205+
@ConditionalOnSingleCandidate(RabbitTemplate.class)
193206
public RabbitMessagingTemplate rabbitMessagingTemplate(
194207
RabbitTemplate rabbitTemplate) {
195208
return new RabbitMessagingTemplate(rabbitTemplate);

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2525
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2626
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
27+
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
2728
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2829
import org.springframework.context.annotation.Bean;
2930
import org.springframework.context.annotation.Configuration;
@@ -46,39 +47,44 @@
4647
@Import(JmsAnnotationDrivenConfiguration.class)
4748
public class JmsAutoConfiguration {
4849

49-
@Autowired
50-
private JmsProperties properties;
50+
@Configuration
51+
protected static class JmsTemplateConfiguration {
5152

52-
@Autowired
53-
private ConnectionFactory connectionFactory;
53+
@Autowired
54+
private JmsProperties properties;
5455

55-
@Autowired
56-
private ObjectProvider<DestinationResolver> destinationResolver;
56+
@Autowired
57+
private ObjectProvider<DestinationResolver> destinationResolver;
5758

58-
@Autowired
59-
private ObjectProvider<MessageConverter> messageConverter;
59+
@Autowired
60+
private ObjectProvider<MessageConverter> messageConverter;
61+
62+
@Bean
63+
@ConditionalOnMissingBean
64+
@ConditionalOnSingleCandidate(ConnectionFactory.class)
65+
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
66+
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
67+
jmsTemplate.setPubSubDomain(this.properties.isPubSubDomain());
68+
DestinationResolver destinationResolver = this.destinationResolver.getIfUnique();
69+
if (destinationResolver != null) {
70+
jmsTemplate.setDestinationResolver(destinationResolver);
71+
}
72+
MessageConverter messageConverter = this.messageConverter.getIfUnique();
73+
if (messageConverter != null) {
74+
jmsTemplate.setMessageConverter(messageConverter);
75+
}
76+
return jmsTemplate;
6077

61-
@Bean
62-
@ConditionalOnMissingBean
63-
public JmsTemplate jmsTemplate() {
64-
JmsTemplate jmsTemplate = new JmsTemplate(this.connectionFactory);
65-
jmsTemplate.setPubSubDomain(this.properties.isPubSubDomain());
66-
DestinationResolver destinationResolver = this.destinationResolver.getIfUnique();
67-
if (destinationResolver != null) {
68-
jmsTemplate.setDestinationResolver(destinationResolver);
69-
}
70-
MessageConverter messageConverter = this.messageConverter.getIfUnique();
71-
if (messageConverter != null) {
72-
jmsTemplate.setMessageConverter(messageConverter);
7378
}
74-
return jmsTemplate;
7579
}
7680

7781
@ConditionalOnClass(JmsMessagingTemplate.class)
78-
@ConditionalOnMissingBean(JmsMessagingTemplate.class)
82+
@Import(JmsTemplateConfiguration.class)
7983
protected static class MessagingTemplateConfiguration {
8084

8185
@Bean
86+
@ConditionalOnMissingBean
87+
@ConditionalOnSingleCandidate(JmsTemplate.class)
8288
public JmsMessagingTemplate jmsMessagingTemplate(JmsTemplate jmsTemplate) {
8389
return new JmsMessagingTemplate(jmsTemplate);
8490
}

0 commit comments

Comments
 (0)