2016-03-30 45 views
2

我需要找到类,只实现我的春季启动应用程序中的一个特定的接口。 我面临的问题是ClassPathBeanDefinitionScanner正在返回实现“扩展”子接口的类。查找单个类实现特定的接口,但排除扩展的接口子实现与Spring框架

实施例:

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); 
     } 

现在的结果是,阵列字符串“豆”包含所有其它类,如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已被注释掉其顺序也发生了改变

+2

为什么你需要这个?从OO的角度来看,他们都实现了接口,如果你不想这样做,那么不要让其他接口首先扩展接口...... –

+0

创建一个空接口OnlyA extends A {}'并实现它在感兴趣的bean中,然后扫描'OnlyA'而不是'A'。 –

+0

@M。 Deinum以及我已经与模板pattenr一起使用了策略模式,以便在我的应用中实现服务模型。这为我节省了大量的输入,但现在我需要找到一个特定的界面,因为它们都相互延伸。基本上这就是你为什么需要这个问题的答案。我希望我能以特定的方式构建TypeFilter,这将使我只获得一个界面。 – Tito

回答

2

无类型CDFGHI的,J是分配给E因为他们不是E的子类型,所以简单的包含过滤器new AssignableTypeFilter(E.class)应该完成这项工作。

您的问题源于使用new ClassPathBeanDefinitionScanner(bdr)构造函数,它将使用默认过滤器初始化扫描仪,您可以看到in the source code。虽然将针对所有排除过滤器检查类型,但单个匹配的包含过滤器足以使其显示在结果中。所以你肯定不希望任何其他的,可能矛盾的包含过滤器。

所以解决方法是使用构造函数new ClassPathBeanDefinitionScanner(bdr, false)来代替。