What is the difference between @ComponentScan and @EnableAutoConfiguration in Spring Boot?
Asked Answered
M

4

91

What is the difference between the @ComponentScan and @EnableAutoConfiguration annotations in Spring Boot? Is it necessary to add these? My application works very well without these annotations. I just want to understand why we have to add them.

Multiracial answered 26/1, 2016 at 0:40 Comment(3)
Do you have @SpringBootApplication? That is a replacement for the two you mentionedAutostrada
Yes ,I use them in my main classMultiracial
@ComponentScan is to scan for your annotated Spring components, @EnableAutoConfiguration it enable the free goodies (configurations, activated components and such) Spring Boot offers. @SprintBootApplication allows you to use a single annotation rather than a few that are commonly used, like the two you mentioned. Look at the javadoc I linked toAutostrada
S
112

What is the difference between the @ComponentScan and @EnableAutoConfiguration annotations in Spring Boot?

@EnableAutoConfiguration annotation tells Spring Boot to "guess" how you will want to configure Spring, based on the jar dependencies that you have added. For example, If HSQLDB is on your classpath, and you have not manually configured any database connection beans, then Spring will auto-configure an in-memory database.

@ComponentScan tells Spring to look for other components, configurations, and services in the specified package. Spring is able to auto scan, detect and register your beans or components from pre-defined project package. If no package is specified current class package is taken as the root package.

Is it necessary to add these?

If you need Spring boot to Auto configure every thing for you @EnableAutoConfiguration is required. You don't need to add it manually, spring will add it internally for you based on the annotation you provide.

Actually the @SpringBootApplication annotation is equivalent to using @Configuration, @EnableAutoConfiguration and @ComponentScan with their default attributes.

See also:

Shelly answered 26/1, 2016 at 4:2 Comment(1)
And what about between @ComponentScan and @ComponentScans??Frans
B
23

One of the main advantages of Spring Boot is its annotation driven versus traditional xml based configurations, @EnableAutoConfiguration automatically configures the Spring application based on its included jar files, it sets up defaults or helper based on dependencies in pom.xml. Auto-configuration is usually applied based on the classpath and the defined beans. Therefore, we donot need to define any of the DataSource, EntityManagerFactory, TransactionManager etc and magically based on the classpath, Spring Boot automatically creates proper beans and registers them for us. For example when there is a tomcat-embedded.jar on your classpath you likely need a TomcatEmbeddedServletContainerFactory (unless you have defined your own EmbeddedServletContainerFactory bean). @EnableAutoConfiguration has a exclude attribute to disable an auto-configuration explicitly otherwise we can simply exclude it from the pom.xml, for example if we donot want Spring to configure the tomcat then exclude spring-bootstarter-tomcat from spring-boot-starter-web.

@ComponentScan provides scope for spring component scan, it simply goes though the provided base package and picks up dependencies required by @Bean or @Autowired etc, In a typical Spring application, @ComponentScan is used in a configuration classes, the ones annotated with @Configuration. Configuration classes contains methods annotated with @Bean. These @Bean annotated methods generate beans managed by Spring container. Those beans will be auto-detected by @ComponentScan annotation. There are some annotations which make beans auto-detectable like @Repository , @Service, @Controller, @Configuration, @Component. In below code Spring starts scanning from the package including BeanA class.

@Configuration
@ComponentScan(basePackageClasses = BeanA.class)
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class Config {

  @Bean
  public BeanA beanA(){
    return new BeanA();
  }

  @Bean
  public BeanB beanB{
    return new BeanB();
  }

}
Billings answered 2/11, 2017 at 17:0 Comment(0)
M
10

@EnableAutoConfiguration in spring boot tells how you want to configure spring, based on the jars that you have added in your classpath. For example, if you add spring-boot-starter-web dependency in your classpath, it automatically configures Tomcat and Spring MVC.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

You can use @EnableAutoConfiguration annotation along with @Configuration annotation. It has two optional elements,

  • exclude : if you want to exclude the auto-configuration of a class.
  • excludeName : if you want to exclude the auto-configuration of a class using fully qualified name of class.

Examples:

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
  public class MyConfiguration {
}


@EnableAutoConfiguration(excludeName = {"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@SpringBootApplication is a newer version of @EnableAutoConfiguration which was introduced in Spring Boot 1.2.

@SpringBootApplication is a combination of three annotations,

  • @Configuration - for java based configuration classes.

  • @ComponentScan - to enable component scanning, all the packages and subpackages will be auto-scanned which are under the root package on which @SpringBootApplication is applied.

  • @EnableAutoConfiguration - to enable auto-configuration of the
    classes bases on the jars added in classpath.

@ComponentScan enables component scanning so that web controller classes and other components that you create will be automatically discovered and registered as beans in spring's application context. You can specify the base packages that will be scanned for auto-discovering and registering of beans.

One of the optional element is,

  • basePackages - can be used to state specific packages to scan.

Example,

@ComponentScan(basePackages = {"com.example.test"})
@Configuration
public class SpringConfiguration { }
Mick answered 1/11, 2019 at 18:0 Comment(0)
A
0

Just make sure that, @SpringBootApplication works the best if you keep the someNameAppication class outside of the project folders like controllers, services, models etc. It going to scan through entire directory. Make sure to package it smartly.

Aube answered 13/12, 2023 at 4:40 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.