知識庫 / Spring / Spring Boot RSS 訂閱

Spring Boot 中的 @ComponentScan 和 @EnableAutoConfiguration 區別

Spring Boot
HongKong
5
12:45 PM · Dec 06 ,2025

1. 引言

在本快速教程中,我們將學習 Spring Framework 中 @ComponentScan@EnableAutoConfiguration 註解之間的區別。

2. Spring 註解

註解簡化了 Spring 中的依賴注入配置。 而不是使用 XML 配置文件,我們可以使用 Spring Bean 註解在類和方法上定義 Bean。 隨後,Spring IoC 容器將配置和管理這些 Bean。

以下是本文將討論的註解概述:

  • @ComponentScan 掃描帶有 Spring 組件註解的類
  • @EnableAutoConfiguration 用於啓用自動配置

現在,讓我們來探討這兩種註解之間的區別。

3. 它們之間的區別

主要的區別在於,<em @ComponentScan</em> 會掃描 Spring 組件,而 <em @EnableAutoConfiguration</em> 則用於在 Spring Boot 應用中配置 classpath 中存在的自動配置 Bean。

現在,我們來更詳細地瞭解它們。

3.1. <em @ComponentScan</em>

當開發應用程序時,我們需要告知 Spring 框架搜索 Spring 管理的組件。<em @ComponentScan</em> 允許 Spring 掃描配置、控制器、服務和其他我們定義的組件。

特別是,<em @ComponentScan</em> 註解與 <em @Configuration</em> 註解一起使用,以指定 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.baeldung.annotations.componentscanautoconfigure.healthcare",
  "com.baeldung.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。 之後, 的答案是: ``` 1234567890 ```
@Configuration
public class Hospital {
    @Bean
    public Doctor getDoctor() {
        return new Doctor();
    }
}

此外,ComponentScan註解也可以掃描、檢測並註冊為@Component@Controller@Service@Repository註解標註的類對應的Bean。

例如,我們可以創建一個Employee類作為組件,該類可以被ComponentScan註解掃描:

@Component("employee")
public class Employee {
    // ...
}

3.2. <em @EnableAutoConfiguration</em>>

The `>` annotation enables Spring Boot to auto-configure the application context. Therefore, it automatically creates and registers beans based on both the included jar files in the classpath and the beans defined by us.

For example, when we define the `>` dependency in our classpath, Spring Boot auto-configures Tomcat 和 Spring MVC。 但是,這種自動配置在定義了我們自己的配置時具有較低的優先級。

聲明包含 `>` 註解的類的包被認為是默認包。 因此,我們應該始終在根包中應用該 `>` 註解,以便可以檢查所有子包和類:

@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 標註,以及它們的默認屬性。

@SpringBootApplication
public class EmployeeApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
        // ...
    }
}

4. 結論

在本文中,我們學習了 Spring Boot 中 @ComponentScan@EnableAutoConfiguration 的區別。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.