AopFactory.addSingletonObject()建议

这个方法将实例放进singletonCache时,仅仅对这个实例本身的class进行了处理,建议将实例所在对象声明的接口也放进去:

Class<?>[] interfaces = singletonObject.getClass().getInterfaces(); 

if (interfaces != null && interfaces.length > 0) { 

    for (Class<?> intf : interfaces) { 

        singletonCache.putIfAbsent(intf, singletonObject);

    } 

}

否则,假设某对象HelloServiceImpl implements HelloService, 

即使现有实例放进了AopFactory

AopManager.me().addSingletonObject(new HelloServiceImpl());

在使用的时候

HelloService service = Aop.get(HelloService.class);

这个service并没有拿到之前放进去的那个HelloServiceImpl的实例,与面向接口编程,使用方不需要知道并非必要的实现信息有悖.

评论区

registernet

2019-11-17 21:35

如果某个接口有两个实现,要切换一个实现的时候,现有的方案就必须要更改两个地方,一个是调用的地方,要知道具体的实现类(不方便通过配置指定),另一个地方是配置的时候注入的地方(这个地方非常方便通过配置指定,既然可以通过配置指定,那么可以在不改代码不重新编译的情况下实现切换)

JFinal

2019-11-17 23:40

@registernet 这个反馈很重要,以往的 addSingletonObject 未考虑抽象类、接口这类情况下的映射,刚刚已经提交了最新代码:
https://gitee.com/jfinal/jfinal/commit/e7efc88a2bfbe17f5df0f520e8ef90b59394fb9f

这里没有完全按照你的建议来改进,而是添加了如下方法:
addSingletonObject(Class type, Object singletonObject)

是因为通过 Class[] interfaces = singletonObject.getClass().getInterfaces() 这种方式来添加映射所决定的映射关系并不一定是用户所需要的,某个接口、抽象类的实现类可以有多个,让用户自行决定怎么来映射最妥当

谢谢反馈

JFinal

2019-11-17 23:41

可以通过如下命令行试用最新版本:
git clone git@gitee.com:jfinal/jfinal.git
cd jfinal
mvn clean install
修改项目 pom.xml 中的 jfinal 依赖版本号为 4.8 即可使用 4.8 版本

registernet

2019-11-19 08:39

这个方案更合理,非常感谢

JFinal

2019-11-19 11:42

@registernet 谢谢你的建议 ^_^

热门反馈

扫码入社