SpringBootでの@ComponentScanと@EnableAutoConfigurationの違い
1. 序章
このクイックチュートリアルでは、SpringFrameworkの@ComponentScanアノテーションと@EnableAutoConfigurationアノテーションの違いについて学習します。
2. 春の注釈
アノテーションを使用すると、Springでの依存性注入の構成が簡単になります。 XML構成ファイルを使用する代わりに、クラスとメソッドでSpringBeanアノテーションを使用してBeanを定義できます。 その後、SpringIoCコンテナーがBeanを構成および管理します。
この記事で説明するアノテーションの概要は次のとおりです。
- @ComponentScan注釈付きのSpringコンポーネントをスキャンします
- @EnableAutoConfiguration は、自動構成を有効にするために使用されます
次に、これら2つの注釈の違いを調べてみましょう。
3. それらがどのように異なるか
これらのアノテーションの主な違いは、@ ComponentScanがSpringコンポーネントをスキャンするのに対し、@EnableAutoConfigurationはSpringBootアプリケーションのクラスパスに存在する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);
// ...
}
}
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はhealthcareおよびemployeeパッケージとTeacherクラスのコンポーネントをスキャンします。
Springは、指定されたパッケージとそのすべてのサブパッケージで、注釈が付けられたクラスを検索します @構成
@Configuration
public class Hospital {
@Bean
public Doctor getDoctor() {
return new Doctor();
}
}
さらに、@ ComponentScanアノテーションは、@ Component、@ Controller、@ Service、および@Repository でアノテーションが付けられたクラスのBeanをスキャン、検出、および登録することもできます。
たとえば、@ ComponentScanアノテーションでスキャンできるコンポーネントとしてEmployeeクラスを作成できます。
@Component("employee")
public class Employee {
// ...
}
3.2. @EnableAutoConfiguration
@EnableAutoConfigurationアノテーションにより、SpringBootがアプリケーションコンテキストを自動構成できるようになります。 したがって、クラスパスに含まれているjarファイルと私たちが定義したBeanの両方に基づいてBeanを自動的に作成し、登録します。
たとえば、クラスパスで spring-boot-starter-web 依存関係を定義すると、SpringbootはTomcatとSpringMVCを自動構成します。 ただし、独自の構成を定義する場合、この自動構成の優先順位は低くなります。
@EnableAutoConfigurationアノテーションを宣言するクラスのパッケージは、デフォルトと見なされます。 したがって、ルートパッケージに @EnableAutoConfiguration アノテーションを常に適用して、すべてのサブパッケージとクラスを調べることができるようにする必要があります。
@Configuration
@EnableAutoConfiguration
public class EmployeeApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
// ...
}
}
さらに、 @EnableAutoConfiguration アノテーションは、パラメーターを手動で除外するための2つのパラメーターを提供します。
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の3つのアノテーションとデフォルトの属性を組み合わせたものです。
@SpringBootApplication
public class EmployeeApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(EmployeeApplication.class, args);
// ...
}
}
4. 結論
この記事では、SpringBootの@ComponentScanと@EnableAutoConfigurationの違いについて学びました。
いつものように、これらの例のコードはGitHubでから入手できます。