当前位置: 首页 > 面试题库 >

ComponentScan excludeFilters在Spring 4.0.6.RELEASE中不起作用

淳于烈
2023-03-14
问题内容

我有一个要在组件扫描时排除的类。我正在使用下面的代码来做到这一点,但这似乎没有用,尽管一切似乎都正确

@ComponentScan(basePackages = { "common", "adapter", "admin"}, excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ServiceImpl.class) })

实际上,我想在我的其余api逻辑中使用实现“ Service”接口的“
ServiceImpl”类,并在进行api的集成测试时希望排除这种实现并加载模拟的实现。但这似乎没有发生,即使使用上面的内容我也收到以下错误

No qualifying bean of type [admin.Service] is defined: expected single matching bean but found 2: ServiceMockImpl,ServiceImpl

我花了太多时间在此上,但没有任何效果。

任何帮助表示赞赏。


问题答案:

经过大量的工作和研究,我注意到在组件扫描方面,Spring的行为并不奇怪。

伪像是这样的:

ServiceImpl是实现Service接口的实际实现类。 ServiceMockImpl是实现Service接口的模拟植入类。

我想调整组件扫描,使其仅加载,ServiceMockImpl但不会加载ServiceImpl

我必须@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ServiceImpl.class)@ComponentScan测试配置类的中添加,以从组件扫描中排除该特定类。但是即使进行了上述更改,两个类都已加载,并且测试失败。

经过大量的工作和研究,我发现ServiceImpl由于另一个类正在被加载并且其中包含@ComponentScan所有软件包而正在加载。因此,我添加了如下代码以Application从组件扫描中排除该类@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Application.class)

之后,它按预期工作。

如下代码

@ComponentScan(
    excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = OAuthCacheServiceImpl.class),
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Application.class)
    },
    basePackages = {
        "common", "adapter", "admin"
    }
)

我已经看到很多有关组件扫描的问题很久没有得到回答,因此我想添加这些细节,因为这可能会在将来对某人有所帮助。

嗯…



 类似资料:
  • 我有一些 在量角器中,我们搜索并找到元素,检查文本是否符合我们的期望,然后对该元素调用。测试在Chrome中运行良好,但在IE中就好像没有点击发生一样。破坏了测试。 IE 11是否支持点击

  • 问题内容: 我注意到less.js在firefox中工作,但在Chrome中不工作,或者是因为我出错了吗? 即使我尝试在Chrome中仍然无法使用,我在某个地方犯了错误吗? 问题答案: 通过您提供的链接: 如果您使用的是Chrome,Less.js浏览器脚本当前将无法使用,并且由于已知的Chrome问题,网页的路径以“file:///”开头。

  • 问题内容: 不仅如此,其他代码也有相同的问题。只是不能使用ImageView。 环境:macOS,IntelliJ 造成原因:java.lang.IllegalArgumentException:无效的URL:无效的URL或找不到资源 问题答案: 该图像构造函数接受一个url作为参数。如果您未在其中添加协议,则它将假定该项目来自类路径。显然,不会出现在您的类路径中。 要从文件而不是类路径中读取,请

  • 问题内容: 当我迅速运行此代码时,我不知道为什么应用程序会在“ alertView.show()”部分显示一个断点而终止,请有人帮帮我。 问题答案: 从Xcode 6.0 UIAlertView类: 不推荐使用UIAlertView。改用UIAlertController和UIAlertControllerStyleAlert的preferredStyle。 在Swift(iOS 8和OS X 1

  • 问题内容: 我已经动态创建了一个复选框。我曾经在单击复选框时调用过一个函数,该函数在Google Chrome和Firefox中有效,但 在Internet Explorer 8中不起作用 。这是我的代码: 是我的事件处理程序。 问题答案: 尝试: 更新: 对于IE9之前的InternetExplorer版本,应使用attachEvent方法将指定的侦听器注册到调用它的EventTarget上,对

  • 问题内容: 我在Linux GCC中使用了fflush(),但是没有用。该功能还有其他选择吗?这是我的代码: 我得到的输出是: 然后程序结束。就这样。我可以在Linux中做什么?有替代功能吗? 问题答案: 不要使用fflush,而是使用以下函数: 取决于实现,但是此功能始终有效。在C中,使用是不当做法。