问题三:对 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(); }
以上介绍的方式中,有几个关键点: 1:去掉 Account 这些个 model 中的 public Account dao 对象创建,首先是避免有人误用,引发线程安全问题,其次是在强调所有数据库操作放在业务中,而不是张口就来写 sql, Account.dao.find(sql) 这种代码永远不要出现,而是要先在 service 层中创建一个方法,在此方法中 dao.find(sql),别处需要使用的就转调这个业务方法
有了 AOP,spring 才方便去实现声明式事务、权限管理等等功能,所以 IOC 在本质上是为了实现 AOP
而 jfinal 天然支持 AOP,并且不需要 IOC 配合使用,所以不建议使用 IOC。引入 IOC 势必要对依赖和注入进行配置,通常是通过 xml 或注解进行配置,这种搞法会让你的整个系统充满足依赖关系的配置与管理,对真正的业务开发带来极大的噪音