近期重构项目的时候,不可避免的修改了包名,出现了服务无法注册,函数没有加载等问题。溯其根源是这些扫描注册的模块直接引用了类的字符串的硬编码,编译期无法检测出来。
1)粗心设计,没考虑修改时引起的不便; 2)模块结构不规范,需要引用的类不在自己的依赖范围; 例如模块B,C是平行关系,互相不依赖。此时如果B要应用C中的某个类,则只能通过字符串来引用才能避免编译器报错。 本情况需要考虑把B依赖的部分,抽到公共模块,被B,C共享。
A / / B C 复制代码
1)示例一:设计欠考虑 注解Service第二个参数使用字符串来指定类。
@XStreamAlias("jsf") @Service(type = "jsf", provider = "com.jd.edi.service.provider.JsfServiceProvider") @Node(name = "jsfService", desc = "JSF服务", isStart = true) public class JSfProviderConf extends AbstractProviderConfig { ... } 复制代码
@XStreamAlias("jsf") @Service(type = "jsf", provider = JsfServiceProvider.class) @Node(name = "jsfService", desc = "JSF服务", isStart = true) public class JSfProviderConf extends AbstractProviderConfig { ... } 复制代码
2)示例二:模块结构不合理 依赖了不在依赖范围的包
JarScanUtil.scan("com.jd.edi.function"); 复制代码
JarScanUtil.scan(CommonFunction.class.getPackage().getName()); 复制代码