Spring Boot中@ComponentScan和@EnableAutoConfiguration有什么区别?

89
在Spring Boot中,@ComponentScan和@EnableAutoConfiguration注解之间有什么区别?是否需要添加这些注解?我的应用程序在没有这些注解的情况下也可以正常工作。我只是想了解为什么我们需要添加它们。

13
你有@SpringBootApplication吗?那是你提到的两个的替代品。 - Paul Samsotha
是的,我在我的主类中使用它们。 - e2rabi
9
@ComponentScan用于扫描您注释的Spring组件,@EnableAutoConfiguration启用Spring Boot提供的免费好处(配置、激活组件等)。@SpringBootApplication允许您使用单个注释而不是通常使用的几个注释,例如您提到的两个。请查看我链接的javadoc。 - Paul Samsotha
3个回答

110
这段内容是关于Spring Boot中的两个注解@ComponentScan@EnableAutoConfiguration之间的区别。@EnableAutoConfiguration注解告诉Spring Boot根据你添加的jar依赖项“猜测”你想要如何配置Spring。例如,如果HSQLDB在你的类路径上,并且你没有手动配置任何数据库连接bean,则Spring将自动配置一个内存数据库。@ComponentScan则告诉Spring在指定的包中查找其他组件、配置和服务。Spring能够自动扫描、检测和注册你的bean或组件来自预定义的项目包。如果没有指定包名,则当前类包被视为根包。是否需要添加这些注解呢?
如果您需要Spring Boot自动为您配置所有内容,则需要使用@EnableAutoConfiguration。您不需要手动添加它,Spring会根据您提供的注释在内部自动添加它。
实际上,@SpringBootApplication注释等同于使用@Configuration@EnableAutoConfiguration@ComponentScan及其默认属性。
另请参见:

2
那么 @ComponentScan@ComponentScans 之间呢? - Julio Villane

23
Spring Boot的主要优势之一是基于注解和传统XML配置相比更为方便,@EnableAutoConfiguration可以自动根据pom.xml文件中的依赖项来配置Spring应用程序,它会根据类路径和定义的bean自动配置。因此,我们不需要定义DataSource、EntityManagerFactory、TransactionManager等任何Bean,Spring Boot会自动创建适当的Bean并将它们注册给我们。例如,当class路径中有tomcat-embedded.jar时,通常需要一个TomcatEmbeddedServletContainerFactory(除非您已经定义了自己的EmbeddedServletContainerFactory Bean)。@EnableAutoConfiguration带有exclude属性以明确禁用自动配置,否则我们可以从pom.xml中排除它,例如,如果我们不想让Spring配置tomcat,则从spring-boot-starter-web中排除spring-bootstarter-tomcat。 @ComponentScan提供了Spring组件扫描的范围,它简单地浏览所提供的基本包,并挑选出@Bean或@Autowired等所需的依赖项。在一个典型的Spring应用中,@ComponentScan通常用于配置类上,这些类使用@Configuration进行注释。配置类包含用@Bean注释的方法,这些@Bean注释的方法生成受Spring容器管理的Beans。这些Bean将被@ComponentScan注释自动检测到。有一些注释可以使Bean自动检测到,如@Repository、@Service、@Controller、@Configuration、@Component。 在下面的代码中,Spring从包含BeanA类的包开始扫描。
@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();
  }

}

10
在Spring Boot中,@EnableAutoConfiguration用于告诉Spring如何配置,基于您在类路径中添加的JAR包。 例如,如果您在类路径中添加了spring-boot-starter-web依赖项,则会自动配置Tomcat和Spring MVC。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

您可以使用 @EnableAutoConfiguration 注释和 @Configuration 注释一起使用。它有两个可选元素,

  • exclude: 如果要排除类的自动配置。
  • excludeName: 如果要使用类的完全限定名称来排除类的自动配置。

示例:

@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@EnableAutoConfiguration 的新版本,它是在 Spring Boot 1.2 中引入的。

@SpringBootApplication 是三个注解的组合,它们分别是:

  • @Configuration - 用于Java配置类。

  • @ComponentScan - 启用组件扫描,所有位于根包下(应用了 @SpringBootApplication)的子包都将自动扫描。

  • @EnableAutoConfiguration - 基于添加到classpath中的jar包,启用自动配置。

@ComponentScan 启用组件扫描,使Web控制器类和其他组件可以自动被发现并在Spring的应用上下文中注册为Bean。您可以指定要扫描以自动发现和注册Bean的基本包。

其中一个可选元素是:

  • basePackages - 可以用来指定要扫描的特定包。

例如:

@ComponentScan(basePackages = {"com.example.test"})
@Configuration
public class SpringConfiguration { }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接