论坛首页 Java企业应用论坛

简单,易于Mock,仅依赖Spring的Domain Model

浏览 31108 次
该帖已经被评为精华帖
作者 正文
   发表时间:2008-05-16  
jianfeng008cn 写道
Norther 写道
谢谢楼上同学的纠正,这个当然算静态property注入,但是,在bean的初始化的时候,每个bean初始化的时间是不确定的,仅spring管理的bean有依赖初始化的关系,而我们的domain model是class级别的注入,这个依赖关系,spring无法知道,而只有在这个MethodInvokingFactoryBean被spring初始化的时候才去注入,有可能这个时候,其他调用Domain Object的quartz的job已经再开始跑了,但是他们去执行一些domain object的方法时,他们都还没有被注入,所以必须要要在所有的bean初始化之前去注入,才能保证所有的spring管理的bean去调用domain object时,他们都是被注入过的。


既然你的调用是有依赖的 用spring配置了这些有依赖关系的bean 那么初始化的时候也肯定会根据这个关系生成实例,怎么会和你说的这样呢? 比方说 a 依赖于b 在实例化a的时候 发现b还没有实例化 那肯定会先去实例化b啊,即使lazy了 哪么用的时候肯定要实例化了吧


那肯定了,这是没办法的,用到的那些DAO等于都先初始化了。

在Spring中,你getBean("a"), 他会初始化a,如果a依赖b,spring就会初始化b,很明确。
但是这种情况下,你初始化一个quartz的任务,开始跑,他里面没有依赖a,只是他里面操作的领域模型Student,依赖a了,还是static的,Student不是被spring管理的,spring不会知道这个关系,它不会注入,也不会初始化a(如果他是lazy的)。
0 请登录后投票
   发表时间:2008-05-16  
jianfeng008cn 写道
static的话 数据库连接限制很大吧 针对同一个domain只能有一个db session了吧?

数据库没有任何问题,拿hibernate来说, 现在dao的session都是从TheadLocal去拿的,无所谓你的dao static不static,反正都是singleton的,没任何影响。
0 请登录后投票
   发表时间:2008-05-16  
static,这个妥协牺牲的也太巨大了。我宁愿让定义一个SessionHolder的接口。外部用ThreadLocal还是其它实现注入给domain都好。然后,domain里需要那个dao实现就自己new,如下:
public List findMyGirls(){
   MyGirlDAO myGirlDAO = new MyGirlDAO(session)
   myGirlDAO.find。。。
}
达到dao逻辑重用的目的
0 请登录后投票
   发表时间:2008-05-16  
nihongye 写道
static,这个妥协牺牲的也太巨大了。我宁愿让定义一个SessionHolder的接口。外部用ThreadLocal还是其它实现注入给domain都好。然后,domain里需要那个dao实现就自己new,如下:
public List findMyGirls(){
   MyGirlDAO myGirlDAO = new MyGirlDAO(session)
   myGirlDAO.find。。。
}
达到dao逻辑重用的目的



请问static有什么代价?代价大在哪?你这个方式就是我所说的第一种方式,无法单元测试。
0 请登录后投票
   发表时间:2008-05-17  
单元测试当然可以,不过没法mock dao接口,的确也不怎么好。
因为事实上,一个方法,我们还是可以将它分解,比如,准备数据那个阶段不管它,逻辑处理密集部分用另一protect方法,然后对逻辑密集部分进行单元测试。
我说不上静态有什么不好,纯属个人口味,因为我感觉它污染所有的实例。


0 请登录后投票
   发表时间:2008-05-17  
唉。要是有state monad该多好啊。不就是一个状态又不要显式传递,又要能够测试么?

static? gulp!

还有那个static setter都不考虑线程安全的?
0 请登录后投票
   发表时间:2008-05-17  
nihongye 写道
单元测试当然可以,不过没法mock dao接口,的确也不怎么好。
因为事实上,一个方法,我们还是可以将它分解,比如,准备数据那个阶段不管它,逻辑处理密集部分用另一protect方法,然后对逻辑密集部分进行单元测试。
我说不上静态有什么不好,纯属个人口味,因为我感觉它污染所有的实例。




感觉不好,这个。。。确实没什么办法,呵呵。
0 请登录后投票
   发表时间:2008-05-17  
ajoo 写道
唉。要是有state monad该多好啊。不就是一个状态又不要显式传递,又要能够测试么?

static? gulp!

还有那个static setter都不考虑线程安全的?



不知道这位大侠看完我的帖子了吗?那个注入的动作整个应用只有一次,就是在所有BEAN初始化之前,注入的都是singleton,何来线程不安全?
0 请登录后投票
   发表时间:2008-05-17  
没,没看完。这都叫你看出来了?完了,没的混了!

那啥,俺投降了。static呀,挺好的,又容易测试,代码又漂亮,写着舒服,还容易懂,简直就是天才的创意呀!俺咋就想不到呢?唉,人和人就是不能比呀!佩服!
0 请登录后投票
   发表时间:2008-05-17  
ajoo 写道
没,没看完。这都叫你看出来了?完了,没的混了!

那啥,俺投降了。static呀,挺好的,又容易测试,代码又漂亮,写着舒服,还容易懂,简直就是天才的创意呀!俺咋就想不到呢?唉,人和人就是不能比呀!佩服!


大侠。。别这样。。我很怕的。。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics