论坛首页 Java企业应用论坛

请教一个关于注入对象的问题

浏览 4673 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-01-15  
我在我的项目中使用spring,在web-xml中部署了Application*.xml文件的加载类

然后我写一个底层类BaseServlet,其中有这么一个方法:

public Object getBean(String name); {
    if (ctx == null); {
      ctx = WebApplicationContextUtils
          .getRequiredWebApplicationContext(getServletContext(););;
    }
    return ctx.getBean(name);;
  }


在以后的BO中,我想去获得其他的类对象,这时候我发现有两种实现方法:

1. 注入BaseServlet的对象,通过getBean去获得其他类的对象。
2. 直接注入其他类的对象。

这两种方式似乎都可以通过容器来注入我所需要的对象,问题在于,那种更适合?

迷惑中。
   发表时间:2005-01-15  
flyromza 写道
我在我的项目中使用spring,在web-xml中部署了Application*.xml文件的加载类

然后我写一个底层类BaseServlet,其中有这么一个方法:

public Object getBean(String name); {
    if (ctx == null); {
      ctx = WebApplicationContextUtils
          .getRequiredWebApplicationContext(getServletContext(););;
    }
    return ctx.getBean(name);;
  }


在以后的BO中,我想去获得其他的类对象,这时候我发现有两种实现方法:

1. 注入BaseServlet的对象,通过getBean去获得其他类的对象。
2. 直接注入其他类的对象。

这两种方式似乎都可以通过容器来注入我所需要的对象,问题在于,那种更适合?

迷惑中。


我的意见是第二种更好。
如果用第一种,可能会带来一些问题:
1.注入BaseServlet的话,BO便依赖于这个Servlet,会给BO的复用带来困难。比如如果要脱离web container的运行环境的话,就不行了。
2.BO真正需要的不是这个Servlet,而是另外的BO,这样会增加理解这个BO的难度。如果用2的话,很清楚的知道这个BO与其他BO的关系。
3.这样的做法和JNDI的做法是类似的,缺点也类似。都是属于主动去查找需要的对象,而不是被动的让容器来注入和解决依赖关系。这样做是和spring所说的Ioc控制反转是相反的,不知道能不能说是对spring的误用。
4.如果对象之间的依赖关系出现问题,要等到实际调用getBean()方法的时候才会发现(抛出异常)。如果用2,spring启动的时候就会发现问题,有利于及早发现问题和解决。虽然2也是运行时才能发现,但是问题发现的越早越好。
一家之言,请大家批评指正。
0 请登录后投票
   发表时间:2005-01-15  
de3light 写道
flyromza 写道
我在我的项目中使用spring,在web-xml中部署了Application*.xml文件的加载类

然后我写一个底层类BaseServlet,其中有这么一个方法:

public Object getBean(String name); {
    if (ctx == null); {
      ctx = WebApplicationContextUtils
          .getRequiredWebApplicationContext(getServletContext(););;
    }
    return ctx.getBean(name);;
  }


在以后的BO中,我想去获得其他的类对象,这时候我发现有两种实现方法:

1. 注入BaseServlet的对象,通过getBean去获得其他类的对象。
2. 直接注入其他类的对象。

这两种方式似乎都可以通过容器来注入我所需要的对象,问题在于,那种更适合?

迷惑中。


我的意见是第二种更好。
如果用第一种,可能会带来一些问题:
1.注入BaseServlet的话,BO便依赖于这个Servlet,会给BO的复用带来困难。比如如果要脱离web container的运行环境的话,就不行了。
2.BO真正需要的不是这个Servlet,而是另外的BO,这样会增加理解这个BO的难度。如果用2的话,很清楚的知道这个BO与其他BO的关系。
3.这样的做法和JNDI的做法是类似的,缺点也类似。都是属于主动去查找需要的对象,而不是被动的让容器来注入和解决依赖关系。这样做是和spring所说的Ioc控制反转是相反的,不知道能不能说是对spring的误用。
4.如果对象之间的依赖关系出现问题,要等到实际调用getBean()方法的时候才会发现(抛出异常)。如果用2,spring启动的时候就会发现问题,有利于及早发现问题和解决。虽然2也是运行时才能发现,但是问题发现的越早越好。
一家之言,请大家批评指正。


谢谢你的意见,前两点我很同意,我的理解是,不该依赖一个本来没有关系的对象,这样做反而造成了BO与其他类关联关系的不明确。

第三点有点不同意见,既然SpringFactory中都支持getBean这种方法,我认为主动去的查找一个类对象应该也是合理的。

第四点是第二点的具体表现了,类似与数组与数组列表在出现ClassCastException时的差异。
0 请登录后投票
   发表时间:2005-01-15  
还有,BaseServlet的好处应该是体现在Servlet中的,其他的Servlet如果需要从容器去获取一个对象,可以直接继承BaseServlet然后去getBean。

把BaseServlet传递到BO层似乎不妥。
0 请登录后投票
   发表时间:2005-01-15  
我的理解是getBean只是为了得到一个业务的facade。因为容器总要提供一种方法得到容器里面的bean,否则没办法使用容器里的bean。而facade之内的BO之间的依赖关系应该交给spring来解决。当然世事无绝对,我的意思是尽量用spring来解决这种依赖关系。
0 请登录后投票
   发表时间:2005-01-15  
de3light 写道
我的理解是getBean只是为了得到一个业务的facade。因为容器总要提供一种方法得到容器里面的bean,否则没办法使用容器里的bean。而facade之内的BO之间的依赖关系应该交给spring来解决。当然世事无绝对,我的意思是尽量用spring来解决这种依赖关系。


我理解你的意思是,getBean去获得某个组件的边界类,尽量使得耦合达到最小化。

现在想想,其实这和BaseServlet的初衷是一样的,Servlet尽量的薄,只是传递命令和一些必要的参数,通过获得其他组件服务的facade去实现某一功能,而这个Servlet可以通过继承BaseServlet去拥有这种能力。

和你讨论一下,思路清晰了不少,感谢,
0 请登录后投票
论坛首页 Java企业应用版

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