我需要找到类,只实现我的春季启动应用程序中的一个特定的接口。 我面临的问题是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已被注释掉其顺序也发生了改变
为什么你需要这个?从OO的角度来看,他们都实现了接口,如果你不想这样做,那么不要让其他接口首先扩展接口...... –
创建一个空接口OnlyA extends A {}'并实现它在感兴趣的bean中,然后扫描'OnlyA'而不是'A'。 –
@M。 Deinum以及我已经与模板pattenr一起使用了策略模式,以便在我的应用中实现服务模型。这为我节省了大量的输入,但现在我需要找到一个特定的界面,因为它们都相互延伸。基本上这就是你为什么需要这个问题的答案。我希望我能以特定的方式构建TypeFilter,这将使我只获得一个界面。 – Tito