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
注释一起使用。
它有两个可选元素,
例子:
@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 2 - 在@Configuration 之前加载@Component
Spring boot之SpringApplicationBuilder,@@Configuration注解,@Component注解
Spring Boot 之注解@Component @ConfigurationProperties(prefix = "sms")