Spring Boot中@ComponentScan和@EnableAutoConfiguration之間的區別
- Spring Boot
- Spring
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將掃描healthcare
和employee
套餐以及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