Spring Boot中的@ComponentScan
和@EnableAutoConfiguration
注释有什么区别?是否有必要添加这些?没有这些注释,我的应用程序工作得很好。我只想了解为什么要添加它们。
答案 0 :(得分:53)
@ComponentScan和。之间有什么区别? Spring Boot中的@EnableAutoConfiguration注释?
@EnableAutoConfiguration
注释告诉Spring Boot根据您添加的jar依赖项“猜测”您将如何配置Spring。例如,如果HSQLDB在您的类路径上,并且您没有手动配置任何数据库连接bean,那么Spring将自动配置内存数据库。
@ComponentScan
告诉Spring在指定的包中寻找其他组件,配置和服务。 Spring能够从预定义的项目包中自动扫描,检测和注册您的bean或组件。如果未指定包,则将当前类包作为根包。
是否有必要添加这些?
如果你需要Spring启动来自动配置你需要的@EnableAutoConfiguration
。您无需手动添加它,spring将根据您提供的注释在内部为其添加。
实际上,@SpringBootApplication
注释相当于使用@Configuration
,@EnableAutoConfiguration
和@ComponentScan
及其默认属性。
另见:
答案 1 :(得分:10)
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 提供了弹簧组件扫描的范围,它只是通过提供的基础包并获取@Bean或@Autowired等所需的依赖关系,在一个典型的Spring应用程序@ComponentScan用于配置类,使用@Configuration注释。配置类包含使用@Bean注释的方法。这些@Bean注释方法生成由Spring容器管理的bean。 @ComponentScan注释将自动检测这些bean。有一些注释使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();
}
}
答案 2 :(得分:1)
@EnableAutoConfiguration
告诉您如何基于在类路径中添加的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
是@EnableAutoConfiguration
的较新版本,它是在Spring Boot 1.2中引入的。
@SpringBootApplication
是三个注释的组合,
@Configuration
-用于基于Java的配置类。
@ComponentScan
-启用组件扫描,所有软件包和
子软件包将被自动扫描,这些子软件包位于
使用哪个@SpringBootApplication。
@EnableAutoConfiguration
-启用
的自动配置
类基于添加到类路径中的jar。
@ComponentScan
启用组件扫描,以便将自动创建Web控制器类和您创建的其他组件
在spring的应用程序上下文中被发现并注册为bean。
您可以指定将被扫描以自动发现和注册Bean的基本软件包。
其中一个可选元素是
示例
@ComponentScan(basePackages = {"com.example.test"})
@Configuration
public class SpringConfiguration { }