我需要找到在我的 Spring Boot 应用程序中仅实现一个特定接口(interface)的类。 我面临的问题是 ClassPathBeanDefinitionScanner 返回的类也实现了“扩展”子接口(interface)。
示例:
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 等。
如何以仅返回仅实现指定接口(interface)的选定类的方式构造我的 TypeFitler,即过滤掉应用扩展接口(interface)的所有实现。例如除 E 类以外的 B 类。
按照用户 @Holger 的建议,将 ClassPathBeanDefinitionScanner 的默认构造函数更改为 ClassPathBeanDefinitionScanner(bdr, false) 后,以下代码适用于我。
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
的子类型,因此一个简单的包含过滤器 newAssignableTypeFilter(E.class)
应该可以完成这项工作。
您的问题源于使用 new ClassPathBeanDefinitionScanner(bdr)
构造函数,该构造函数将使用默认过滤器初始化扫描仪,如您所见 in the source code 。虽然将根据所有排除过滤器检查类型,但单个匹配的包含过滤器足以使其出现在结果中。因此,您肯定不需要任何其他可能相互矛盾的包含过滤器。
因此解决方案是使用构造函数 new ClassPathBeanDefinitionScanner(bdr, false)
来代替。
关于java - 使用 Spring 框架查找实现特定接口(interface)但排除扩展接口(interface)子实现的单个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36307615/