Commit 80b8f199 authored by Andy Wilkinson's avatar Andy Wilkinson

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.
parent ff1983c9
...@@ -28,6 +28,7 @@ import org.springframework.amqp.rabbit.connection.ConnectionNameStrategy; ...@@ -28,6 +28,7 @@ import org.springframework.amqp.rabbit.connection.ConnectionNameStrategy;
import org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean; import org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean;
import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitMessagingTemplate; import org.springframework.amqp.rabbit.core.RabbitMessagingTemplate;
import org.springframework.amqp.rabbit.core.RabbitOperations;
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.ObjectProvider;
...@@ -151,7 +152,7 @@ public class RabbitAutoConfiguration { ...@@ -151,7 +152,7 @@ public class RabbitAutoConfiguration {
@Bean @Bean
@ConditionalOnSingleCandidate(ConnectionFactory.class) @ConditionalOnSingleCandidate(ConnectionFactory.class)
@ConditionalOnMissingBean @ConditionalOnMissingBean(RabbitOperations.class)
public RabbitTemplate rabbitTemplate(RabbitProperties properties, public RabbitTemplate rabbitTemplate(RabbitProperties properties,
ObjectProvider<MessageConverter> messageConverter, ObjectProvider<MessageConverter> messageConverter,
ObjectProvider<RabbitRetryTemplateCustomizer> retryTemplateCustomizers, ObjectProvider<RabbitRetryTemplateCustomizer> retryTemplateCustomizers,
......
...@@ -42,6 +42,7 @@ import org.springframework.data.cassandra.config.CassandraEntityClassScanner; ...@@ -42,6 +42,7 @@ import org.springframework.data.cassandra.config.CassandraEntityClassScanner;
import org.springframework.data.cassandra.config.CassandraSessionFactoryBean; import org.springframework.data.cassandra.config.CassandraSessionFactoryBean;
import org.springframework.data.cassandra.config.SchemaAction; import org.springframework.data.cassandra.config.SchemaAction;
import org.springframework.data.cassandra.core.CassandraAdminOperations; import org.springframework.data.cassandra.core.CassandraAdminOperations;
import org.springframework.data.cassandra.core.CassandraOperations;
import org.springframework.data.cassandra.core.CassandraTemplate; import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.data.cassandra.core.convert.CassandraConverter; import org.springframework.data.cassandra.core.convert.CassandraConverter;
import org.springframework.data.cassandra.core.convert.CassandraCustomConversions; import org.springframework.data.cassandra.core.convert.CassandraCustomConversions;
...@@ -118,7 +119,7 @@ public class CassandraDataAutoConfiguration { ...@@ -118,7 +119,7 @@ public class CassandraDataAutoConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(CassandraOperations.class)
public CassandraTemplate cassandraTemplate(Session session, CassandraConverter converter) { public CassandraTemplate cassandraTemplate(Session session, CassandraConverter converter) {
return new CassandraTemplate(session, converter); return new CassandraTemplate(session, converter);
} }
......
...@@ -29,6 +29,7 @@ import org.springframework.context.annotation.Bean; ...@@ -29,6 +29,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.ReactiveSession; import org.springframework.data.cassandra.ReactiveSession;
import org.springframework.data.cassandra.ReactiveSessionFactory; import org.springframework.data.cassandra.ReactiveSessionFactory;
import org.springframework.data.cassandra.core.ReactiveCassandraOperations;
import org.springframework.data.cassandra.core.ReactiveCassandraTemplate; import org.springframework.data.cassandra.core.ReactiveCassandraTemplate;
import org.springframework.data.cassandra.core.convert.CassandraConverter; import org.springframework.data.cassandra.core.convert.CassandraConverter;
import org.springframework.data.cassandra.core.cql.session.DefaultBridgedReactiveSession; import org.springframework.data.cassandra.core.cql.session.DefaultBridgedReactiveSession;
...@@ -60,7 +61,7 @@ public class CassandraReactiveDataAutoConfiguration { ...@@ -60,7 +61,7 @@ public class CassandraReactiveDataAutoConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(ReactiveCassandraOperations.class)
public ReactiveCassandraTemplate reactiveCassandraTemplate(ReactiveSession reactiveCassandraSession, public ReactiveCassandraTemplate reactiveCassandraTemplate(ReactiveSession reactiveCassandraSession,
CassandraConverter converter) { CassandraConverter converter) {
return new ReactiveCassandraTemplate(reactiveCassandraSession, converter); return new ReactiveCassandraTemplate(reactiveCassandraSession, converter);
......
...@@ -29,6 +29,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -29,6 +29,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessException;
import org.springframework.dao.support.PersistenceExceptionTranslator; import org.springframework.dao.support.PersistenceExceptionTranslator;
import org.springframework.data.mongodb.MongoDbFactory; import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.DbRefResolver; import org.springframework.data.mongodb.core.convert.DbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
...@@ -36,6 +37,7 @@ import org.springframework.data.mongodb.core.convert.MappingMongoConverter; ...@@ -36,6 +37,7 @@ import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.gridfs.GridFsOperations;
import org.springframework.data.mongodb.gridfs.GridFsTemplate; import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
...@@ -56,7 +58,7 @@ class MongoDbFactoryDependentConfiguration { ...@@ -56,7 +58,7 @@ class MongoDbFactoryDependentConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(MongoOperations.class)
MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MongoConverter converter) { MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MongoConverter converter) {
return new MongoTemplate(mongoDbFactory, converter); return new MongoTemplate(mongoDbFactory, converter);
} }
...@@ -72,7 +74,7 @@ class MongoDbFactoryDependentConfiguration { ...@@ -72,7 +74,7 @@ class MongoDbFactoryDependentConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(GridFsOperations.class)
GridFsTemplate gridFsTemplate(MongoDbFactory mongoDbFactory, MongoTemplate mongoTemplate) { GridFsTemplate gridFsTemplate(MongoDbFactory mongoDbFactory, MongoTemplate mongoTemplate) {
return new GridFsTemplate(new GridFsMongoDbFactory(mongoDbFactory, this.properties), return new GridFsTemplate(new GridFsMongoDbFactory(mongoDbFactory, this.properties),
mongoTemplate.getConverter()); mongoTemplate.getConverter());
......
...@@ -32,6 +32,7 @@ import org.springframework.context.annotation.Import; ...@@ -32,6 +32,7 @@ import org.springframework.context.annotation.Import;
import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.data.mongodb.ReactiveMongoDatabaseFactory; import org.springframework.data.mongodb.ReactiveMongoDatabaseFactory;
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
import org.springframework.data.mongodb.core.ReactiveMongoTemplate; import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import org.springframework.data.mongodb.core.SimpleReactiveMongoDatabaseFactory; import org.springframework.data.mongodb.core.SimpleReactiveMongoDatabaseFactory;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
...@@ -39,6 +40,7 @@ import org.springframework.data.mongodb.core.convert.MongoConverter; ...@@ -39,6 +40,7 @@ import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver; import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.gridfs.ReactiveGridFsOperations;
import org.springframework.data.mongodb.gridfs.ReactiveGridFsTemplate; import org.springframework.data.mongodb.gridfs.ReactiveGridFsTemplate;
/** /**
...@@ -72,7 +74,7 @@ public class MongoReactiveDataAutoConfiguration { ...@@ -72,7 +74,7 @@ public class MongoReactiveDataAutoConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(ReactiveMongoOperations.class)
public ReactiveMongoTemplate reactiveMongoTemplate(ReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory, public ReactiveMongoTemplate reactiveMongoTemplate(ReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory,
MongoConverter converter) { MongoConverter converter) {
return new ReactiveMongoTemplate(reactiveMongoDatabaseFactory, converter); return new ReactiveMongoTemplate(reactiveMongoDatabaseFactory, converter);
...@@ -88,13 +90,13 @@ public class MongoReactiveDataAutoConfiguration { ...@@ -88,13 +90,13 @@ public class MongoReactiveDataAutoConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(DataBufferFactory.class)
public DefaultDataBufferFactory dataBufferFactory() { public DefaultDataBufferFactory dataBufferFactory() {
return new DefaultDataBufferFactory(); return new DefaultDataBufferFactory();
} }
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(ReactiveGridFsOperations.class)
public ReactiveGridFsTemplate reactiveGridFsTemplate(ReactiveMongoDatabaseFactory reactiveMongoDbFactory, public ReactiveGridFsTemplate reactiveGridFsTemplate(ReactiveMongoDatabaseFactory reactiveMongoDbFactory,
MappingMongoConverter mappingMongoConverter, DataBufferFactory dataBufferFactory) { MappingMongoConverter mappingMongoConverter, DataBufferFactory dataBufferFactory) {
return new ReactiveGridFsTemplate(dataBufferFactory, reactiveMongoDbFactory, mappingMongoConverter, null); return new ReactiveGridFsTemplate(dataBufferFactory, reactiveMongoDbFactory, mappingMongoConverter, null);
......
...@@ -34,7 +34,9 @@ import org.springframework.boot.context.properties.PropertyMapper; ...@@ -34,7 +34,9 @@ import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
import org.springframework.jms.core.JmsMessageOperations;
import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.jms.core.JmsOperations;
import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.destination.DestinationResolver; import org.springframework.jms.support.destination.DestinationResolver;
...@@ -71,7 +73,7 @@ public class JmsAutoConfiguration { ...@@ -71,7 +73,7 @@ public class JmsAutoConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(JmsOperations.class)
@ConditionalOnSingleCandidate(ConnectionFactory.class) @ConditionalOnSingleCandidate(ConnectionFactory.class)
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) { public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
PropertyMapper map = PropertyMapper.get(); PropertyMapper map = PropertyMapper.get();
...@@ -104,7 +106,7 @@ public class JmsAutoConfiguration { ...@@ -104,7 +106,7 @@ public class JmsAutoConfiguration {
protected static class MessagingTemplateConfiguration { protected static class MessagingTemplateConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(JmsMessageOperations.class)
@ConditionalOnSingleCandidate(JmsTemplate.class) @ConditionalOnSingleCandidate(JmsTemplate.class)
public JmsMessagingTemplate jmsMessagingTemplate(JmsProperties properties, JmsTemplate jmsTemplate) { public JmsMessagingTemplate jmsMessagingTemplate(JmsProperties properties, JmsTemplate jmsTemplate) {
JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(jmsTemplate); JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(jmsTemplate);
......
...@@ -64,7 +64,7 @@ import org.springframework.transaction.PlatformTransactionManager; ...@@ -64,7 +64,7 @@ import org.springframework.transaction.PlatformTransactionManager;
public class JooqAutoConfiguration { public class JooqAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(ConnectionProvider.class)
public DataSourceConnectionProvider dataSourceConnectionProvider(DataSource dataSource) { public DataSourceConnectionProvider dataSourceConnectionProvider(DataSource dataSource) {
return new DataSourceConnectionProvider(new TransactionAwareDataSourceProxy(dataSource)); return new DataSourceConnectionProvider(new TransactionAwareDataSourceProxy(dataSource));
} }
......
...@@ -24,6 +24,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; ...@@ -24,6 +24,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.mail.MailSender; import org.springframework.mail.MailSender;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.JavaMailSenderImpl;
/** /**
...@@ -38,7 +39,7 @@ import org.springframework.mail.javamail.JavaMailSenderImpl; ...@@ -38,7 +39,7 @@ import org.springframework.mail.javamail.JavaMailSenderImpl;
class MailSenderPropertiesConfiguration { class MailSenderPropertiesConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(JavaMailSender.class)
JavaMailSenderImpl mailSender(MailProperties properties) { JavaMailSenderImpl mailSender(MailProperties properties) {
JavaMailSenderImpl sender = new JavaMailSenderImpl(); JavaMailSenderImpl sender = new JavaMailSenderImpl();
applyProperties(properties, sender); applyProperties(properties, sender);
......
...@@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.sendgrid; ...@@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.sendgrid;
import com.sendgrid.Client; import com.sendgrid.Client;
import com.sendgrid.SendGrid; import com.sendgrid.SendGrid;
import com.sendgrid.SendGridAPI;
import org.apache.http.HttpHost; import org.apache.http.HttpHost;
import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClientBuilder;
...@@ -44,7 +45,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -44,7 +45,7 @@ import org.springframework.context.annotation.Configuration;
public class SendGridAutoConfiguration { public class SendGridAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(SendGridAPI.class)
public SendGrid sendGrid(SendGridProperties properties) { public SendGrid sendGrid(SendGridProperties properties) {
if (properties.isProxyConfigured()) { if (properties.isProxyConfigured()) {
HttpHost proxy = new HttpHost(properties.getProxy().getHost(), properties.getProxy().getPort()); HttpHost proxy = new HttpHost(properties.getProxy().getHost(), properties.getProxy().getPort());
......
...@@ -28,6 +28,7 @@ import org.apache.commons.logging.LogFactory; ...@@ -28,6 +28,7 @@ import org.apache.commons.logging.LogFactory;
import org.thymeleaf.dialect.IDialect; import org.thymeleaf.dialect.IDialect;
import org.thymeleaf.extras.java8time.dialect.Java8TimeDialect; import org.thymeleaf.extras.java8time.dialect.Java8TimeDialect;
import org.thymeleaf.extras.springsecurity5.dialect.SpringSecurityDialect; import org.thymeleaf.extras.springsecurity5.dialect.SpringSecurityDialect;
import org.thymeleaf.spring5.ISpringTemplateEngine;
import org.thymeleaf.spring5.ISpringWebFluxTemplateEngine; import org.thymeleaf.spring5.ISpringWebFluxTemplateEngine;
import org.thymeleaf.spring5.SpringTemplateEngine; import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.SpringWebFluxTemplateEngine; import org.thymeleaf.spring5.SpringWebFluxTemplateEngine;
...@@ -133,7 +134,7 @@ public class ThymeleafAutoConfiguration { ...@@ -133,7 +134,7 @@ public class ThymeleafAutoConfiguration {
protected static class ThymeleafDefaultConfiguration { protected static class ThymeleafDefaultConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(ISpringTemplateEngine.class)
SpringTemplateEngine templateEngine(ThymeleafProperties properties, SpringTemplateEngine templateEngine(ThymeleafProperties properties,
ObjectProvider<ITemplateResolver> templateResolvers, ObjectProvider<IDialect> dialects) { ObjectProvider<ITemplateResolver> templateResolvers, ObjectProvider<IDialect> dialects) {
SpringTemplateEngine engine = new SpringTemplateEngine(); SpringTemplateEngine engine = new SpringTemplateEngine();
......
...@@ -35,6 +35,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -35,6 +35,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; import org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.support.TransactionOperations;
import org.springframework.transaction.support.TransactionTemplate; import org.springframework.transaction.support.TransactionTemplate;
/** /**
...@@ -63,7 +64,7 @@ public class TransactionAutoConfiguration { ...@@ -63,7 +64,7 @@ public class TransactionAutoConfiguration {
public static class TransactionTemplateConfiguration { public static class TransactionTemplateConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean(TransactionOperations.class)
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) { public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager); return new TransactionTemplate(transactionManager);
} }
......
...@@ -82,7 +82,7 @@ class AtomikosJtaConfiguration { ...@@ -82,7 +82,7 @@ class AtomikosJtaConfiguration {
} }
@Bean(initMethod = "init", destroyMethod = "close") @Bean(initMethod = "init", destroyMethod = "close")
@ConditionalOnMissingBean @ConditionalOnMissingBean(TransactionManager.class)
UserTransactionManager atomikosTransactionManager(UserTransactionService userTransactionService) throws Exception { UserTransactionManager atomikosTransactionManager(UserTransactionService userTransactionService) throws Exception {
UserTransactionManager manager = new UserTransactionManager(); UserTransactionManager manager = new UserTransactionManager();
manager.setStartupTransactionService(false); manager.setStartupTransactionService(false);
......
...@@ -136,7 +136,7 @@ public class ErrorMvcAutoConfiguration { ...@@ -136,7 +136,7 @@ public class ErrorMvcAutoConfiguration {
@Bean @Bean
@ConditionalOnBean(DispatcherServlet.class) @ConditionalOnBean(DispatcherServlet.class)
@ConditionalOnMissingBean @ConditionalOnMissingBean(ErrorViewResolver.class)
DefaultErrorViewResolver conventionErrorViewResolver() { DefaultErrorViewResolver conventionErrorViewResolver() {
return new DefaultErrorViewResolver(this.applicationContext, this.resourceProperties); return new DefaultErrorViewResolver(this.applicationContext, this.resourceProperties);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment