精华帖 (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中,似乎有些提示,但不怎么明白。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-01-05
new了以后,你往领域bean里set一下DAO,或者直接new的时候构造,不就搞定了?
不过我对领域bean里注入session factory还是持否定的看法。 充血不是就说要用session factory去访问数据库 |
|
返回顶楼 | |
发表时间:2009-01-05
嗯。我说的往领域bean里注入session factory实际上是DAO,呵呵。
但是DAO同session factory一样,也是在application context里声明的,对他的引用只能是声明式的注入,无法在创建新领域bean的时候用代码显示的获得对DAO引用,这正是我面临的问题。 也可以这么说,如何在通过Web容器启动了application context后,在代码里取得对这个application context的引用?就像这样: DomainBean myBean = applicationContext.getBean("domainBean"); |
|
返回顶楼 | |
发表时间:2009-01-05
我这么理解的你问题
你目前在三层都用到了依赖注入,按照以往的惯例是: 你的访问发起调用,action 对象由 容器生成,同时在action中应该 同时注入你action依赖的各个领域对象。 但你不想这么实现,你想action的对象依然由容器生成,但action和领域模型之间的关系由factory生成 或则new 生成? |
|
返回顶楼 | |
发表时间:2009-01-05
有持久化就不能做单体测试了么?
我不这么认为 |
|
返回顶楼 | |
发表时间:2009-01-05
的确,加了,测试要较复杂一些~
但更加oo 呵呵 凡事都有得有失~ |
|
返回顶楼 | |
发表时间: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也不需要了。没有意义 |
|
返回顶楼 | |
发表时间: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管理。 |
|
返回顶楼 | |
发表时间:2009-01-05
我想我和你一样思考过这个问题
如果愿意,你可以看看我博客的第3篇文章。 IOC有设计边界的~ |
|
返回顶楼 | |
发表时间:2009-01-05
spyker 写道 我觉得你充血模型这块设置的有问题
从测试角度来说 这一块处理的一些业务应该不涉及到持久层这一块的 我觉得这一块应该是简单的一些逻辑处理 不引入其他层的对象 可以做单体测试的 嗯,我不会做单体测试,呵呵 所以也不怎么往这方面想。但我的主要原则是:处理相同对象的逻辑要集中,关系相近,处理方式相近的逻辑要集中。尽量复用代码,尽量封装代码。在这种原则下,我觉得往领域Bean里放CRUD的数据库操作是我目前能想到的比较好的封装的方法,要不CRUD处理往哪里放? |
|
返回顶楼 | |