我需要在我的Spring引导应用程序中找到只实现一个特定接口的类。我面临的问题是,ClassPathBean定义扫描仪正在返回实现“扩展”子接口的类。
示例:
public interface A {}
public interface B extends A {}
public interface C extends A {}
public interface D extends A {}
public interface E extends B {}
public interface F extends B {}
public interface G extends B {}
public interface H extends B {}
public interface I extends B {}
public interface J extends B {}
以下是我目前使用的代码:
BeanDefinitionRegistry bdr = new SimpleBeanDefinitionRegistry();
ClassPathBeanDefinitionScanner s = new ClassPathBeanDefinitionScanner(bdr);
TypeFilter tf_include_1 = new AssignableTypeFilter(E.class);
TypeFilter tf_exculude1 = new AssignableTypeFilter(C.class);
TypeFilter tf_exculude2 = new AssignableTypeFilter(D.class);
s.addIncludeFilter(tf_include_1);
s.addExcludeFilter(tf_exculude1);
s.addExcludeFilter(tf_exculude2);
s.setIncludeAnnotationConfig(false);
// s.resetFilters(false);
s.scan("edu.university.ServiceLayer.*");
System.out.println("Printing all classes that implement the E");
String[] beans = bdr.getBeanDefinitionNames();
for (String string : beans) {
System.out.println(string);
}
现在的结果是数组字符串“beans”包含所有其他类,如F、G、H、I、J等。
如何以只返回只实现指定接口的选定类的方式构造我的TypeFitler,即过滤掉应用扩展接口的所有实现。例如B类,但E类除外。
以下是将ClassPathBeanDefinitionScanner的默认构造函数更改为ClassPathBeanDefinitionScanner(bdr,false)后适用于我的代码,正如用户@Holger所建议的那样。
BeanDefinitionRegistry bdr = new SimpleBeanDefinitionRegistry();
ClassPathBeanDefinitionScanner s = new ClassPathBeanDefinitionScanner(bdr, false);
TypeFilter tf_include_1 = new AssignableTypeFilter(E.class);
s.resetFilters(false);
s.addIncludeFilter(tf_include_1);
s.setIncludeAnnotationConfig(false);
s.scan("edu.university.ServiceLayer.*");
System.out.println("Printing all classes that implement the E");
String[] beans = bdr.getBeanDefinitionNames();
for (String string : beans) {
System.out.println(string);
}
请注意,resetFilters已被注释掉,其顺序也已更改
C
,D
,F
,G
,H
,I
,J
都不能分配给E
,因为它们不是E
的子类型,所以简单的包含过滤器新的可分配类型过滤器(E.class)
应该可以完成这项工作。
您的问题源于使用了新的ClassPathBean定义扫描仪(bdr)构造函数,该构造函数将使用默认过滤器初始化扫描仪,正如您在源代码中看到的那样。虽然将针对所有排除筛选器检查类型,但单个匹配的包含筛选器足以使其出现在结果中。所以你肯定不想要任何其他潜在矛盾的包含过滤器。
因此,解决方案是使用构造函数newclasspathbeandefinitionscanner(bdr,false)
。
问题内容: 我正在开发一个应用程序(Quartz调度程序),其中有一个作业类负责实际执行工作,我们需要在Quartz调度程序中创建触发器时告知/传递作业类的名称。 我想为所有想使用该API的人提供一个扩展点(除了我将作为API的一部分提供的一些通用作业之外)。这个想法是创建一个(标记)接口,如果有人想将其类声明为调度程序作业类,那么他们要做的就是(声明)实现该接口。 我不确定如何找到合约之后的类(
问题内容: 在Java中,当接口扩展另一个接口时: 为什么要实现其方法? 当接口不能包含方法主体时,如何实现其方法 当扩展另一个接口而不实现它时,如何实现这些方法? 接口实现另一个接口的目的是什么? 这是Java的主要概念! 编辑: 在eclipse中,除了中的实现方法之外,还有实现符号。 当我将鼠标悬停在它上面时,它表示它实现了该方法!!! 问题答案: 为什么要实现其方法?当接口不能包含方法主体
问题内容: 我尝试使用Java ServiceLoader查找实现特定接口的所有类,如下所示: 不幸的是,当我在调试模式下运行Eclipse时,ServiceLoader找不到任何类。我觉得我错过了一个琐碎的事情… 问题答案: 无法做到。 为了将类公开为可以被发现的服务,您需要将其名称放入提供程序配置文件中,如使用Java平台创建可扩展应用程序中所述 。 没有内置的方法可以找到实现特定接口的所有类
问题内容: 前一段时间,我遇到了一段代码,该代码使用了一些标准Java功能来定位实现给定接口的类。我知道这些函数隐藏在某些非逻辑的位置,但是由于包名称暗含,它们可以用于其他类。那时我不需要它,所以我忘记了它,但是现在我需要了,而且似乎无法再次找到这些函数。在哪里可以找到这些功能? 编辑:我不是在寻找任何IDE函数或任何东西,而是可以在Java应用程序中执行的东西。 问题答案: 不久前,我整理了一个
但是现在,我希望这些接口实现也可用于扩展,例如。 我如何设置我的课程来实现这一点?(或者,反对这样做的固有缺陷或代码气味是什么?)
我有个Z接口。它是由Y类实现的。我有另一个继承类Y的类x。因为y实现了类z指定的契约,所以x做同样的事情,因为它扩展了类y。因此,它是否也应该实现接口Z?