论坛首页 Java企业应用论坛

遇到一个设计上的问题,请问如何解决?

浏览 16638 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2008-06-20  
这样设计上肯定是有问题的,其实你想用到的同一管理,可以通过些一个公共类,然后让他提供一个方法来访问spring的管理的bean,你在所有的业务中都依赖于这个方法,就可以了,你只不过是想不用强制类型转换还是什么?
0 请登录后投票
   发表时间: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?
0 请登录后投票
   发表时间: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?

还是不要出现这样互相注入的好。
0 请登录后投票
   发表时间:2008-06-24  
循环注入了啊!
0 请登录后投票
   发表时间: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设计原则:松耦合,高凝聚。
0 请登录后投票
   发表时间: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至少有一个优点,可读性好,别人一看就知道这个属性是容器注入的。有时候麻烦和可读性是矛盾的,你要自己把握尺度。
0 请登录后投票
   发表时间:2008-06-26  
williamou 写道
不要指定property注入,而是通过autowire,应该可以。。

我就是这样做的。



不是所有的情况都是能用autowire的,autowire会导致配置可读性很差,尺度把握的标准不定好,别人看你的配置中的依赖关系会非常麻烦的。

我们以前用2.0.1,autowire貌似也是会碰到循环依赖的问题。
0 请登录后投票
   发表时间:2008-06-26  
lazy-init="true"

0 请登录后投票
   发表时间: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>

0 请登录后投票
   发表时间:2008-06-26  
lavax 写道
直接new吧,除非有必要,否则不用注入。

很强! 等你new到了一定的时候就OutOfMemmery.
0 请登录后投票
论坛首页 Java企业应用版

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