1. ホーム
  2. java

[解決済み] ComponentScan から @Component を除外する。

2023-01-01 21:49:22

質問

コンポーネントがあり、それを @ComponentScan から除外したいコンポーネントがあります。 @Configuration :

@Component("foo") class Foo {
...
}

そうしないと、私のプロジェクト内の他のクラスと衝突するようです。私は衝突を完全に理解しているわけではありませんが、もし私が @Component アノテーションをコメントアウトすると、物事は私が望むように動作します。しかし、このライブラリに依存する他のプロジェクトは、このクラスがSpringによって管理されることを期待しているので、私は私のプロジェクトでのみそれをスキップしたいのです。

私は @ComponentScan.Filter :

@Configuration 
@EnableSpringConfigured
@ComponentScan(basePackages = {"com.example"}, excludeFilters={
  @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=Foo.class)})
public class MySpringConfiguration {}

を使っていますが、うまくいかないようです。もし私が FilterType.ASSIGNABLE_TYPE を使ってみると、一見ランダムなクラスを読み込むことができないという奇妙なエラーが表示されます。

原因: java.io.FileNotFoundException: クラスパスリソース [junit/framework/TestCase.class] が存在しないため、開くことができない。

また type=FilterType.CUSTOM を使ってみました。

class ExcludeFooFilter implements TypeFilter {
    @Override
    public boolean match(MetadataReader metadataReader,
            MetadataReaderFactory metadataReaderFactory) throws IOException {
        return metadataReader.getClass() == Foo.class;
    }
}

@Configuration @EnableSpringConfigured
@ComponentScan(basePackages = {"com.example"}, excludeFilters={
  @ComponentScan.Filter(type=FilterType.CUSTOM, value=ExcludeFooFilter.class)})
public class MySpringConfiguration {}

しかし、これでは私が望むように、コンポーネントをスキャンから除外することはできないようです。

どうすれば除外できるのでしょうか?

どのように解決するのですか?

設定は問題ないようです。 excludeFilters の代わりに excludes :

@Configuration @EnableSpringConfigured
@ComponentScan(basePackages = {"com.example"}, excludeFilters={
  @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=Foo.class)})
public class MySpringConfiguration {}