@ComponentScan和春靴中的@EnableAutoConfiguration有什么区别?

2022-08-31 11:38:35

弹簧靴中的 注释 和 注释有什么区别?是否有必要添加这些内容?我的应用程序在没有这些注释的情况下运行良好。我只想了解为什么我们必须添加它们。@ComponentScan@EnableAutoConfiguration


答案 1

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

@EnableAutoConfiguration注释告诉Spring Boot根据您添加的jar依赖项“猜测”您将如何配置Spring。例如,如果 HSQLDB 位于类路径上,并且您尚未手动配置任何数据库连接 Bean,则 Spring 将自动配置内存中数据库。

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

是否有必要添加这些内容?

如果您需要Spring启动来自动为您配置所有内容,@EnableAutoConfiguration是必需的。您无需手动添加它,spring会根据您提供的注释在内部为您添加它。

实际上,@SpringBootApplication注释等效于使用@Configuration@EnableAutoConfiguration@ComponentScan及其默认属性。

另请参阅:


答案 2

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-web中排除spring-bootstarter-tomcat。

@ComponentScan为弹簧组件扫描提供了范围,但它只需通过提供的基础包,并获取@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();
  }

}

推荐