spring注入,说白了就是用配置文件来管理类的实例化和它们间的关联,这跟我们在项目中使用接口的目的都是殊途同归的:减小代码耦合度。
接口注入和setter注入是不同的。如一楼所说,setter方法的参数是接口类型。但是接口注入的缺点非常明显,为了让容器能够注入依赖,所有组件都必须实现特定的接口。因为这个歌接口是特定于容器的,所以组件对容器产生了以来,并且一旦脱离开该容器,组件将不能重用。
IOC那是通过动态代理实现的,如果没有了接口,请问spring还如何为你生成代理对象给你使用?如何来实现IOC......
在spring 里主要用到了两个设计模式-单例和代理
先说 1.spring的依赖注入
为什么要引入它,在没用spring的时候,比如UserManager 中有一个LogManager的属性,如果你要用LogManager中的方法,那你就必须去new然后才能使用 LogManager lm = new LogManager();也许你觉得这没什么new就new呗,但是如果你的UserManager 如果要进行事务控制、权限检查还要依赖很多很多类,你是不是也一个个new呢(其实挺麻烦的),现在有的spring,你所依赖的那些类不用你在new了,还是spring容器初始化的时候,它会一一帮你new好,然后注入给UserManager。 这也就体现了依赖注入
当然还有一个Ioc的概念就是控制反转,以前没用spring容器的所有的程序都是你自己控制,现在许多的类都交有spring去管理、控制了,所以大概就有这么个意思在里面。
代码写多了好像这概念就明了了,能懂吗 ?
| | |
|
|
#20楼 得分:0回复于:2010-01-19 18:31:53
再说2.接口和实现类
为什么要这样做,其实它是一种面向接口编程。。 这样让你和客户都不依赖具体的实现而依赖接口
比如你做的项目中有一个 业务逻辑层com.fjh.manager 然后有一个具体的实现com.fjh.manager.impl
由于你的业务逻辑层是要和数据库打交道的,如果你不定义接口的话,假如持久层你用的是hibernate技术的话,就写一个实现类,那么这样代码是不是就写死了,假如你的客户要求持久层技术要求变换换成JDO、iBatis等,那么你现在是不是要重写你的业务逻辑类。。但是如果你抽象出一个接口的话,那么要换,代码不用变,你只要再增加一个下其他持久层框架的实现与一些配置信息就可以了。接口可以不用做任何方法,更重要的是你呈现层(比如action)调用业务逻辑方法它面向的也是接口代码也不会变,但是你如果就现在一个具体实现类,呈现层中的代码的方法和参数是不是会改变呢。这样系统弄得一团糟。。
面向接口编程上面还是一个好处。其实他的好处非常大。
这样也是面向对象编程的一个原则吧:就是依赖倒置原则(DIP)
大致的要求就是:A、高层模块不应该依赖于底层模块。二者都应该依赖于抽象。
B、抽象不应该依赖于细节。细节应该依赖于抽象。
这样代码比较清晰、灵活,而且程序的扩展性非常强哦
| |