Generic Top

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

>> CHECK OUT THE COURSE

1. Introduction

In this quick tutorial, we’ll explore two different ways to disable database auto-configuration in Spring Boot, which can come in handy, say, when testing.

We’ll see examples for Redis, MongoDB, and Spring Data JPA.

Firstly, we’ll start by looking at the annotation-based approach and then we’ll look at the property file approach.

2. Disable Using Annotation

Let’s start with the MongoDB example, we’ll look at classes that need to be excluded:

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})

Similarly, let’s look at disabling auto-configuration for Redis:

@SpringBootApplication(exclude = {RedisAutoConfiguration.class, RedisRepositoryAutoConfiguration.class})

Finally, let’s look at disabling auto-configuration for Spring Data JPA:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, 
  DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})

3. Disable Using Property File

We can also disable auto-configuration using the property file, let’s first explore it with MongoDB:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,
  org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration

Now, let’s disable it for Redis:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,
  org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration

Similarly, let’s disable it for Spring Data JPA:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,
  org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,
  org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration

4. Testing

For testing, we’ll check that the Spring beans for the auto-configured classes are absent in our application context.

Let’s start with the test for MongoDB. We’ll verify if the MongoTemplate bean is absent:

public class SpringDataMongoDBIntegrationTest {

    @Autowired
    private ApplicationContext context;

    @Test(expected = NoSuchBeanDefinitionException.class)
    public void givenAutoconfigurationIsDisable_whenApplicationStarts_thenContextWillNotHaveTheAutoconfiguredClasses() {
        context.getBean(MongoTemplate.class);
    }
}

Now, let’s check for JPA. For JPA, the DataSource bean will be absent:

public class SpringDataJPAIntegrationTest {

    @Autowired
    private ApplicationContext context;

    @Test(expected = NoSuchBeanDefinitionException.class)
    public void givenAutoconfigurationIsDisable_whenApplicationStarts_thenContextWillNotHaveTheAutoconfiguredClasses() {
        context.getBean(DataSource.class);
    }
}

Similarly, for Redis we’ll check the RedisTemplate bean in our application context:

public class SpringDataRedisIntegrationTest {

    @Autowired
    private ApplicationContext context;

    @Test(expected = NoSuchBeanDefinitionException.class)
    public void givenAutoconfigurationIsDisable_whenApplicationStarts_thenContextWillNotHaveTheAutoconfiguredClasses() {
        context.getBean(RedisTemplate.class);
    }
}

5. Conclusion

In conclusion, in this quick tutorial, we’ve explored the ways to disable Spring Boot auto-configuration for different databases.

The source code for all examples in the article is available on GitHub.

Generic bottom

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

>> CHECK OUT THE COURSE

Leave a Reply

avatar
  Subscribe  
Notify of