2018-05-28 19:44
@JFinal 搜嘎,没注意看Tx的代码。如果是这样的话,常见需求确实满足了。题外话,spring的事务传播默认也是这种处理的,只是也可以支持其它的,一般也不用配置。事务注解与Before 注解一样,都是指明一个事务管理器就Ok了。
2018-01-30 11:28
@JFinal
model如下:
public class Project extends BaseProject {
public static final Project dao = new Project();
}
service如下:
public class UserProjectService {
private static final Project dao = Project.dao;
public static List findAll(int accountId) {
return dao.find("select * from project where accountId=? order by createAt desc", accountId);
}
}
上述把dao实例化放到了model中,把service的查询方法变成静态化,减少了controller层或者其他service关于UserProjectService的对象引用。
model中关于静态化的部分也类似于上述中findAll方法,把类似的数据库查询方法变成静态方法。
==================================================
不过我也基本想明白了,静态化的主要问题其实是AOP这类的代理没法做。一旦静态化了,后期想再duang一下都做不到了。也算是一个提前设计吧。不过是否可以考虑在model中增加这类的静态化方法,对不需要AOP的场景(大部分)可以更好地使用。
2018-01-30 11:17
@lyh061619 时间匆忙就写得不是太明白,但我觉得提问的内容还不至于那么不清楚,“一个model从业务上来说一般只对应一套数据库的配置”,注意下“一个model”,应该就不会理解成多数据源配置。我觉得很多时候这种问题的产生是因为答题者会不自觉有一种“居高”的思想在里面,不是为了说你,也不是为了吵架,如果你觉得我说的不对,或者太过了,我先向你道歉,毕竟我真不是来吵架的。
关于5,我是觉得你又开始提一些理念,理念有几年经验都会或多或少了解一些,而我的问题、我的回复你也没有仔细读,直接就上理念,所以说你提的虚,没有解决问题。你最开始的回复提到每个service都实例化dao对代码重构有好处,我的回复是在service中不需要每次都实例化dao,把dao的实例化工作放到model中,在service中添加dao的引用。跟每个service实例化dao的区别就是引用变少了而已。像波总回复的内容“dao 这个对象,每一个 service 单独持有一个对象,并不会造成多少浪费,因为 service 也是建议搞成共享的,这样 service 对象在项目中的个数也是极少的”,虽然我觉得能提高一点算点,不太赞同波总的观点。
最后,我觉得每个回答者都应该尽量努力的去理解提问者的问题,努力去回答最好。如果回答不够清楚,只能扯到编程理念或者类似于php是最好的语言这种问题上,要么真能把编程理念讲清楚,要么就不要回答误导新人。
最后的最后,还是感谢你的热心,我也来句虚的,开源的路不容易,感谢有你这样的热心者。
2018-01-25 18:36
@JFinal 嗯嗯,也可以。接管的位置不一样而已,spring session的设计在容器中接管,使用范围更大,非jfinal的也可以用,handler的设计也可以,只是只能在jfinal中使用。为了更好的推广jf,我觉得搞一个在容器中使用,替换spring session,更优雅、更方便、更简洁的jfinal-session会更好些。O(∩_∩)O哈哈~
2018-01-25 18:32
@JJfinal 这个其实就是登陆后把登陆信息放到数据库,set cookie,在来个拦截器,读cookie,恢复登录信息,更新库session的超时。登出删库。在来个定时任务,超时删库。
2018-01-25 18:26
@JFinal 再补充下,静态化的前提是没有aop。在需要AOP的情况下,确实还是得实例化。但club中的service、dao貌似也没有AOP吧?可能是club的版本太老了。。。
2018-01-25 18:18
@JFinal 1. model中数据库配置是通过config来找的,如果变成静态的,可以提供带configname的重载方法来实现。
2. 我考虑的是一个model一般只有一个数据源,不是整个项目中多数据源的问题。
3. 我明白不在model中public static dao的设计,但我不是要让dao这个对象变成static,而是让相关的查询方法,比如findById这种。
4. service其实也可以纯静态化啊~毕竟没有全局状态变量。。。
5. 同意非充血,不要接口、抽象类、model只放数据、业务放service等观点。
2018-01-25 18:12
@lyh061619 1. 不实例化只要没有使用非实例化变量,就不会存在线程安全问题。
2. 没有说不存在多数据源的情况,而是说一个model一般不会对应多个数据源。
3. 不是说new创建实例的性能问题,而是说在减少实例化对象的问题。
4. 随便找了UserShareService的代码,private final Share dao = new Share().dao(); 这明明是在new对象,一个service new一个dao对象,而不是你所说的静态变量。
5. 你这个就有点太虚了,我提的是不要每个service都单独在new,而是把new放到model里面,并静态化,在service里面一样可以声明不同的dao变量,但最后指向的是静态化的dao对象,也就是你4中想的那样。当然,我觉得service其实也没必要搞成实例化的,原因是其并没有使用全局变量啊~
2018-01-25 11:18
@JFinal 一般都是用的上层的接口,spring session的处理方式可以把原来的session接管,这种接管是开发无感知的,对于原来的代码不需要做任何修改。
2017-12-21 09:23
@JFinal 可以搞一搞类似于spring session的东西,我觉得很多人主要卡在怎么用自己的方式接管session上面。当然你club的处理方式也可以,但对原来基于httpsession的项目改动还是不小的