浏览 4673 次
锁定老帖子 主题:请教一个关于注入对象的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-01-15
然后我写一个底层类BaseServlet,其中有这么一个方法: public Object getBean(String name); { if (ctx == null); { ctx = WebApplicationContextUtils .getRequiredWebApplicationContext(getServletContext(););; } return ctx.getBean(name);; } 在以后的BO中,我想去获得其他的类对象,这时候我发现有两种实现方法: 1. 注入BaseServlet的对象,通过getBean去获得其他类的对象。 2. 直接注入其他类的对象。 这两种方式似乎都可以通过容器来注入我所需要的对象,问题在于,那种更适合? 迷惑中。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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也是运行时才能发现,但是问题发现的越早越好。 一家之言,请大家批评指正。 |
|
返回顶楼 | |
发表时间: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时的差异。 |
|
返回顶楼 | |
发表时间:2005-01-15
还有,BaseServlet的好处应该是体现在Servlet中的,其他的Servlet如果需要从容器去获取一个对象,可以直接继承BaseServlet然后去getBean。
把BaseServlet传递到BO层似乎不妥。 |
|
返回顶楼 | |
发表时间:2005-01-15
我的理解是getBean只是为了得到一个业务的facade。因为容器总要提供一种方法得到容器里面的bean,否则没办法使用容器里的bean。而facade之内的BO之间的依赖关系应该交给spring来解决。当然世事无绝对,我的意思是尽量用spring来解决这种依赖关系。
|
|
返回顶楼 | |
发表时间:2005-01-15
de3light 写道 我的理解是getBean只是为了得到一个业务的facade。因为容器总要提供一种方法得到容器里面的bean,否则没办法使用容器里的bean。而facade之内的BO之间的依赖关系应该交给spring来解决。当然世事无绝对,我的意思是尽量用spring来解决这种依赖关系。
我理解你的意思是,getBean去获得某个组件的边界类,尽量使得耦合达到最小化。 现在想想,其实这和BaseServlet的初衷是一样的,Servlet尽量的薄,只是传递命令和一些必要的参数,通过获得其他组件服务的facade去实现某一功能,而这个Servlet可以通过继承BaseServlet去拥有这种能力。 和你讨论一下,思路清晰了不少,感谢, ![]() |
|
返回顶楼 | |