锁定老帖子 主题:遇到一个设计上的问题,请问如何解决?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2008-06-20
这样设计上肯定是有问题的,其实你想用到的同一管理,可以通过些一个公共类,然后让他提供一个方法来访问spring的管理的bean,你在所有的业务中都依赖于这个方法,就可以了,你只不过是想不用强制类型转换还是什么?
|
|
返回顶楼 | |
发表时间:2008-06-22
悠游键客 写道 yujianqiu 写道 volking 写道 举个例子来说:例如有n多个业务类接口及其实现:teacherManager,studentManager.....
我以前这样用,如果teacherManager需要studentManager的方法,就会在teacherManager添加一个studentManager。然后注入: <bean id="teacherManager" class="test.teacherManagerImpl"> <property name="studentManager" ref="studentManager" /> </bean> 现在我想用一个类来统一管理这些业务类。 <bean id="teacherManager" class="test.teacherManagerImpl"> <property name="app" ref="app" /> </bean> <bean id="app" class="test.appImpl"> <property name="teacherManager" ref="teacherManager" /> <property name="studentManager" ref="studentManager" /> </bean> 但是在启动tomcat的时候,报错。原因是在初始化teacherManagerImpl时,需要初始化app, 而初始化app,需要初始化teacherManagerImpl。就像进入死循环一样。 请问appImpl应该如何初始化那些业务类呢?好像用spring的注入无法实现。 第一,循环依赖应该避免 第二,个人觉得“用一个类来统一管理这些业务类”毫无意义,因为这是Spring的工作 ![]() 同意,设计上应该改进,oo? |
|
返回顶楼 | |
发表时间:2008-06-23
yunsong 写道 悠游键客 写道 yujianqiu 写道 volking 写道 举个例子来说:例如有n多个业务类接口及其实现:teacherManager,studentManager.....
我以前这样用,如果teacherManager需要studentManager的方法,就会在teacherManager添加一个studentManager。然后注入: <bean id="teacherManager" class="test.teacherManagerImpl"> <property name="studentManager" ref="studentManager" /> </bean> 现在我想用一个类来统一管理这些业务类。 <bean id="teacherManager" class="test.teacherManagerImpl"> <property name="app" ref="app" /> </bean> <bean id="app" class="test.appImpl"> <property name="teacherManager" ref="teacherManager" /> <property name="studentManager" ref="studentManager" /> </bean> 但是在启动tomcat的时候,报错。原因是在初始化teacherManagerImpl时,需要初始化app, 而初始化app,需要初始化teacherManagerImpl。就像进入死循环一样。 请问appImpl应该如何初始化那些业务类呢?好像用spring的注入无法实现。 第一,循环依赖应该避免 第二,个人觉得“用一个类来统一管理这些业务类”毫无意义,因为这是Spring的工作 ![]() 同意,设计上应该改进,oo? 还是不要出现这样互相注入的好。 |
|
返回顶楼 | |
发表时间:2008-06-24
循环注入了啊!
|
|
返回顶楼 | |
发表时间:2008-06-24
volking 写道 举个例子来说:例如有n多个业务类接口及其实现:teacherManager,studentManager.....
我以前这样用,如果teacherManager需要studentManager的方法,就会在teacherManager添加一个studentManager。然后注入: <bean id="teacherManager" class="test.teacherManagerImpl"> <property name="studentManager" ref="studentManager" /> </bean> 现在我想用一个类来统一管理这些业务类。 <bean id="teacherManager" class="test.teacherManagerImpl"> <property name="app" ref="app" /> </bean> <bean id="app" class="test.appImpl"> <property name="teacherManager" ref="teacherManager" /> <property name="studentManager" ref="studentManager" /> </bean> 但是在启动tomcat的时候,报错。原因是在初始化teacherManagerImpl时,需要初始化app, 而初始化app,需要初始化teacherManagerImpl。就像进入死循环一样。 请问appImpl应该如何初始化那些业务类呢?好像用spring的注入无法实现。 这样做违反了OO设计原则:松耦合,高凝聚。 |
|
返回顶楼 | |
发表时间:2008-06-26
volking 写道 我开始用的是:dao,manager(也就是service,事务也是这层),现在把dao和manager合并。一个通用的dao足够了。直接注入到manager里面。
您没有明白我的意思,我说的分层其实就是把你说的manager再分上下两层,刚开始时麻烦一点,但是理清业务含义,我建议的那种分开方式(单表操作和多表操作),就是为了让你的manager中的单表操作能被其他manager很好的复用,而不用担心什么循环依赖问题,因为单表操作不会产生逻辑上的相互依赖,应该充分给与其他manager复用。(这里说的manager在我的体系里就是service) volking 写道 刚刚看了一篇文章:注释驱动的IoC。感觉用处不大,xml不是有default-autowire了吗? default-autowire在约定良好的情况,或者是结构类似的情况比较好用,但是定制的一些类最好不要多用autowire,你的配置没人看得懂的。你必须要考虑你的代码的可读性(配置也是代码,注释也是代码)。 IoC至少有一个优点,可读性好,别人一看就知道这个属性是容器注入的。有时候麻烦和可读性是矛盾的,你要自己把握尺度。 |
|
返回顶楼 | |
发表时间:2008-06-26
williamou 写道 不要指定property注入,而是通过autowire,应该可以。。
我就是这样做的。 不是所有的情况都是能用autowire的,autowire会导致配置可读性很差,尺度把握的标准不定好,别人看你的配置中的依赖关系会非常麻烦的。 我们以前用2.0.1,autowire貌似也是会碰到循环依赖的问题。 |
|
返回顶楼 | |
发表时间:2008-06-26
lazy-init="true"
|
|
返回顶楼 | |
发表时间:2008-06-26
volking 写道 bluemeteor 写道 楼主是想实现一个service facotry类么?试试设置bean的<factory-bean>和<factory-method>属性
我只是不想在每个业务类都写类似于: private TeacherManager teachermgr; public setTeacherManager(..){..} 而是注入一个appImpl,然后通过app.get××××Manager(),取出任意一个我想要的业务类。 写一个ApplicationService的接口.将所有的接口,比如 TeacherManager,StudentManager 都注入到这个接口里. 实现getter,sertter,然后在spring当中注册这个ApplicationService接口. public interface ApplicationService{ public TeacherManager getTeacherManager(); public void setTeacherManager(TeacherManager teacherImpl); public StudentManager getStudentManager(); public void setStudentManager(StudentManager studentImpl); } public class DefaultApplicationServiceImpl implemention ApplicationService{ private TeacherManager teacherManager; private StudentManager studentManager; // getter and setter methods ... } <bean id="applicationService" class="com.yourpack.ApplicationService"> <property name="teacherManager" ref="teacherManager" /> <property name="studentManager" ref="studentManager" /> </bean> |
|
返回顶楼 | |
发表时间:2008-06-26
lavax 写道 直接new吧,除非有必要,否则不用注入。
很强! 等你new到了一定的时候就OutOfMemmery. |
|
返回顶楼 | |