Spring框架,IOC学习整理
思考
平时我们创建对象的类的时候,经常会在类里面引用其他的类,形成类与类的依赖,当其中一个类功能需要进行修改的时候,就需要修改那个类的代码,由于这个类的依赖关系很复杂也就是所说的耦合度很高,所以很可能导致修改一个类就需要修改其他依赖这个类的代码,极大的影响开发的效率,这也违背了OCP开闭原则
什么是OCP开闭原则?
在软件的开发过程中应当对扩展开放,对修改关闭.也就是说,如果在进行功能扩展的时候,添加额外的类是没有问题的,但因为功能扩展而修改之前正常运行的程序,这是不允许且忌讳的.因为一旦修改之前正常运行的程序,很有可能会导致一些意外的错误,而要重新对这段代码进行测试又会浪费太多时间和精力,开发的效率差,是个相当麻烦的过程.
什么是代码耦合度
上层依赖下层,只要下层改变,上层也会跟着改变,所谓牵一发而动全身.这样也违背了另一个开发原则:依赖倒置原则
依赖倒置原则DIP
依赖倒置原则(Dependence Inversion Principle),简称DIP,主要倡导面向抽象编程,面向接口编程,不要面向具体编程,让上层不再依赖下层,下面改动了,上面的代码不会受到牵连。这样可以大大降低程序的耦合度,耦合度低了,扩展力就强了,同时代码复用性也会增强。(软件七大开发原则都是在为解耦合服务)
IOC控制反转
确实已经面向接口编程了,但对象的创建是:new UserDaoImplForOracle()显然并没有完全面向接口编程,还是使用到了具体的接口实现类。什么叫做完全面向接口编程?什么叫做完全符合依赖倒置原则呢?请看以下代码:
如果代码是这样编写的,才算是完全面向接口编程,才符合依赖倒置原则。那你可能会问,这样userDao是null,在执行的时候就会出现空指针异常呀。你说的有道理,确实是这样的,所以我们要解决这个问题。解决空指针异常的问题,其实就是解决两个核心的问题:
● 第一个问题:谁来负责对象的创建。【也就是说谁来:new UserDaoImplForOracle() / new UserDaoImplForMySQL()】
● 第二个问题:谁来负责把创建的对象赋到这个属性上。【也就是说谁来把上面创建的对象赋给userDao属性】
如果我们把以上两个核心问题解决了,就可以做到既符合OCP开闭原则,又符合依赖倒置原则。
IOC控制反转
在Spring框架中可以满足上面所需的功能,也就是我们的IOC控制反转,将bean的创建权交给Spring的IOC容器
控制反转(Inversion of Control,缩写为IoC),是面向对象编程的一种设计思想,可以降低代码之间的耦合度,符合依赖倒置原则.
控制反转的核心思想是: 将对象的创建权交出去,将对象和对象之间的依赖关系管理权交出去,由第三方容器来负责创建与维护.
控制反转的实现方式通常为:依赖注入(Dependency Injection,简称DI)
通常,依赖注入的方式又包括两种: 通过xml来配置,就是使用setter注入
(1)setter方法来进行DI
(2)构造器方法来进行DI
通过注解(Annotation)来配置(主要学习的重点)
Spring框架就是一个实现了IOC思想的框架
IOC可以认为是一种全新的设计模式,但是理论和时间成熟相对较晚,并没有包含在GOF中.(GOF指的是23种设计模式*(使用代理也就是代理模式))