实际开发中推荐单独使用JFinal还是结合IOC容器使用?

实际开发中推荐单独使用JFinal还是结合IOC容器使用呢?最近公司有意向使用JFinal开发新项目,目前还在探索阶段,因为已经使用了很久的Spring,很可能是思维被禁锢了,一直纠结或者说是不太清楚JFinal在项目中应该放在什么位置,是否需要配合IOC容器使用呢?

评论区

JFinal

2016-10-18 00:11

spring 引入 IOC是为了接管对象创建,进而可以在创建对象时注入其依赖的其它对象,进而在注入代理类来代理这些类的行为,再进而实现 AOP

有了 AOP,spring 才方便去实现声明式事务、权限管理等等功能,所以 IOC 在本质上是为了实现 AOP

而 jfinal 天然支持 AOP,并且不需要 IOC 配合使用,所以不建议使用 IOC。引入 IOC 势必要对依赖和注入进行配置,通常是通过 xml 或注解进行配置,这种搞法会让你的整个系统充满足依赖关系的配置与管理,对真正的业务开发带来极大的噪音

HIddenLynx

2016-10-18 10:57

@JFinal 波总好,我昨天学习了JFinal框架觉得很轻便,确实减少了不少代码量,使用起来也很简洁,感觉JFinal确实是不错的框架。在这里还是有几个问题想跟您咨询一下:

问题1:

我们现在的核心问题就是想提高开发速度和效率,用尽可能少量,简单的代码完成功能。现在我们面临技术选型问题,目前为止我们考虑了几种方案,
1.JFinal
2.Filter (路由控制) + Servlet(处理请求) + jdbc (操作数据库)
3.SpringMVC + jdbc
4.SpringMVC + Mybatis
我们现在想咨询您JFinal与后面这三种方案比较它的明显优势在哪里?

问题2:

如果我们需要类似工作流的东西,如何集成第三方工作流框架,或者是我们自己编码实现,JFinal更推荐那种方式?

问题3:

如果在业务比较复杂的情况下是否需要我们再定义Service层,如果定义了,那么将Service提供给Controller的最佳实践是如何去做(我参考了网上别人用JFinal写的代码看到这种做法 :private TestService s = enhance(TestService.class);)?

JFinal

2016-10-18 11:27

问题一: jfinal 最核心的优势在于开发效率高、学习成本低、开发体验好、代码量少,并且 jfinal 的体量很小,只有一万行代码左右,核心代码只有 2000 行左右,所以可控性与扩展性极好。建议先试用一下,这样才有所体会

问题二:对工作流并没有多少经验,感觉上是建议自己写一个简单的,如果要集成的话,一定要选择简洁优雅的方案

问题三:对 jfinal 项目来说,业务层几乎是必须的,不带业务层的都是很小的项目应用场景,业务层做成无状态的,这样的话,内部可以持有一个全局变量,供所有地方直接使用,不用每次都创建 Service,以下是一个 AccountService 的示例:
public class AccountService {
// 全局共享的业务对象,但要保障无状态,这样才是线程安全的
public static final AccountService me = Enhancer.enhance(AccountService.class);
// dao 对象只让本业务使用,其它要用它的地方统统在业务层创建方法来转调
private final Account dao = new Account();

@Before(Tx.class)
public class doIt() {
....
}
}

在Controller 中可以有两种对业务层的用法,以下是用法一:
public class AccountController {
private AccountService srv = AccoutService.me;
public void action() {
srv.doIt();
}

对于其它非 AccountController 以下是用法二:
public class OtherController {
public void action() {
// 直接使用 me 对象
AccountService.me.doIt();
}

JFinal

2016-10-18 11:32

以上介绍的方式中,有几个关键点:
1:去掉 Account 这些个 model 中的 public Account dao 对象创建,首先是避免有人误用,引发线程安全问题,其次是在强调所有数据库操作放在业务中,而不是张口就来写 sql, Account.dao.find(sql) 这种代码永远不要出现,而是要先在 service 层中创建一个方法,在此方法中 dao.find(sql),别处需要使用的就转调这个业务方法

2:dao 对象只存在于业务层,业务层以外永远不要出现数据库查询这样的代码,让业务层承载所有的数据库查询,当某个数据库查询的功能还没有的时候,就在相应的 Serivce 业中创建一个,如果没有合适的 serivce 类,则创建一个

养成好的业务层构建习惯,用上三天,就会知道这样做的巨大好处

山东小木

2016-10-22 12:13

单独使用jfinal足矣

极客

2017-08-04 09:15

@JFinal 也就是说网上有一些人提到的,在controler中注入service
public abstract class Controller extends com.jfinal.core.Controller {
public Controller(){
Field[] fields =this.getClass().getDeclaredFields();
for (int i=0;i < fields.length; i++){
Field field = fields[i];
Class clazz = field.getType();
if(Service.class.isAssignableFrom(clazz) && clazz != Service.class){
try {
field.set(this, Service.getInstance(clazz, this));
} catch (IllegalAccessException e) {
Log.e(e);
}
}
}
}
},实际是不应该这么做的,而是应该
在controler中private AccountService srv = AccoutService.me;
是吗?

JFinal

2017-08-04 11:52

@极客 spring 的依赖注入是为了植入代理类,从而实现 aop 这样的功能,而 jfinal 可以在 controller 层以及 service 层实现 aop,所以就没有必要使用注入了,这是一个观念的转变,需要点适应的时间

热门反馈

扫码入社