Spring Boot 中的 @ComponentScan 和 @EnableAutoConfiguration 有啥区别?

Posted

技术标签:

【中文标题】Spring Boot 中的 @ComponentScan 和 @EnableAutoConfiguration 有啥区别?【英文标题】:What is the difference between @ComponentScan and @EnableAutoConfiguration in Spring Boot?Spring Boot 中的 @ComponentScan 和 @EnableAutoConfiguration 有什么区别? 【发布时间】:2016-05-02 12:05:14 【问题描述】:

Spring Boot 中的@ComponentScan@EnableAutoConfiguration 注解有什么区别?有必要添加这些吗?没有这些注释,我的应用程序运行良好。我只是想了解为什么我们必须添加它们。

【问题讨论】:

你有@SpringBootApplication吗?那是你提到的两个的替代品 是的,我在我的主课中使用它们 @ComponentScan 用于扫描带注释的 Spring 组件,@EnableAutoConfiguration 它启用 Spring Boot 提供的免费好东西(配置、激活的组件等)。 @SprintBootApplication 允许您使用单个注释而不是常用的几个注释,例如您提到的两个。看看我链接到的javadoc 【参考方案1】:

@ComponentScan 和 Spring Boot 中的 @EnableAutoConfiguration 注解?

@EnableAutoConfiguration 注释告诉 Spring Boot 根据您添加的 jar 依赖项“猜测”您将如何配置 Spring。例如,如果 HSQLDB 在您的类路径中,并且您没有手动配置任何数据库连接 bean,那么 Spring 将自动配置内存数据库。

@ComponentScan 告诉 Spring 在指定的包中查找其他组件、配置和服务。 Spring 能够从预定义的项目包中自动扫描、检测和注册您的 bean 或组件。如果未指定包,则将当前类包作为根包。

这些有必要加吗?

如果你需要 Spring boot 来自动为你配置所有东西 @EnableAutoConfiguration 是必需的。你不需要手动添加,spring会根据你提供的注解在内部为你添加。

实际上@SpringBootApplication注解相当于使用@Configuration@EnableAutoConfiguration@ComponentScan及其默认属性。

另请参阅:

Using the @SpringBootApplication annotation Auto-configuration

【讨论】:

那么@ComponentScan@ComponentScans之间呢??【参考方案2】:

Spring Boot 的主要优点之一是它的注解驱动与传统的基于 xml 的配置相比,@EnableAutoConfiguration 根据其包含的 jar 文件自动配置 Spring 应用程序,它根据以下内容设置默认值或帮助程序pom.xml 中的依赖项。 自动配置通常基于类路径和定义的 bean 应用。因此,我们不需要定义任何 DataSource、EntityManagerFactory、TransactionManager 等,并且神奇地基于类路径,Spring Boot 会自动创建适当的 bean 并为我们注册它们。例如,当您的类路径中有一个 tomcat-embedded.jar 时,您可能需要一个 TomcatEmbeddedServletContainerFactory(除非您已经定义了自己的 EmbeddedServletContainerFactory bean)。 @EnableAutoConfiguration 有一个 exclude 属性来显式禁用自动配置,否则我们可以简单地将其从 pom.xml 中排除,例如,如果我们不希望 Spring 配置 tomcat,则从 spring-boot-starter- 中排除 spring-bootstarter-tomcat网络。

@ComponentScan 为 Spring 组件扫描提供范围,它只是通过 提供的基础包 并获取 @Bean 或 @Autowired 等所需的依赖项,在典型的Spring 应用程序,@ComponentScan 用于配置类中,使用@Configuration 注释的类。配置类包含使用@Bean 注释的方法。这些 @Bean 注解的方法生成由 Spring 容器管理的 bean。这些 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();
  


【讨论】:

【参考方案3】:

@EnableAutoConfiguration 在 spring boot 中会根据您在类路径中添加的 jar 告诉您如何配置 spring。 例如,如果您在类路径中添加 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 是 Spring Boot 1.2 中引入的 @EnableAutoConfiguration 的更新版本。

@SpringBootApplication是三个注解的组合,

@Configuration - 用于基于 java 的配置类。

@ComponentScan - 启用组件扫描,所有包和 将自动扫描根包下的子包 应用了哪个@SpringBootApplication。

@EnableAutoConfiguration - 启用自动配置 类基于类路径中添加的 jar。

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

其中一个可选元素是,

basePackages - 可用于指定要扫描的特定包。

例子,

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

【讨论】:

以上是关于Spring Boot 中的 @ComponentScan 和 @EnableAutoConfiguration 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

自主开发的、带有 @Component 的组件在Spring Boot 项目中不生效的解决方法

Spring Boot - DI - 单元测试

Spring Boot 2 - 在@Configuration 之前加载@Component

Spring Boot在单元测试时删除@Component

Spring boot之SpringApplicationBuilder,@@Configuration注解,@Component注解

Spring Boot 之注解@Component @ConfigurationProperties(prefix = "sms")