IOC(Inverse of Control)控制反转是Spring容器的内核,AOP,声明式事务等功能都是在此基础上开花结果的。所谓IOC,就是通过容器来控制业务对象之间的依赖关系,而非传统实现中,由代码直接控制。这也就是“控制反转”概念所在;控制权由应用代码转到了外部容器,控制权的转移,就是反转。控制权转移带来的好处就是降低了业务对象之间的依赖程度。
编程语言最终极的目标就是能以更自然、更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象的语言,编程语言一步步地用更自然、更灵活的方式描述软件。AOP是软件开发思想发展到一定阶段的产物。但AOP的出现并不是要完全替代OOP,而仅仅作为OOP的有益补充。虽然AOP作为一项编程技术已经有很多年的历史,但一直长期停留在学术领域,直到Spring的出现,AOP才作为一项真正的实用技术在应用领域开疆扩土。
关于为什么要使用AOP,下面这个例子可以很好的解释。
首先,按照软件重构思想的理念,如果多个类中出现相同的代码,应该考虑定义一个共同的抽象类,将这些相同的代码提取到抽象类当中去。比如Horse、Pig、Camel这些对象都有run()、eat()方法,通过引入一个包含这两个方法抽象的Animal父类,Horse、Pig、Camel就可以通过集成Animal复用到run()和eat()方法。通过引入父类消除多个类中的重复代码的方式在大多数情况下是可行的,但世界并非永远这么简单,比如下面所示的景区管理业务类。
其中pmonitor是方法性能监视代码,它在方法调用前启动,在方法调用返回前结束,并在内部记录性能监视的结果信息。
其中transManager的代码是事务开始和事务提交的代码,我们发现我们的业务代码淹没在重复化非业务性的代码之中,性能监视和事务管理这些非业务性代码葛藤缠树搬包围着业务性代码。
此时我们就不能通过抽象父类的方式消除以上的重复性代码,因为这些逻辑依附在业务类方法的流程中,它们不能够转移到其他地方去。于是产生了AOP这种思想。
编程语言最终极的目标就是能以更自然、更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象的语言,编程语言一步步地用更自然、更灵活的方式描述软件。AOP是软件开发思想发展到一定阶段的产物。但AOP的出现并不是要完全替代OOP,而仅仅作为OOP的有益补充。虽然AOP作为一项编程技术已经有很多年的历史,但一直长期停留在学术领域,直到Spring的出现,AOP才作为一项真正的实用技术在应用领域开疆扩土。
关于为什么要使用AOP,下面这个例子可以很好的解释。
首先,按照软件重构思想的理念,如果多个类中出现相同的代码,应该考虑定义一个共同的抽象类,将这些相同的代码提取到抽象类当中去。比如Horse、Pig、Camel这些对象都有run()、eat()方法,通过引入一个包含这两个方法抽象的Animal父类,Horse、Pig、Camel就可以通过集成Animal复用到run()和eat()方法。通过引入父类消除多个类中的重复代码的方式在大多数情况下是可行的,但世界并非永远这么简单,比如下面所示的景区管理业务类。
import com.smart.dao.ViewPointDao;
import com.smart.dao.ViewSpaceDao;
import com.smart.domain.ViewSpace;
/**
* 景区管理的服务类
*/
public class ViewSpaceService {
private TransactionManager transManager;
private PerformanceMonitor pmonitor;
private ViewSpaceDao viewSpaceDao;
private ViewPointDao viewPointDao;
/**
* 新增一个旅游景区
*
* @param viewSpace
*/
public void addViewSpace(ViewSpace viewSpace) {
pmonitor.start();
transManager.beginTransaction();
viewSpaceDao.addViewSpace(viewSpace);
transManager.endTransaction();
pmonitor.end();
}
/**
* 删除某个景点
*
* @param pointId
*/
public void deleteViewPoint(int pointId) {
pmonitor.start();
transManager.beginTransaction();
viewPointDao.deleteViewPoint(pointId);
transManager.endTransaction();
pmonitor.end();
}
}
其中transManager的代码是事务开始和事务提交的代码,我们发现我们的业务代码淹没在重复化非业务性的代码之中,性能监视和事务管理这些非业务性代码葛藤缠树搬包围着业务性代码。
此时我们就不能通过抽象父类的方式消除以上的重复性代码,因为这些逻辑依附在业务类方法的流程中,它们不能够转移到其他地方去。于是产生了AOP这种思想。
作者:郭无心
链接:http://www.zhihu.com/question/19993030/answer/77125144
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。