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);
        // ...
    }
}

または、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はhealthcareおよびemployeeパッケージとTeacherクラスのコンポーネントをスキャンします。

Springは、指定されたパッケージとそのすべてのサブパッケージで、注釈が付けられたクラスを検索します @構成さらに、Configurationクラスには@Beanアノテーションを含めることができ、SpringアプリケーションコンテキストでメソッドをBeanとして登録します。 。 その後、@ ComponentScanアノテーションはそのようなBeanを自動検出できます。

@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はTomcatSpringMVCを自動構成します。 ただし、独自の構成を定義する場合、この自動構成の優先順位は低くなります。

@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から入手できます。