1. Overview

Spring comes with a set of @Enable annotations that make it easier for developers to configure a Spring application. These annotations are used in conjunction with the @Configuration annotation.

In this article we will be looking at some these annotations:

  • @EnableWebMvc
  • @EnableCaching
  • @EnableScheduling
  • @EnableAsync
  • @EnableWebSocket
  • @EnableJpaRepositories
  • @EnableTransactionManagement
  • @EnableJpaAuditing

2. @EnableWebMvc

The @EnableWebMvc annotation is used for enabling Spring MVC in an application and works by importing the Spring MVC Configuration from WebMvcConfigurationSupport.

The XML equivalent with similar functionality is mvc:annotation-driven/.

The configuration can be customized by the @Configuration class implementing the WebMvcConfigurer:

@Configuration
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(
      List<HttpMessageConverter<?>> converters) {
 
        converters.add(new MyHttpMessageConverter());
    }
 
    // ...
}

3. @EnableCaching

The @EnableCaching annotation enables annotation-driven cache management capability within the application and allows us to use the @Cacheable and @CacheEvict annotations in our application.

The XML equivalent with similar functionality is the cache:\* namespace:

@Configuration
@EnableCaching
public class CacheConfig {
 
    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(
          Arrays.asList(new ConcurrentMapCache("default")));
        return cacheManager;
    }
}

This annotation also has the following options:

  • mode — indicates how caching advice should be applied
  • order — indicates the ordering of the execution caching advisor when applied at a specific joinpoint
  • proxyTargetClass — indicates whether subclass-based (CGLIB) proxies are to be created as opposed to standard Java interface-based proxies

This configuration again can be customized by the @Configuration class implementing the CachingConfigurerSupport class:

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {

    @Bean
    @Override
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(
          Arrays.asList(new ConcurrentMapCache("default")));
        return cacheManager;
    }

    @Bean
    @Override
    public KeyGenerator keyGenerator() {
        return new MyKeyGenerator();
    }
}

For more on using Spring caching you can refer to this article.

4. @EnableScheduling

The @EnableScheduling annotation enables scheduled task capabilities and allows us to use @Scheduled annotations in the application. The XML equivalent with similar functionality is the task:\* namespace using the scheduler attribute.

This configuration again can be customized by the @Configuration class implementing the SchedulingConfigurer class:

@Configuration
@EnableScheduling
public class SchedulingConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(
      ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
    }

    @Bean(destroyMethod = "shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(100);
    }
}

For more on using Spring scheduling, you can refer to this article.

5. @EnableAsync

The @EnableAsync annotation enables asynchronous processing in our application. The XML equivalent with similar functionality is the task:\* namespace using the executor attribute.

@Configuration
@EnableAync
public class AsyncConfig { ... }

For more on using Spring async, you can refer to this article.

6. @EnableWebSocket

The @EnableWebSocket annotation is used to configure the processing of web socket requests. Customization can be done by implementing the WebSocketConfigurer class:

@Configuration
@EnableWebSocket
public class MyConfiguration implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(echoWebSocketHandler(), "/echo").withSockJS();
    }

    @Bean
    public WebSocketHandler echoWebSocketHandler() {
        return new EchoWebSocketHandler();
    }
}

For more on using Spring Websockets, you can refer to this article.

7. @EnableJpaRepositories

The @EnableJpaRepositories annotation enables Spring Data JPA repositories by scanning the package of the annotated configuration class for repositories.

@Configuration
@EnableJpaRepositories
public class JpaConfig { ... }

Some options available for this annotation are:

  • value — alias for the basePackages() attribute
  • basePackages — base packages to scan for annotated components
  • enableDefaultTransactions — configures whether or not to enable default transactions for Spring Data JPA repositories
  • entityManagerFactoryRef — configures the name of the EntityManagerFactory bean definition to be used

8. @EnableTransactionManagement

The @EnableTransactionManagement annotation enables Spring's annotation-driven transaction management capability. The XML equivalent is the tx:\* namespace.

@Configuration
@EnableTransactionManagement
public class JpaConfig { ... }

For more on using Spring Transaction Management, you can refer to this article.

9. @EnableJpaAuditing

The @EnableJpaAuditing annotation enables auditing on your JPA entities.

@Configuration
@EnableJpaAuditing
public class JpaConfig {

    @Bean
    public AuditorAware<AuditableUser> auditorProvider() {
        return new AuditorAwareImpl();
    }
}

For more on using Spring Web Sockets, you can refer to this article.

10. Conclusion

In this quick article, we looked at some @Enable Spring annotations and how they can be used to help us configure a Spring Application.