Spring Boot 中的 @ComponentScan
和 @EnableAutoConfiguration
注释有什么区别?有必要加这些吗?没有这些注释,我的应用程序运行良好。我只是想了解为什么我们必须添加它们。
原文由 e2rabi 发布,翻译遵循 CC BY-SA 4.0 许可协议
Spring Boot 中的 @ComponentScan
和 @EnableAutoConfiguration
注释有什么区别?有必要加这些吗?没有这些注释,我的应用程序运行良好。我只是想了解为什么我们必须添加它们。
原文由 e2rabi 发布,翻译遵循 CC BY-SA 4.0 许可协议
Spring Boot 的主要优点之一是它的注解驱动与传统的基于 xml 的配置相比, @EnableAutoConfiguration 根据其包含的 jar 文件自动配置 Spring 应用程序,它根据 pom.xml 中的依赖项设置默认值或帮助程序。自动配置通常基于类路径和定义的 bean 应用。因此,我们不需要定义任何 DataSource、EntityManagerFactory、TransactionManager 等,并且神奇地基于类路径,Spring Boot 会自动创建适当的 bean 并为我们注册它们。例如,当您的类路径中有一个 tomcat-embedded.jar 时,您可能需要一个 TomcatEmbeddedServletContainerFactory(除非您定义了自己的 EmbeddedServletContainerFactory bean)。 @EnableAutoConfiguration 有一个排除属性来显式禁用自动配置,否则我们可以简单地将它从 pom.xml 中排除,例如,如果我们不希望 Spring 配置 tomcat,则从 spring-boot-starter- 中排除 spring-bootstarter-tomcat-网。
@ComponentScan 为 spring 组件扫描提供范围,它简单地遍历 提供的基础包 并获取 @Bean 或 @Autowired 等所需的依赖项,在典型的 Spring 应用程序中,@ComponentScan 用在配置类中,那些用 @ 注释的配置。配置类包含用@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();
}
}
原文由 ShayneR 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
@EnableAutoConfiguration
注释告诉 Spring Boot 根据您添加的 jar 依赖项“猜测”您将如何配置 Spring。例如,如果 HSQLDB 在您的类路径上,并且您没有手动配置任何数据库连接 bean,那么 Spring 将自动配置一个内存数据库。@ComponentScan
告诉Spring在指定包中寻找其他组件、配置和服务。 Spring 能够从预定义的项目包中自动扫描、检测和注册您的 bean 或组件。如果未指定包,则将当前类包作为根包。如果您需要 Spring Boot 为您自动配置所有东西
@EnableAutoConfiguration
是必需的。你不需要手动添加,spring会根据你提供的注解在内部为你添加。Actually the
@SpringBootApplication
annotation is equivalent to using@Configuration
,@EnableAutoConfiguration
and@ComponentScan
with their default attributes.也可以看看: