如何使用@ComponentScan排除两个具有相同名称的软件包之一?

时间:2018-08-21 01:20:37

标签: java spring annotations

我有一个包裹:

xxx.yyy.zzz {
 SampleClass1.java
}

并打包两个:

xxx.yyy.zzz {
 SampleClass2.java
}

并打包了三个:

aaa.bbb.ccc {
 TopClass.java
}

在TopClass中,我正在使用组件扫描,因此可以从Package 2中加载类,因为我要@Autowire SampleClass2.java。但是,使用组件扫描,由于它们具有相同的程序包名称,因此它尝试引入SampleClass1.java。这样做时,由于我不需要的SampleClass1导致了很多错误,因此需要满足其他依赖项Bean。

如何在不面对SampleClass1.java冲突的情况下@Autowire SampleClass2.java?

2 个答案:

答案 0 :(得分:3)

根据我的理解,不能有两个名称相同的包,而不能是两个类的相同包。 因此,您的包和类的结构如下:

xxx.yyy.zzz{ SampleClass2.java, SampleClass1.java }

意味着在包装上使用组件扫描时,将同时加载两个类。 如果是这种情况,那么:

  • 我建议将它们分开包装。或
  • SampleClass1.java删除为一个组件,但这意味着您无法在需要的地方自动装配SampleClass1.java

答案 1 :(得分:1)

我的意思是程序包头相同,这引起了一个问题:
IE位于文件顶部:

package xxx.yyy.zzz;

我能够这样解决问题:

@ComponentScan(basePackageClasses =
        {
                SampleClass2.class,
        },
        useDefaultFilters = false,
        includeFilters = {@ComponentScan.Filter(
                        type = FilterType.ASSIGNABLE_TYPE,
                        value = {
                                SampleClass2.class,
                        })
})

这种类型的组件扫描严格采用了必要的类,而没有其他依赖项。