论坛首页 Java企业应用论坛

矛盾:充血的领域模型和Web服务器装载的spring context

浏览 12783 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-05  
情况是这样的:

1 一个架构为struts2,spring,hibernate的web应用。
2 采用充血的领域模型,即领域bean里含有一些简单的业务逻辑,例如CRUD之类的操作。这些操作需要hibernate的session factory以便访问数据库。
3 Spring中定义了session factory,因此可以将它注入任何需要的地方。同样也可以注入领域bean和service类中。

但问题是领域bean因为比较小(其实也不小,如果充血的话),一般用new的方式生成,因此无法从Spring中获得session factory。像service类比较大,一般是从Spring中获得实例,因此注入了session factory,没有问题。

如果是失血模型的话,领域类里只有getter 和setter方法,因此不存在注入session factory的问题。

当然我也可以用BeanFactory.getBean("beanName")的方式获得session factory,但这样就不够好看了,出现了applicationContext和BeanFactory并存的局面,感觉不优雅( 我现在的Spring是通过web.xml在Web服务器启动时载入的,因此是application context)。

难道大家不用充血模型?

在Spring reference的3.9. Glue code and the evil singleton中,似乎有些提示,但不怎么明白。
   发表时间:2009-01-05  
new了以后,你往领域bean里set一下DAO,或者直接new的时候构造,不就搞定了?
不过我对领域bean里注入session factory还是持否定的看法。
充血不是就说要用session factory去访问数据库
0 请登录后投票
   发表时间:2009-01-05  
嗯。我说的往领域bean里注入session factory实际上是DAO,呵呵。

但是DAO同session factory一样,也是在application context里声明的,对他的引用只能是声明式的注入,无法在创建新领域bean的时候用代码显示的获得对DAO引用,这正是我面临的问题。

也可以这么说,如何在通过Web容器启动了application context后,在代码里取得对这个application context的引用?就像这样:
  DomainBean myBean = applicationContext.getBean("domainBean");
0 请登录后投票
   发表时间:2009-01-05  
我这么理解的你问题

你目前在三层都用到了依赖注入,按照以往的惯例是:
    你的访问发起调用,action 对象由 容器生成,同时在action中应该
同时注入你action依赖的各个领域对象。

但你不想这么实现,你想action的对象依然由容器生成,但action和领域模型之间的关系由factory生成 或则new 生成?



0 请登录后投票
   发表时间:2009-01-05  
有持久化就不能做单体测试了么?


我不这么认为


0 请登录后投票
   发表时间:2009-01-05  
的确,加了,测试要较复杂一些~

但更加oo

呵呵

凡事都有得有失~
0 请登录后投票
   发表时间:2009-01-05  
nfxu 写道
嗯。我说的往领域bean里注入session factory实际上是DAO,呵呵。

但是DAO同session factory一样,也是在application context里声明的,对他的引用只能是声明式的注入,无法在创建新领域bean的时候用代码显示的获得对DAO引用,这正是我面临的问题。

也可以这么说,如何在通过Web容器启动了application context后,在代码里取得对这个application context的引用?就像这样:
  DomainBean myBean = applicationContext.getBean("domainBean");

你要真是这么显式的引用,那你干脆new吧,spring也不需要了。没有意义
0 请登录后投票
   发表时间:2009-01-05  
czx566 写道
我这么理解的你问题

你目前在三层都用到了依赖注入,按照以往的惯例是:
    你的访问发起调用,action 对象由 容器生成,同时在action中应该
同时注入你action依赖的各个领域对象。

但你不想这么实现,你想action的对象依然由容器生成,但action和领域模型之间的关系由factory生成 或则new 生成?





我觉得这不是我能选择的,我没有别的选择。

目前action的对象是由Spring的application context生成的,这个application context是通过Web服务器里的web.xml在服务器启动时装载进入系统的。也就是说,struts2和Spring集成在了一起。

其他的层,例如service,也是通过application context注入到action里的。因为action由application context来管理,所以没有问题。

但现在领域Bean不好由application context来管理,因为不像service一样可以是单体,相反,要由service里的业务逻辑来灵活管理领域Bean的生命周期,也就是说,我觉得在业务逻辑里new各种领域Bean更为自然。

同时,我愿意在领域Bean里加入对数据库的访问以实现CRUD等操作,所以需要在领域Bean里注入DAO。

但现在领域Bean不归application context管理,如何注入由application context管理的DAO?DAO就像service、session factory一样,是单体,可以被application context管理。

0 请登录后投票
   发表时间:2009-01-05  
我想我和你一样思考过这个问题

如果愿意,你可以看看我博客的第3篇文章。


IOC有设计边界的~

0 请登录后投票
   发表时间:2009-01-05  
spyker 写道
我觉得你充血模型这块设置的有问题
从测试角度来说
这一块处理的一些业务应该不涉及到持久层这一块的

我觉得这一块应该是简单的一些逻辑处理
不引入其他层的对象

可以做单体测试的


嗯,我不会做单体测试,呵呵  

所以也不怎么往这方面想。但我的主要原则是:处理相同对象的逻辑要集中,关系相近,处理方式相近的逻辑要集中。尽量复用代码,尽量封装代码。在这种原则下,我觉得往领域Bean里放CRUD的数据库操作是我目前能想到的比较好的封装的方法,要不CRUD处理往哪里放?
0 请登录后投票
论坛首页 Java企业应用版

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