A quick peek into AutoConfiguration

Auto configuration is one of the most important features of Spring Boot. In this section, we will take a quick peek behind the scenes to understand how Spring Boot auto configuration works.

Most of the Spring Boot auto configuration magic comes from spring-boot-autoconfigure-{version}.jar. When we start any Spring Boot application, a number of beans get automatically configured. How does this happen?

The following screenshot shows an extract from spring.factories from spring-boot-autoconfigure-{version}.jar. We have filtered out some of the configurations in the interest of space:

The preceding list of auto configuration classes is run whenever a Spring Boot application is launched. Let's take a quick look at one of them:

org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration.

Here's a small snippet:

@Configuration

@ConditionalOnWebApplication

@ConditionalOnClass(
{ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class })

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)

@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)

public class WebMvcAutoConfiguration {

Some of the important points to note are as follows:

  • @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class }): This auto configuration is enabled if any of the classes mentioned are in the classpath. When we add a web starter project, we bring in dependencies with all these classes. Hence, this auto configuration will be enabled.
  • @ConditionalOnMissingBean(WebMvcConfigurationSupport.class): This auto configuration is enabled only if the application does not explicitly declare a bean of the WebMvcConfigurationSupport.class class.
  • @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10): This specifies the precedence of this specific auto configuration.

Let's look at another small snippet showing one of the methods from the same class:

   @Bean
@ConditionalOnBean(ViewResolver.class)
@ConditionalOnMissingBean
(name = "viewResolver”, value = ContentNegotiatingViewResolver.class)
public ContentNegotiatingViewResolver viewResolver(BeanFactory beanFactory) {

ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();

resolver.setContentNegotiationManager(beanFactory.getBean
(ContentNegotiationManager.class));
resolver.setOrder(Ordered.HIGHEST_PRECEDENCE);

return resolver;

}

View resolvers are one of the beans configured by the WebMvcAutoConfiguration class. The preceding snippet ensures that if a view resolver is not provided by the application, then Spring Boot automatically configures a default view resolver. Here are a few important points to note:

  • @ConditionalOnBean(ViewResolver.class): Create this bean if ViewResolver.class is on the classpath.
  • @ConditionalOnMissingBean(name = "viewResolver", value = ContentNegotiatingViewResolver.class): Create this bean if there are no explicitly declared beans of the viewResolver name and of the ContentNegotiatingViewResolver.class type.
  • The remainder of the method is configured in the view resolver.

To summarize, all the auto configuration logic is executed at the start of a Spring Boot application. If a specific class (from a specific dependency or starter project) is available on the classpath, then the AutoConfiguration classes are executed. These auto configuration classes look at what beans are already configured. Based on the existing beans, they enable the creation of the default beans.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset