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


76

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


10
你有@SpringBootApplication吗 这是两个替代你所提到的
保罗Samsotha

是的,我在我的主班上使用它们
e2rabi '16

8
@ComponentScan是扫描您带注释的Spring组件,@EnableAutoConfiguration它启用Spring Boot提供的免费赠品(配置,激活的组件等)。@SprintBootApplication允许您使用单个注释,而不是常用的注释,例如您提到的两个注释。看一下我链接到的Javadoc
Paul Samsotha,2016年

Answers:


92

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

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

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

是否有必要添加这些?

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

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

也可以看看:


1
那么@ComponentScan@ComponentScans之间呢?
Julio Villane'3

20

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中排除,

@ComponentScan提供了Spring组件扫描的作用域,它只是通过提供的基本包并获取@Bean或@Autowired等所需的依赖项。在典型的Spring应用程序中,@ComponentScan用于配置类中,并用@注释组态。配置类包含用@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();
  }

}

4

@EnableAutoConfigurationspring 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@EnableAutoConfigurationSpring Boot 1.2中引入的较新版本。

@SpringBootApplication 是三个注释的组合,

  • @Configuration -用于基于Java的配置类。

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

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

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

可选元素之一是,

  • basePackages-可用于声明要扫描的特定程序包。

例,

@ComponentScan(basePackages = {"com.example.test"})
@Configuration
public class SpringConfiguration { }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.