论坛首页 Java企业应用论坛

在Spring中DAO与Service关于依赖注入写法探讨

浏览 24218 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-12   最后修改:2008-12-15
在spring中配置事务的时候,可能会遇到两种情况,一种是针对DAO层的事务拦截,还有一种是针对Service的拦截,看论坛里其实比较多的人倾向与在service的拦截(DAO只是进行简单的CRUD操作,而Service根据业务规则来选取必要的DAO进行操作),现在要探讨的不是在哪个层面的优势在哪里,而是只是简单基于Service的探讨配置写法哪种:
方法一:
<bean id = "dao1" class = "com.test.Dao1" />
<bean id = "dao2" class = "com.test.Dao2" />
<bean id = "service1" class = "com.test.Service1">
   <property name="dao1" ref="dao1" />
   <property name="dao2" ref="dao2" />
</bean>
<bean id = "dao3" class = "com.test.Dao3" />
<bean id = "dao4" class = "com.test.Dao4" />
<bean id = "service3" class = "com.test.Service3">
   <property name="dao3" ref="dao3" />
   <property name="dao4" ref="dao4" />
</bean>
<bean id = "bizService" class = "com.test.BizService">
   <property name="dao1" ref="dao1" />
   <property name="dao2" ref="dao2" />
   <property name="dao3" ref="dao3" />
   <property name="dao4" ref="dao4" />
</bean>

方法二:
<bean id = "dao1" class = "com.test.Dao1" />
<bean id = "dao2" class = "com.test.Dao2" />
<bean id = "service1" class = "com.test.Service1">
   <property name="dao1" ref="dao1" />
   <property name="dao2" ref="dao2" />
</bean>
<bean id = "dao3" class = "com.test.Dao3" />
<bean id = "dao4" class = "com.test.Dao4" />
<bean id = "service3" class = "com.test.Service3">
   <property name="dao3" ref="dao3" />
   <property name="dao4" ref="dao4" />
</bean>
<bean id = "bizService" class = "com.test.BizService">
   <property name="service1" ref="service1" />
   <property name="service3" ref="service3" />
</bean>


大家觉得在写BizService的时候注入是用service的注入好呢还是用dao的注入好呢!一起谈谈你们的看法。
个人认为方法一调理比较清晰但较为繁琐,因为如果service1中有了业务逻辑可能到了bizService还要再写一遍,方法二比较简单但到了BizService的时候可能对DAO的调用概念有所模糊化了。对于数据库事务拦截问题,不知道这两种方法是否会有所区别?
   发表时间:2008-12-15   最后修改:2008-12-15
我倾向于第一种,原因是它比较清晰
吼吼,第一次沙发哦!
0 请登录后投票
   发表时间:2008-12-15  
俺也用第一种。可能应用还比较简单,没觉得不便。
0 请登录后投票
   发表时间:2008-12-15  
第二种,很显然,有些service是不需要dao的,而是组合其他service的功能,难道这个组合放action里面?
0 请登录后投票
   发表时间:2008-12-15   最后修改:2008-12-15
两种我都不同意

如果出现这种代码
  <bean id = "service3" class = "com.test.Service3"> 
   <property name="dao3" ref="dao3" /> 
   <property name="dao4" ref="dao4" />
<property name="dao5" ref="dao5" /> 
   <property name="dao6" ref="dao6" /> 
<property name="dao7" ref="dao7" /> 
   <property name="dao8" ref="dao8" />  
</bean> 
要多难看就有多难看!

个人认为 service层,不应该依赖IOC!
0 请登录后投票
   发表时间:2008-12-15  
service代码层面更多是过程代码,
因此不应该用IOC,直接用一个工厂类得了!


而IOC应该用到领域模型里面!
真正的面向对象!
0 请登录后投票
   发表时间:2008-12-15  
使用annotation吧!

@Component("aDao")
public ADaoHibernateImpl extends ADao...

public ADaoService{
   @Autowired
   public void setADao(Adao adao)...
}
0 请登录后投票
   发表时间:2008-12-17  
czx566的通过DAO注入DAO的写法其实很少,一般都是通过DAO注入到SERVICE进行业务逻辑操作。所以我个人比较倾向方法二。
0 请登录后投票
   发表时间:2008-12-17  
不明白楼上的话

反正我本人不支持service层用IOC

虽然有些偏执~

但我觉得程序员很多都有这毛病~
0 请登录后投票
   发表时间:2008-12-17  
我是用第1种方法,但配置明显复杂了,用byName或annotation自动注入的写法,如果已经有service中的方法包含了复杂的业务逻辑写法,而其它service也会用到的话,抽取出来,变成公用的方法,反正尽量减少重复的代码
0 请登录后投票
论坛首页 Java企业应用版

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