发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
在介绍AOP之前先来回顾一下大家都比较熟悉的OOP(Object Oriented Programming)。OOP主要是为了实现编程的重用性、灵活性和扩展性。它的几个特征分别是继承、封装、多态和抽象。OOP重点体现在编程架构,强调的是类之间的层次关系。
为了更好的说明OOP的概念,我们接下来讲一个OOP的实例,重点分析OOP存在哪些缺陷,以便更好的理解AOP的相关内容。
先看如下的一张图:
上面这张图有三个类:Dog,Cat和Duck,他们都有一个方法run。按照OOP的设计理念,我们很容易就会想到抽象出一个Animal父类,同时让这三个子类继承Animal父类。这样的设计可以用如下的图示表示:
在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编程思想。
AOP为Aspect Oriented Programming的缩写,即面向切面编程(也叫面向方面),是一种可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
为了大家更好的理解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("驯兽师给与奖励!"); } }
上述代码实现完成之后,我们改如何调用呢?参考代码如下:
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的相关概念。
OOP针对业务处理过程的实体(Dog、Cat、Duck)及其属性和行为(run)进行抽象封装,以获得更加清晰高效的逻辑单元划分。而AOP则是针对业务处理过程中(run或jump)的切面(command和award)进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。 本篇文章到此为止基本上对AOP的概念就讲解完毕了,至于在Spring中如何使用AOP,我会在今后的博文中针对一个实例进行讲解,另外本次关于AOP我们并没有讲完,还有很多的概念同样我会在以后的博文中进行讲解
来自: 昵称10504424 > 《工作》
0条评论
发表
请遵守用户 评论公约
Java每日一题_关于SpringAOP
A、AOP将散落在系统中的“方面”代码集中实现。AOP 和 OOP的区别:1. 面向切面编程 AOP 偏重业务处理过程的某个步骤或阶段,强调降低模块之间的耦合度,使代码拥有更好的移植性。也可以说 AOP 是面向业...
Spring框架与AOP思想的研究与应用
Spring框架与AOP思想的研究与应用。2、AOP思想在Spring框架中的体现。Spring本身也是一个容器,只是相对EJB容器所要付出的代价而言,Spring属于轻量级容器,它能够替代EJB,通过使用AOP来提供声明式事...
Spring框架中的AOP思想动态代理模式
Spring中IOC和AOP的详细解释
Spring中IOC和AOP的详细解释。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定...
用Spring AOP实现开发中松散耦合-软件频道-Spring-天极网
用Spring AOP实现开发中松散耦合2005-12-28 09:47 作者: 陈鑫 黄迪明 陈琼 出处: 计算机与信息技术 责任编辑:方舟 摘要 面向方面编程(AOP)是面向对象编程(OOP)的一种扩展技术,能够很好的解...
简单理解AOP(面向切面编程)
简单理解AOP(面向切面编程)OOP实际上是对对象的属性和行为的封装,而AOP对于这点就无从谈起,但是AOP是处理某个步骤和阶段的,从中进行切面的提取,也就是说,如果几个或更多个逻辑过程中,有重复的...
深入理解Spring的两大特征(IOC和AOP)
深入理解Spring的两大特征(IOC和AOP)一、spring 的优点?AspectJ的织入编译器就是以这种方式织入切面的。面向切面编程(AOP)完善spri...
spring框架学习(六)AOP
spring框架学习(六)AOP AOP(Aspect-OrientedProgramming)面向方面编程,与OOP完全不同,使用AOP编程系统被分为方面或关注点,而不是OO...
你必须要懂的 Spring:Aop
你必须要懂的 Spring:Aop.而这也是Aop出现的原因,没错,Aop就是被设计出来弥补OOP短板的。学过Spring的都知道,Spring内比较核心的功...
微信扫码,在手机上查看选中内容