是否能够这样理解你的话--ioc有很多好处,但它并不能够真正降低耦合。
我一直对这个问题有疑问,因此我想得到清楚的解释和明确的答复,因为我认为理解错误还不如不理解。
我一直对这个问题有疑问,因此我想得到清楚的解释和明确的答复,因为我认为理解错误还不如不理解。
boyszz的观点我同意,不过你举的这个例子却有可商榷之处。
如果一个类需要定义一个private的类型是Map的实例变量,那么可能最好的方式缺省是:
private HashMap map = new HashMap();
为什么呢?因为:
1. 如果这个类有一个Map类型的private的实例变量,那么几乎可以肯定对这个Map操作的主要是这个类(否则的话,就是类的封装没有做好),既然如此,有这个类来确定Map的真正类型(或者实现)是最合理的,也就是说,这个类有责任确定Map的实现,而不是其它类。
2. 之所以写成上面的方式,而不是private Map map = new HashMap();是因为这样能够让JVM进行最好的运行是优化,而不必担心多态的问题。
所以,并不是什么东西都要写成接口,也不是什么东西都要Ioc,在使用它们之前,先问一问自己为什么。
HttpServletRequest好象不是所谓的注入的吧,只是作为参数传递进来而已,和IOC完全没有关系,就是简单的面向接口编程。
private Map map = new HashMap();
以这个为例,如果有一天要用hashtable实现,只好把后面改为new hashtable(),若是ioc的话,我们也必须在配置文件里做出相应更改,我承认,后者更加规范更加优雅,但也仅此而已。我们要使用的map接口都最终要实现,而更改它的实现都逃不过改变它的实现类,所以,除去接口所产生的影响,ioc到底在哪里降低耦合了?
Ioc其实是工厂模式得升级,我在一篇文章说过。首先明白工厂模式解耦性: 将对象使用和对象创建进行分离。
如果说工厂模式还不能彻底解决耦合,因为客户端会和工厂类耦合,那么IOC则进一步了,如果客户端和被调用者都在IOC容器内,则客户端就只和具体被调用者得接口耦合,OO中同步系统目前做到和接口耦合就算是松耦合了(JMS等异步则完全解耦)。
你说的耦合只是技术上的耦合,其实真正的耦合是业务的耦合,业务接口的耦合。
我赞成这句话“真正的耦合是业务的耦合”
不是,配置只是一个表象,我们不能看Spring的IOC来理解IOC,因为Spring缺省的IOC我已经反复批判过,不是auotwiring,在autowiring情况下,配置只是每个实现的名称和类,以Jdon框架配置为例子如下:
在auotwiring+Annotation情况下,我们甚至无需这些配置,我们只要在代码实现中加入Annotation就可以,比如在某个实现类A中加入Annotation:
@id="a"
public class A{
}
所以,配置不只是优化,而是升华,如果整个Web容器都支持IOC,我们甚至无需写Annotation,就象使用Servlet一样使用Web Beans。
IOC主要针对接口,关于业务解耦问题,而业务主要是一些抽象,不属于接口范畴,所以IOC无法适用,业务解耦可以参考Evans DDD.