我没有找到任何东西就搜索过这样的问题,所以我走了.
我有一个多模块maven项目.多个模块都继承相同的父模块,其中定义了公共依赖项.其中,有一个我自己的模块,一个'通用'模块,其中实现了一些常用功能.
我的问题是:对于公共依赖项,什么是更好的做法:在父级中明确地定义它们,就像我现在一样?或者在"公共"模块中定义它们,其他模块引用它们,然后依赖于传递性(如公共依赖项的单入口点)?
我需要做一些处理来确定JSR-330带注释类的依赖关系,使用反射.
我完全了解所有符合JSR-330标准的IoC容器,如Spring,Guice或PicoContainer.但是,我需要的不是解决和注入依赖关系,而是要识别它们.
这基本上意味着我需要实现JSR-330实现,至少在涉及反射类"解析"时.
JSR-330规范的一部分我觉得实现起来有点麻烦:
使用@Inject注释的方法将覆盖使用@Inject注释的另一个方法,每个实例的每个注入请求只会注入一次.不会注入没有@Inject批注的方法,该方法将覆盖使用@Inject注释的方法.
这意味着子类可以重新定义其基类的自动装配合同,以及挂钩注入流(通过多态).
我的问题出现了:给定一个类层次结构,是否有一种简单的方法可以检查层次结构中某个部分的方法是否在层次结构的下方被覆盖?
在我的例子中,我最简单的方法是从层次结构的叶子中递归:
private List<Method> getInjectableMethods(final Class<?> clazz) {
// recursive stop condition
if(clazz == null) {
return emptyList();
}
// recursively get injectable methods from superclass
final List<Method> allInjectableMethods = newLinkedList(getInjectableMethods(clazz.getSuperclass()));
final List<Method> injectableMethods = newArrayList();
// any overridden method will be present in the final list only if it is injectable in clazz
for (final Method method : clazz.getDeclaredMethods()) {
removeIf(allInjectableMethods, Methods.Predicates.overriddenBy(method));
if (isInjectable(method)) {
injectableMethods.add(method);
}
}
allInjectableMethods.addAll(injectableMethods);
return allInjectableMethods;
} …Run Code Online (Sandbox Code Playgroud)