@ComponentScan
@ComponentScan
コンテナ内のコンポーネントの自動スキャンと登録のための Spring フレームワークのアノテーションです。
アノテーションを使用すると@ComponentScan
、指定したパッケージまたはクラスパスの下のコンポーネントをスキャンし、スキャンしたコンポーネントを Spring コンテナに自動的に登録するように Spring に指示できます。@ComponentScan
アノテーションの詳細な使用法は次のとおりです。
-
@ComponentScan
必要な依存関係をインポートする:アノテーションを使用するために、プロジェクトに Spring フレームワークの関連する依存関係が導入されていることを確認してください。 -
構成クラスにアノテーションを追加する: 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
アノテーションの属性を使用してincludeFilters
2 つのフィルターを追加しました。
- 最初のフィルターは
FilterType.ANNOTATION
型と注釈付きクラスを使用し、注釈付きコンポーネントMyAnnotation.class
のみを含みます。MyAnnotation
- 2 番目のフィルターは
FilterType.REGEX
タイプと正規表現を使用し".*ServiceImpl"
、名前が「ServiceImpl」で終わるコンポーネントのみを含みます。
同時に、@ComponentScan
アノテーションの属性を使用してexcludeFilters
フィルターも追加しました。
- このフィルターは
FilterType.ASSIGNABLE_TYPE
タイプとExcludeComponent.class
クラスを使用し、クラスを継承または実装するコンポーネントを除外しますExcludeComponent
。
ニーズに応じて、さまざまなフィルター タイプ ( 、 など) を使用してFilterType.ANNOTATION
独自のフィルター ルールを定義できます。このようにして、どのコンポーネントをスキャンして Spring コンテナに登録するかを制御できます。FilterType.REGEX
FilterType.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.class
filter として渡しています。@ComponentScan
includeFilters
カスタム フィルター クラスはTypeFilter
インターフェイスを実装し、match()
メソッドをオーバーライドします。このメソッドではmatch()
、独自のフィルタリング ロジックを作成し、必要に応じて true または false を返し、現在スキャンされているコンポーネントと一致するかどうかを判断できます。上記の例のフィルタリング ロジックは、クラス名が「Service」で終わるコンポーネントのみに一致します。
カスタム フィルターを使用すると、より複雑な条件とロジックに基づいて、どのコンポーネントをスキャンして Spring コンテナーに登録するかを決定できます。これにより、より正確なコンポーネントの管理と構成が可能になります。
アノテーションでは、タイプ フィルターを@ComponentScan
使用して、指定したタイプに一致するコンポーネントをスキャンして登録できます。FilterType.ASSIGNABLE_TYPE
このフィルターは、指定された型またはそのサブクラスまたは実装クラスと同じ型のコンポーネントを Spring コンテナーに登録します。
@ComponentScan ASSIGNABLE_TYPE
でフィルターを@ComponentScan
使用する方法の例を次に示します。FilterType.ASSIGNABLE_TYPE
- スキャンして登録する必要がある基本クラスまたはインターフェイスを作成します。
public interface MyInterface {
// 接口方法
}
- スキャンして登録する必要がある具体的な実装クラスを作成します。
@Component
public class MyImplementation implements MyInterface {
// 实现类逻辑
}
- 構成クラスのアノテーションを使用して
@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 コンテナに自動的に登録できるようになり、より柔軟なコンポーネントの管理と構成が実現します。