1. 背景
近期重构项目的时候,不可避免的修改了包名,出现了服务无法注册,函数没有加载等问题。溯其根源是这些扫描注册的模块直接引用了类的字符串的硬编码,编译期无法检测出来。
2. 直接字符串引用包名/类名的缺陷
- 修改包名/类名时,IDE无法找出字符串引用并修改;
- 修改包名/类名后,相关的错误无法通过编译检测出来;
3. 原因
1)粗心设计,没考虑修改时引起的不便; 2)模块结构不规范,需要引用的类不在自己的依赖范围; 例如模块B,C是平行关系,互相不依赖。此时如果B要应用C中的某个类,则只能通过字符串来引用才能避免编译器报错。 本情况需要考虑把B依赖的部分,抽到公共模块,被B,C共享。
A
/ \
B C
复制代码
4. 科学引用类名/包名
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 {
...
}
复制代码
- 修正代码 把Service的第二个参数修改为Class类型。
@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());
复制代码