Issue
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 !!
Solution
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 theSpringApplication.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?
Answered By - Artem Novikov
Answer Checked By - Cary Denson (JavaFixing Admin)