Skip to content

Commit 80b8f19

Browse files
committed
Tune @ConditionalOnMissingBean for interface-based back off
Previously, a number of usages of @ConditionalOnMissingBean prevented a bean that implements an auto-configured bean's "main" interface from causing the auto-configuration of the bean to back off. This would happen when @ConditionalOnMissingBean did not specify a type, the @bean method returned the bean's concrete type, and that concreate type implements a "main" interface. This commit updates such usages of @ConditionalOnMissingBean to specify the "main" interface as the type of the bean that must be missing. This will allow, for example, the auto-configured MongoTemplate bean to back off when a MongoOperations bean is defined.
1 parent ff1983c commit 80b8f19

13 files changed

+30
-17
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean;
2929
import org.springframework.amqp.rabbit.core.RabbitAdmin;
3030
import org.springframework.amqp.rabbit.core.RabbitMessagingTemplate;
31+
import org.springframework.amqp.rabbit.core.RabbitOperations;
3132
import org.springframework.amqp.rabbit.core.RabbitTemplate;
3233
import org.springframework.amqp.support.converter.MessageConverter;
3334
import org.springframework.beans.factory.ObjectProvider;
@@ -151,7 +152,7 @@ protected static class RabbitTemplateConfiguration {
151152

152153
@Bean
153154
@ConditionalOnSingleCandidate(ConnectionFactory.class)
154-
@ConditionalOnMissingBean
155+
@ConditionalOnMissingBean(RabbitOperations.class)
155156
public RabbitTemplate rabbitTemplate(RabbitProperties properties,
156157
ObjectProvider<MessageConverter> messageConverter,
157158
ObjectProvider<RabbitRetryTemplateCustomizer> retryTemplateCustomizers,

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.springframework.data.cassandra.config.CassandraSessionFactoryBean;
4343
import org.springframework.data.cassandra.config.SchemaAction;
4444
import org.springframework.data.cassandra.core.CassandraAdminOperations;
45+
import org.springframework.data.cassandra.core.CassandraOperations;
4546
import org.springframework.data.cassandra.core.CassandraTemplate;
4647
import org.springframework.data.cassandra.core.convert.CassandraConverter;
4748
import org.springframework.data.cassandra.core.convert.CassandraCustomConversions;
@@ -118,7 +119,7 @@ public CassandraSessionFactoryBean cassandraSession(Environment environment, Cas
118119
}
119120

120121
@Bean
121-
@ConditionalOnMissingBean
122+
@ConditionalOnMissingBean(CassandraOperations.class)
122123
public CassandraTemplate cassandraTemplate(Session session, CassandraConverter converter) {
123124
return new CassandraTemplate(session, converter);
124125
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveDataAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.context.annotation.Configuration;
3030
import org.springframework.data.cassandra.ReactiveSession;
3131
import org.springframework.data.cassandra.ReactiveSessionFactory;
32+
import org.springframework.data.cassandra.core.ReactiveCassandraOperations;
3233
import org.springframework.data.cassandra.core.ReactiveCassandraTemplate;
3334
import org.springframework.data.cassandra.core.convert.CassandraConverter;
3435
import org.springframework.data.cassandra.core.cql.session.DefaultBridgedReactiveSession;
@@ -60,7 +61,7 @@ public ReactiveSessionFactory reactiveCassandraSessionFactory(ReactiveSession re
6061
}
6162

6263
@Bean
63-
@ConditionalOnMissingBean
64+
@ConditionalOnMissingBean(ReactiveCassandraOperations.class)
6465
public ReactiveCassandraTemplate reactiveCassandraTemplate(ReactiveSession reactiveCassandraSession,
6566
CassandraConverter converter) {
6667
return new ReactiveCassandraTemplate(reactiveCassandraSession, converter);

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDbFactoryDependentConfiguration.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,15 @@
2929
import org.springframework.dao.DataAccessException;
3030
import org.springframework.dao.support.PersistenceExceptionTranslator;
3131
import org.springframework.data.mongodb.MongoDbFactory;
32+
import org.springframework.data.mongodb.core.MongoOperations;
3233
import org.springframework.data.mongodb.core.MongoTemplate;
3334
import org.springframework.data.mongodb.core.convert.DbRefResolver;
3435
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
3536
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
3637
import org.springframework.data.mongodb.core.convert.MongoConverter;
3738
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
3839
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
40+
import org.springframework.data.mongodb.gridfs.GridFsOperations;
3941
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
4042
import org.springframework.util.Assert;
4143
import org.springframework.util.StringUtils;
@@ -56,7 +58,7 @@ class MongoDbFactoryDependentConfiguration {
5658
}
5759

5860
@Bean
59-
@ConditionalOnMissingBean
61+
@ConditionalOnMissingBean(MongoOperations.class)
6062
MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MongoConverter converter) {
6163
return new MongoTemplate(mongoDbFactory, converter);
6264
}
@@ -72,7 +74,7 @@ MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMapping
7274
}
7375

7476
@Bean
75-
@ConditionalOnMissingBean
77+
@ConditionalOnMissingBean(GridFsOperations.class)
7678
GridFsTemplate gridFsTemplate(MongoDbFactory mongoDbFactory, MongoTemplate mongoTemplate) {
7779
return new GridFsTemplate(new GridFsMongoDbFactory(mongoDbFactory, this.properties),
7880
mongoTemplate.getConverter());

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveDataAutoConfiguration.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,15 @@
3232
import org.springframework.core.io.buffer.DataBufferFactory;
3333
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
3434
import org.springframework.data.mongodb.ReactiveMongoDatabaseFactory;
35+
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
3536
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
3637
import org.springframework.data.mongodb.core.SimpleReactiveMongoDatabaseFactory;
3738
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
3839
import org.springframework.data.mongodb.core.convert.MongoConverter;
3940
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
4041
import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver;
4142
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
43+
import org.springframework.data.mongodb.gridfs.ReactiveGridFsOperations;
4244
import org.springframework.data.mongodb.gridfs.ReactiveGridFsTemplate;
4345

4446
/**
@@ -72,7 +74,7 @@ public SimpleReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory(MongoProp
7274
}
7375

7476
@Bean
75-
@ConditionalOnMissingBean
77+
@ConditionalOnMissingBean(ReactiveMongoOperations.class)
7678
public ReactiveMongoTemplate reactiveMongoTemplate(ReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory,
7779
MongoConverter converter) {
7880
return new ReactiveMongoTemplate(reactiveMongoDatabaseFactory, converter);
@@ -88,13 +90,13 @@ public MappingMongoConverter mappingMongoConverter(MongoMappingContext context,
8890
}
8991

9092
@Bean
91-
@ConditionalOnMissingBean
93+
@ConditionalOnMissingBean(DataBufferFactory.class)
9294
public DefaultDataBufferFactory dataBufferFactory() {
9395
return new DefaultDataBufferFactory();
9496
}
9597

9698
@Bean
97-
@ConditionalOnMissingBean
99+
@ConditionalOnMissingBean(ReactiveGridFsOperations.class)
98100
public ReactiveGridFsTemplate reactiveGridFsTemplate(ReactiveMongoDatabaseFactory reactiveMongoDbFactory,
99101
MappingMongoConverter mappingMongoConverter, DataBufferFactory dataBufferFactory) {
100102
return new ReactiveGridFsTemplate(dataBufferFactory, reactiveMongoDbFactory, mappingMongoConverter, null);

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
import org.springframework.context.annotation.Bean;
3535
import org.springframework.context.annotation.Configuration;
3636
import org.springframework.context.annotation.Import;
37+
import org.springframework.jms.core.JmsMessageOperations;
3738
import org.springframework.jms.core.JmsMessagingTemplate;
39+
import org.springframework.jms.core.JmsOperations;
3840
import org.springframework.jms.core.JmsTemplate;
3941
import org.springframework.jms.support.converter.MessageConverter;
4042
import org.springframework.jms.support.destination.DestinationResolver;
@@ -71,7 +73,7 @@ public JmsTemplateConfiguration(JmsProperties properties,
7173
}
7274

7375
@Bean
74-
@ConditionalOnMissingBean
76+
@ConditionalOnMissingBean(JmsOperations.class)
7577
@ConditionalOnSingleCandidate(ConnectionFactory.class)
7678
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
7779
PropertyMapper map = PropertyMapper.get();
@@ -104,7 +106,7 @@ private void mapTemplateProperties(Template properties, JmsTemplate template) {
104106
protected static class MessagingTemplateConfiguration {
105107

106108
@Bean
107-
@ConditionalOnMissingBean
109+
@ConditionalOnMissingBean(JmsMessageOperations.class)
108110
@ConditionalOnSingleCandidate(JmsTemplate.class)
109111
public JmsMessagingTemplate jmsMessagingTemplate(JmsProperties properties, JmsTemplate jmsTemplate) {
110112
JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(jmsTemplate);

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
public class JooqAutoConfiguration {
6565

6666
@Bean
67-
@ConditionalOnMissingBean
67+
@ConditionalOnMissingBean(ConnectionProvider.class)
6868
public DataSourceConnectionProvider dataSourceConnectionProvider(DataSource dataSource) {
6969
return new DataSourceConnectionProvider(new TransactionAwareDataSourceProxy(dataSource));
7070
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderPropertiesConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.context.annotation.Bean;
2525
import org.springframework.context.annotation.Configuration;
2626
import org.springframework.mail.MailSender;
27+
import org.springframework.mail.javamail.JavaMailSender;
2728
import org.springframework.mail.javamail.JavaMailSenderImpl;
2829

2930
/**
@@ -38,7 +39,7 @@
3839
class MailSenderPropertiesConfiguration {
3940

4041
@Bean
41-
@ConditionalOnMissingBean
42+
@ConditionalOnMissingBean(JavaMailSender.class)
4243
JavaMailSenderImpl mailSender(MailProperties properties) {
4344
JavaMailSenderImpl sender = new JavaMailSenderImpl();
4445
applyProperties(properties, sender);

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/sendgrid/SendGridAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.sendgrid.Client;
2020
import com.sendgrid.SendGrid;
21+
import com.sendgrid.SendGridAPI;
2122
import org.apache.http.HttpHost;
2223
import org.apache.http.impl.client.HttpClientBuilder;
2324

@@ -44,7 +45,7 @@
4445
public class SendGridAutoConfiguration {
4546

4647
@Bean
47-
@ConditionalOnMissingBean
48+
@ConditionalOnMissingBean(SendGridAPI.class)
4849
public SendGrid sendGrid(SendGridProperties properties) {
4950
if (properties.isProxyConfigured()) {
5051
HttpHost proxy = new HttpHost(properties.getProxy().getHost(), properties.getProxy().getPort());

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.thymeleaf.dialect.IDialect;
2929
import org.thymeleaf.extras.java8time.dialect.Java8TimeDialect;
3030
import org.thymeleaf.extras.springsecurity5.dialect.SpringSecurityDialect;
31+
import org.thymeleaf.spring5.ISpringTemplateEngine;
3132
import org.thymeleaf.spring5.ISpringWebFluxTemplateEngine;
3233
import org.thymeleaf.spring5.SpringTemplateEngine;
3334
import org.thymeleaf.spring5.SpringWebFluxTemplateEngine;
@@ -133,7 +134,7 @@ SpringResourceTemplateResolver defaultTemplateResolver() {
133134
protected static class ThymeleafDefaultConfiguration {
134135

135136
@Bean
136-
@ConditionalOnMissingBean
137+
@ConditionalOnMissingBean(ISpringTemplateEngine.class)
137138
SpringTemplateEngine templateEngine(ThymeleafProperties properties,
138139
ObjectProvider<ITemplateResolver> templateResolvers, ObjectProvider<IDialect> dialects) {
139140
SpringTemplateEngine engine = new SpringTemplateEngine();

0 commit comments

Comments
 (0)