2020-09-26 18:52
@锅包肉 应该是你的某个依赖间接依赖了 jfinal 2.1
可能是 jfinal-ext 这个项目, 这个项目后来出了 jfinal-ext2,尝试升级到这个高版本
2020-09-26 15:30
@李通 JDK 动态代理必须要求被代理的目标实现接口,这个就极大限制了可代理的范围,所在 JDK 代理其实并没有多少意义
你说的很对,生成 java 代码可读性很好,出问题容易排错,而如果用 asm 操作字节码,出问题就不容易排查,字节码的可读性跟汇编语言是同一层次的
2020-09-26 10:39
@李通 常规方法是通过 asm 或 cglib 做节码增强,其中 asm 方案可读性很差,而 cglib 增加了一个第三方依赖
jfinal 在 4.0 版本时去除了唯一的第三方依赖 cglib,采用了动态编译方案。该方案我从没在别的地方看到过,属于 jfinal 独创
不仅如此,该方案还与控制层的 AOP 使用了同一个 Interceptor + Invocation 结构,代码其实很优雅,注意看一下控制层的 AOP 没采用动态编译也没采用 cglib,而是采用的 actionKey 与 Action 映射的方式实现的
2020-09-26 01:03
@李通 这部分代码很少,主要流程就是:
1:ProxyGenerator 生成被代理类的子类,覆盖子类的被代理方法,生成的模板如下:
https://gitee.com/jfinal/jfinal/blob/master/src/main/java/com/jfinal/proxy/proxy_class_template.jf
看懂生成的 java 文件就能明白为啥可以实现 AOP 功能
2:生成 .java 文件以后,再使用 ProxyCompiler 编译成 .class 文件
3:使用 ProxyClassLoader 加载编译好的 .class 文件。使用 ProxyClassLoader 加载的类时,会用上其 AOP 相关功能
最好的办法是通过单步调试源码了解运行原理,代码不多,只有 600 多行,一会就看完了
2020-09-24 22:12
@jfinal爱好者22 导致的原因得面向 GSON 去了解,对于使用者来说 LinkedTreeMap 也是 Map 的一种实现,不影响使用
2020-09-24 22:10
博主的分析十分深入,值得学习
jfinal AOP 与 spring AOP 最大不同在于 jfinal 是极简设计,用户只需要学习三个核心概念:Interceptor、Before、Clear,这让学习成本低到极致
而 spring AOP 的概念一大堆,例如:Aspect、Advice、Joinpoint、Poincut、Introduction、Weaving、Around等等,并且需要引入IOC容器并配合大量的XML或者annotation来进行组件装配。概念太多让学习成本急剧上升,开发时头脑的负荷加重,认知成本很高,相应的开发效率也会降低
除了极简设计、学习成本低以外,jfinal AOP 的另一特色是采用动态编译方式实现 proxy, 在 java 界绝无仅有
同时还支持 cglib 进行增强模式实现,目的是为了支持 JRE 环境没有动态编译支持的场景
2020-09-24 18:00
undertow 不支持 jsp, 改用 jetty-server 就可以了:
https://jfinal.com/doc/1-6
@lyh061619 @天朝子民 这里使用的是 renderJsp(...) , 所以是明确了模板类型为 JSP 的, 这种情况无需配置 viewType, viewType 仅仅是针对 render(String) 方法,并不针对 renderXxx(...) 方法