Spring Boot中@ComponentScan和@EnableAutoConfiguration之間的區別

1.簡介

在本快速教程中,我們將了解Spring Framework中@ComponentScan@EnableAutoConfiguration

2.Spring註解

註釋使在Spring中配置依賴項注入更加容易。除了使用XML配置文件,我們還可以在類和方法上使用Spring Bean批註來定義bean 。之後,Spring IoC容器配置並管理Bean。

這是我們將在本文中討論的註釋的概述:

  • @ComponentScan掃描帶註釋的Spring組件
  • @EnableAutoConfiguration用於啟用自動配置

現在讓我們研究這兩個註釋之間的區別。

3.他們如何不同

這些註釋之間的主要區別在於, @ComponentScan ComponentScan掃描Spring組件,而@EnableAutoConfiguration用於自動配置Spring Boot應用程序的類路徑中存在的bean

現在,讓我們更詳細地研究它們。

3.1 @ComponentScan

在開發應用程序時,我們需要告訴Spring框架尋找Spring管理的組件。 @ComponentScan使Spring能夠掃描諸如配置,控制器,服務以及我們定義的其他組件之類的東西。

特別是@ComponentScan 批註與@Configuration批註一起使用,以指定用於Spring掃描組件的軟件包:

@Configuration

 @ComponentScan

 public class EmployeeApplication {

 public static void main(String[] args) {

 ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);

 // ...

 }

 }

**另外,Spring也可以從指定的包開始掃描,我們可以使用basePackageClasses()basePackages() .**如果未指定包,則它將聲明@ComponentScan**批註的類的包視為起始包:**

package com.baeldung.annotations.componentscanautoconfigure;



 // ...



 @Configuration

 @ComponentScan(basePackages = {"com.tutorial.annotations.componentscanautoconfigure.healthcare",

 "com.tutorial.annotations.componentscanautoconfigure.employee"},

 basePackageClasses = Teacher.class)

 public class EmployeeApplication {

 public static void main(String[] args) {

 ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);

 // ...

 }

 }

在示例中,Spring將掃描healthcareemployee套餐以及Teacher類的組件。

Spring在指定的軟件包及其所有子軟件包中搜索@Configuration .另外, Configuration類可以包含@Bean批註,這些批註將方法註冊為Spring應用程序上下文中的bean 。之後,@ ComponentScan批註可以自動檢測此類bean:

@Configuration

 public class Hospital {

 @Bean

 public Doctor getDoctor() {

 return new Doctor();

 }

 }

**ComponentScan註釋還可以掃描,檢測和註冊Bean,以使用@ @Component, @Controller, @Service@Repository**註釋的類。

例如,我們可以創建一個Employee類作為組件,可以通過@ ComponentScan批註進行掃描:

@Component("employee")

 public class Employee {

 // ...

 }

3.2 @EnableAutoConfiguration

@EnableAutoConfiguration註釋使Spring Boot能夠自動配置應用程序上下文因此,它會基於類路徑中包含的jar文件和我們定義的bean自動創建和註冊bean。

例如,當我們spring-boot-starter-web依賴項時,Spring boot會自動配置Tomcat和Spring MVC。但是,如果我們定義自己的配置,則此自動配置的優先級較低。

@EnableAutoConfiguration批註的類的包被視為默認包。因此,我們應該始終@EnableAutoConfiguration批註,以便可以檢查每個子包和類:

@Configuration

 @EnableAutoConfiguration

 public class EmployeeApplication {

 public static void main(String[] args) {

 ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);

 // ...

 }

 }

此外, @EnableAutoConfiguration批註提供了兩個參數以手動排除任何參數:

我們可以使用exclude禁用我們不想自動配置的類的列表:

@Configuration

 @EnableAutoConfiguration(exclude={JdbcTemplateAutoConfiguration.class})

 public class EmployeeApplication {

 public static void main(String[] args) {

 ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);

 // ...

 }

 }

我們可以使用excludeName定義要從自動配置中排除的類名的完全限定列表:

@Configuration

 @EnableAutoConfiguration(excludeName = {"org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration"})

 public class EmployeeApplication {

 public static void main(String[] args) {

 ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);

 // ...

 }

 }

從Spring Boot 1.2.0開始,我們可以使用**@SpringBootApplication批註,該批註是@Configuration, @EnableAutoConfiguration, @ComponentScan EnableAutoConfiguration和@ComponentScan這三個批註及其默認屬性的組合**:

@SpringBootApplication

 public class EmployeeApplication {

 public static void main(String[] args) {

 ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);

 // ...

 }

 }

4 結論

在本文中,我們了解了Spring Boot中@ComponentScan@EnableAutoConfiguration