Why Spring Boot Application class needs to have @Configuration annotation?

varunkr :

I am learning about the Spring Framework but I can't understand what exactly the @Configuration annotation means and which classes should be annotated so. In the Spring Boot docs it is said that the Application class should be @Configuration class.

Spring Boot favors Java-based configuration. Although it is possible to call SpringApplication.run() with an XML source, we generally recommend that your primary source is a @Configuration class.

Trying to learn about @Configuration I find that annotating a class with the @Configuration indicates that the class can be used by the Spring IoC container as a source of bean definitions.

If that is so then how is this application class a source of bean definitions?

@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class App 
{
    public static void main(String[] args) throws Exception {
        SpringApplication.run(App.class, args);    
    }
}

I have pretty much understood most other basic concepts regarding Spring but I can't understand the purpose of @Configuration or which classes should be @Configuration classes? Can someone please help. Thanks !!

Artem Novikov :

You understood it right.

@Configuration

@Configuration is an analog for xml file. Such classes are sources of bean definitions by defining methods with the @Bean annotation.

@Configuration is:

  • not required, if you already pass the annotated class in the sources parameter when calling the SpringApplication.run() method;
  • required, when you don't pass the annotated class explicitly, but it's in the package that's specified in the @ComponentScan annotation of your main configuration class.

For readability, classes that are even explicitly passed as sources may anyway be annotated with @Configuration - just to show the intentions more clearly.

Your current class is not really source of bean definitions, because it doesn't have any, but if you had @Bean annotated methods, Spring would see them.

@EnableAutoConfiguration

Can be used with or without @Configuration. It tells Spring to setup some basic infrastructure judging by what you have in the classpath. It's done by invoking a so called import class that's derived from the value of the @Import annotation that @EnableAutoConfiguration includes. Only one class should be annotated with @EnableAutoConfiguration, duplicating it doesn't do anything.

This answer may also be helpful to understand the Spring Boot initialization process: Which piece of code in Spring Boot actually registers dispatcher servlet for SpringMVC?

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=425266&siteId=1