当前位置: 首页 > 知识库问答 >
问题:

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

梁丘高朗
2023-03-14

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

共有1个答案

阎裕
2023-03-14

CDFGHIJ都不能分配给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?