java - 使用 Spring 框架查找实现特定接口(interface)但排除扩展接口(interface)子实现的单个类

标签 java spring spring-boot java-8

我需要找到在我的 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 已被注释掉,并且其顺序也已更改

最佳答案

没有任何类型CDFGH >、IJ 可分配给 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/

相关文章:

java - 游程编码程序问题

java - 使用流通过 Spring MVC Controller 下载文件

java - 未触发上传进度监听器(Google Drive API)

java - Spring SseEmitter.complete() 是否应该触发 EventSource 重新连接 - 如何关闭服务器端连接

java - 为什么 .and().httpBasic();不适用于 WebSecurityConfigurerAdapter

java - Spring Boot WebSocket - 将正文添加到 CONNECT 响应

java - 数组访问复杂度

java - Spring:根据配置文件选择@Service

java - 响应式 Spring Boot API 封装 Elasticsearch 的异步批量索引

spring boot - 计算字段