【Springboot】@ComponentScan の詳細説明

@ComponentScan

@ComponentScanコンテナ内のコンポーネントの自動スキャンと登録のための Spring フレームワークのアノテーションです。

アノテーションを使用すると@ComponentScan、指定したパッケージまたはクラスパスの下のコンポーネントをスキャンし、スキャンしたコンポーネントを Spring コンテナに自動的に登録するように Spring に指示できます。@ComponentScanアノテーションの詳細な使用法は次のとおりです。

  1. @ComponentScan必要な依存関係をインポートする:アノテーションを使用するために、プロジェクトに Spring フレームワークの関連する依存関係が導入されていることを確認してください。

  2. 構成クラスにアノテーションを追加する: Spring 構成クラスにアノテーションを追加し@ComponentScan、スキャンするパッケージまたはクラスパスを指定します。例えば:

@Configuration
@ComponentScan("com.example.package")
public class AppConfig {
    
    
    // 其他配置
}

@ComponentScan 注釈と正規表現

@ComponentScanアノテーションはincludeFiltersと のexcludeFiltersプロパティを提供し、これらのフィルターを使用して、どのコンポーネントをスキャンして Spring コンテナーに登録するかを正確に制御できます。でフィルターを使用する方法の例を次に示します@ComponentScan

@Configuration
@ComponentScan(basePackages = "com.example.package",
    includeFilters = {
    
    
        @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyAnnotation.class),
        @ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*ServiceImpl")
    },
    excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ExcludeComponent.class)
)
public class AppConfig {
    
    
    // 其他配置
}

上の例では、@ComponentScanアノテーションの属性を使用してincludeFilters2 つのフィルターを追加しました。

  • 最初のフィルターはFilterType.ANNOTATION型と注釈付きクラスを使用し、注釈付きコンポーネントMyAnnotation.classのみを含みます。MyAnnotation
  • 2 番目のフィルターはFilterType.REGEXタイプと正規表現を使用し".*ServiceImpl"、名前が「ServiceImpl」で終わるコンポーネントのみを含みます。

同時に、@ComponentScanアノテーションの属性を使用してexcludeFiltersフィルターも追加しました。

  • このフィルターはFilterType.ASSIGNABLE_TYPEタイプとExcludeComponent.classクラスを使用し、クラスを継承または実装するコンポーネントを除外しますExcludeComponent

ニーズに応じて、さまざまなフィルター タイプ ( 、 など) を使用しFilterType.ANNOTATION独自のフィルター ルールを定義できます。このようにして、どのコンポーネントをスキャンして Spring コンテナに登録するかを制御できます。FilterType.REGEXFilterType.ASSIGNABLE_TYPE

@ComponentScan カスタム

アノテーションを使用する場合@ComponentScan、フィルターをカスタマイズして、どのコンポーネントをスキャンして Spring コンテナーに登録するかをさらに制御できます。カスタム フィルターの作成方法を示す例は次のとおりです。

まず、カスタム フィルター クラスを作成し、TypeFilterインターフェイスを実装し、その中のメソッドをオーバーライドしますmatch()

import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.TypeFilter;

public class CustomFilter implements TypeFilter {
    
    

    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) {
    
    
        // 在这里编写你的过滤逻辑,根据需要返回 true 或 false
        // metadataReader 可以获取到正在扫描的组件的元数据信息,例如类名、注解等
        // metadataReaderFactory 可以获取到其他类的元数据信息

        // 示例:只匹配类名以 "Service" 结尾的组件
        String className = metadataReader.getClassMetadata().getClassName();
        return className.endsWith("Service");
    }
}

次に、@ComponentScan注釈でカスタム フィルターを使用します。

@Configuration
@ComponentScan(basePackages = "com.example.package",
    includeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM, classes = CustomFilter.class)
)
public class AppConfig {
    
    
    // 其他配置
}

上の例では、アノテーションのプロパティをCustomFilter.classfilter として渡しています@ComponentScanincludeFilters

カスタム フィルター クラスはTypeFilterインターフェイスを実装し、match()メソッドをオーバーライドします。このメソッドではmatch()、独自のフィルタリング ロジックを作成し、必要に応じて true または false を返し、現在スキャンされているコンポーネントと一致するかどうかを判断できます。上記の例のフィルタリング ロジックは、クラス名が「Service」で終わるコンポーネントのみに一致します。

カスタム フィルターを使用すると、より複雑な条件とロジックに基づいて、どのコンポーネントをスキャンして Spring コンテナーに登録するかを決定できます。これにより、より正確なコンポーネントの管理と構成が可能になります。

アノテーションでは、タイプ フィルターを@ComponentScan使用して、指定したタイプに一致するコンポーネントをスキャンして登録できます。FilterType.ASSIGNABLE_TYPEこのフィルターは、指定された型またはそのサブクラスまたは実装クラスと同じ型のコンポーネントを Spring コンテナーに登録します。

@ComponentScan ASSIGNABLE_TYPE

でフィルターを@ComponentScan使用する方法の例を次に示します。FilterType.ASSIGNABLE_TYPE

  1. スキャンして登録する必要がある基本クラスまたはインターフェイスを作成します。
public interface MyInterface {
    
    
    // 接口方法
}

  1. スキャンして登録する必要がある具体的な実装クラスを作成します。
@Component
public class MyImplementation implements MyInterface {
    
    
    // 实现类逻辑
}

  1. 構成クラスのアノテーションを使用して@ComponentScan次のタイプのフィルターincludeFiltersを含むように属性を設定します。FilterType.ASSIGNABLE_TYPE
@Configuration
@ComponentScan(basePackages = "com.example.package",
    includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MyInterface.class)
)
public class AppConfig {
    
    
    // 其他配置
}

上記の例では、MyInterface.classそれをフィルターとして@ComponentScanアノテーションincludeFiltersプロパティに渡し、インターフェイスを実装するコンポーネントのみがMyInterfaceスキャンされ、Spring コンテナーに登録されることを示します。このようにして、MyImplementationクラスがコンテナに自動的に登録されます。

フィルターを使用するとFilterType.ASSIGNABLE_TYPE、クラス階層に基づいてコンポーネントを簡単に選択的にスキャンして登録できます。これにより、特定のタイプのコンポーネントやそのサブクラス、実装クラスを Spring コンテナに自動的に登録できるようになり、より柔軟なコンポーネントの管理と構成が実現します。

おすすめ

転載: blog.csdn.net/qq_39017153/article/details/132160902