Spring进修(三) AOP详解
副标题#e#
上次的博文深入浅出Spring(二) IoC详解中,我为各人简朴先容了一下Spring框架焦点内容中的IoC,接下来我们继承讲授另一个焦点AOP(Aspect Oriented Programming),即面向切面编程。
1、OOP回首
在先容AOP之前先往返首一下各人都较量熟悉的OOP(Object Oriented Programming)。OOP主要是为了实现编程的重用性、机动性和扩展性。它的几个特征别离是担任、封装、多态和抽象。OOP重点表此刻编程架构,强调的是类之间的条理干系。
2、OOP缺陷
为了更好的说明OOP的观念,我们接下来讲一个OOP的实例,重点阐明OOP存在哪些缺陷,以便更好的领略AOP的相关内容。
先看如下的一张图:
上面这张图有三个类:Dog,Cat和Duck,他们都有一个要领run。凭据OOP的设计理念,我们很容易就会想到抽象出一个Animal父类,同时让这三个子类担任Animal父类。这样的设计可以用如下的图示暗示:
URL:http://www.bianceng.cn/Programming/Java/201410/45837.htm
在OOP思想中,我们会利用大量的雷同上图的编程方法,对类举办抽象、担任、封装和多态来实现编程的重用性、机动性和扩展性。可是这样的编程仍然有必然的范围性,有时候,OOP并不能很好办理我们再实际开拓中碰着的问题。为了说明这个问题,看下面的图示:
看到上面的图,我们临时还不能发明有什么问题。为了各人便于领略,接下来我来给各人讲授一下上面类图的实现进程。描写如下:马戏团有一条演出的小狗,这条小狗可以跑和跳,可是它完成跑和跳两个行动之前必需是在接到驯兽师发出的呼吁后,同时完成跑和跳的行动之后,驯兽师会给与响应的嘉奖,好比一块肉。
相识了实现进程之后,我们在来看一下详细的代码。
public class Dog { public void run() { System.out.println("驯兽师发出呼吁!") System.out.println("小狗开始跑!"); System.out.pringln("驯兽师给与嘉奖"); } public void jump() { System.out.println("驯兽师发出呼吁!") System.out.println("小狗开始跳!"); System.out.pringln("驯兽师给与嘉奖"); } }
仔细看上面的代码,我们可以看出在run要领和jump要领中,存在一些沟通的内容(驯兽师发出呼吁和给与嘉奖),这些内容并不能完全举办抽象,即不能凭据OOP编程思想举办处理惩罚。雷同这样的环境同样会呈此刻我们编程中的许多处所,譬喻:日志记录、机能统计、安详节制、事务处理惩罚、异常处理惩罚等等。可是这样的环境该如何办理呢?这就引入了AOP编程思想。
3、AOP简介
AOP为Aspect Oriented Programming的缩写,即面向切面编程(也叫面向方面),是一种可以通过预编译方法和运行期动态署理实此刻不修改源代码的环境下给措施动态统一添加成果的一种技能。
#p#副标题#e#
4、AOP实现实例
为了各人更好的领略AOP如何实现,接下来我们优化一下上述代码。
首先是Dog类
public interface Animal { public void run(); public void jump(); } public class Dog implements Animal{ public void run(){ System.out.println("小狗开始跑!"); } public void jump(){ System.out.println("小狗开始跳!"); } }
比拟之前的代码我们可以明明看出,我们将关于驯兽师的相关内容从run和jump中举办了抽取,接下来,我们如安在措施运行中将关于驯兽师的行动插手到措施中呢?这就是我们这次用到的AOP实现的焦点技能动态署理(Dynamic Proxy)。详细代码如下:
public class MyProxy implements InvocationHandler{ private Object targetObject; public Object createProxyInstance(Object targetObject) { this.targetObject = targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { command(); Object ret = method.invoke(targetObject, args); award(); return ret; } private void command() { System.out.println("驯兽师发出呼吁!"); } private void award(){ System.out.println("驯兽师给与嘉奖!"); } }
#p#分页标题#e#
上述代码实现完成之后,我们改如何挪用呢?参考代码如下:
public class Client { public static void main(String[] args) { MyProxy hander = new MyProxy(); Animal dog = (Animal)hander.createProxyInstance(new Dog()); dog.run(); dog.jump(); } }
执行功效如下:
关于AOP编程的实例演示就完成了,接下来从头回首一下AOP与OOP的相关观念。
5、AOP与OOP的干系
OOP针对业务处理惩罚进程的实体(Dog、Cat、Duck)及其属性和行为(run)举办抽象封装,以得到越发清晰高效的逻辑单位分别。而AOP则是针对业务处理惩罚进程中(run或jump)的切面(command和award)举办提取,它所面临的是处理惩罚进程中的某个步调或阶段,以得到逻辑进程中各部门之间低耦合性的断绝结果。这两种设计思想在方针上有着本质的差别。
本篇文章到此为止根基上对AOP的观念就讲授完毕了,至于在Spring中如何利用AOP,我会在此后的博文中针对一个实例举办讲授,别的本次关于AOP我们并没有讲完,尚有许多的观念同样我会在今后的博文中举办讲授!敬请等候!
出处:http://www.cnblogs.com/zs234/