我在了解spring的时候,经常看到两个概念,即:IOC和AOP
IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”,还有些书籍翻译成为“控制反向”或者“控制倒置”。1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。这个“第三方”就是IOC容器,其实在spring中也经常听到另外一个术语,即为DI。
DI为依赖注入,我个人理解就是是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
IOC容器帮助我们完成了代码的低耦合或者没有耦合,在A类想使用B类的某个方法,不像之前的代码需要在类a中new一个B的实例或者匿名对象,而是在运行时交给ioc容器来生产和传输、销毁。
IOC的底层技术支持是java的反射机制。反射这个我也经常遇到,我本人在学习其他语言如:.net php python go都有反射的特性。反射我本人的简单理解就是通过类的名字在代码运行时生成实例,如:java的spring、hibernate,. net的entityFramework等流行框架都是基于反射来开发的。
接下来我们在研究下AOP。
AOP(Aspect Oriented Programming)指的是面向切面编程。在了解AOP之前,我对OOP(Object Oriented Programming)已经了解了很多,但是OOP有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志,权限验证,事务等功能时,只能在在每个对象里引用公共行为,这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。
我在开始搜集了解aop时,还需要去了解代理模式。啥叫代理模式?对其他对象提供一种代理以控制对这个对象的访问。这段话我百度官方给的概念,我自己的理解是:比如A对象要做一件事情,在没有代理前,自己来做,在对A代理后,由A的代理类B来做。代理其实是在原实例前后加了一层处理,这也是AOP的初级轮廓。其实代理说白了就是找一个中间人。
代理模式分为静态代理和动态代理。
静态代理:静态代理说白了就是在程序运行前就已经存在代理类的字节码文件,代理类和原始类的关系在运行前就已经确定。
静态代理虽然保证了业务类只需关注逻辑本身,代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理。再者,如果增加一个方法,除了实现类需要实现这个方法外,所有的代理类也要实现此方法。增加了代码的维护成本。那么要如何解决呢?答案是使用动态代理。
动态代理:动态代理类的源码是在程序运行期间通过JVM反射等机制动态生成,代理类和委托类的关系是运行时才确定的。
所以AOP是基于动态代理模式的。
此上都为基本的概念,具体理解还需从代码中感悟。
网友评论