Download presentation
Presentation is loading. Please wait.
1
AOP实践 演讲人:陈思荣
2
起源 从OOP开始的故事 核心 两种横切技术 优势 对设计模式的超越 案例 致命的抽奖机
3
OOP的传奇 继承 封装 多态性 对象层次结构
4
万物皆对象
5
1个问题… 日志功能 安全性 异常处理
6
日志功能 安全性 异常处理
7
在AOP的世界 软件系统 核心关注点 横切关注点 业务处理的主要流程 与业务逻辑关系不大的部分
8
“横切”技术,能 剖解开封装的对象,深入内部并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为 “Aspect”, 即方面。
横切技术,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为; 那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手 将这些剖开的切面复原,不留痕迹。
9
“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。” 高级方案构架师Adam Magee
减少系统的 重复代码 降低模块间的 耦合度 可操作性和可维护性 有利于系统未来的 “将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。” 高级方案构架师Adam Magee
10
横切技术
11
觉得抽象? 来看个实例吧
12
m_Orders.Add(order); } }
public class OrderManager { private ArrayList m_Orders; public OrderManager() { m_Orders = new ArrayList(); } public void AddOrder(Order order) { if (permissions.Verify(Permission.ADMIN)) { m_Orders.Add(order); } } public void RemoveOrder(Order order) { if (permissions.Verify(Permission.ADMIN)) { m_Orders.Remove(order); } } } 考虑一个电子商务系统,需要对订单进行添加、删除等管理操作。毫无疑问,在实际的应用场景中,这些行为应与权限管理结合,只有获得授权的用户方能够实施这些行为。
13
public class ProductManager { private ArrayList m_Products; public ProductManager() { m_Products = new ArrayList(); } public void AddProduct(Product product) { if (permissions.Verify(Permission.ADMIN)) { m_Products.Add(product); } } public void RemoveProduct(Product product) { if (permissions.Verify(Permission.ADMIN)) { m_Products.Remove(product); } } } 同样的,在该电子商务系统中,还需要对商品进行管理,它采用了同样的授权机制
14
由于aspect是一个封装的对象,我们可以定义这样一个aspect:
private static aspect AuthorizationAspect{……}
15
我们需要关注什么? point cut 在哪执行? advice 执行什么?
16
在这个aspect中定义point cut,在point cut中,定义了需要截取上下文消息的方法
private pointcut authorizationExecution(): execution(public void OrderManager.AddOrder(Order)) || execution(public void OrderManager.DeleteOrder(Order)) || execution(public voidProductManager.AddProduct(Product)) || execution(public void ProductManager.DeleteProduct(Product));
17
由于权限验证是在订单管理方法执行之前完成,因此在before advice中定义权限检查
before(): authorizationExecution() { if !(permissions.Verify(Permission.ADMIN)) { throw new UnauthorizedException(); } } 利用AOP技术,我们可以分离出系统的核心关注点和横切关注点,从横向的角度,截取业务管理行为的内部消息,以达到织入权限管理逻辑的目的。当执行AddOrder()等方法时,系统将验证用户的权限,调用横切关注点逻辑,因此该方法即为AOP的join point。对于电子商务系统而言,每个需要权限验证的方法都是一个单独的join point。由于权限验证将在每个方法执行前执行,所以对于这一系列join point,只需要定义一个point cut。当系统执行到join point处时,将根据定义去查找对应的point cut,然后执行这个横切关注点需要实现的逻辑,即advice。而point cut和advice,就组合成了一个权限管理aspect。
18
point cut切入点 本质上是一个捕获连接点的结构。在AOP中,可以定义一个point cut,来捕获相关方法的调用。 通知 Advice point cut的执行代码,是执行“方面”的具体逻辑。 方面 Aspect point cut和advice结合起来就是aspect,它类似于OOP中定义的一个类,但它代表的更多是对象间横向的部分。
19
关注点识别:三棱镜法则 在分析系统需求之初,利用AOP的思想,分离出核心关注点和横切关注点。在实现了诸如日志、事务管理、权限控制等横切关注点的通用逻辑后,开发人员就可以专注于核心关注点,将精力投入到解决企业的商业逻辑上来。同时,这些封装好了的横切关注点提供的功 能,可以最大限度地复用于商业逻辑的各个部分,既不需要开发人员作特殊的编码,也不会因为修改横切关注点的功能而影响具体的业务功能。 Business Logic属于核心关注点,它会调用到Security,Logging,Persistence等横切关注点。
20
静态横切 Introduce
21
public interface IValidatable { bool ValidateAddress(); }
举例来说,当前已经实现了一个邮件收发系统,其中类Mail完成了收发邮件的功能。但在产品交付后,发现该系统存在缺陷,在收发邮件时,未曾实现邮件地址的验证功能。现在,第三方产品已经提供了验证功能的接口IValidatable
22
public class MailAdapter:Mail,IValidatable { public bool ValidateAddress() { if(this.getToAddress() != null) { return true; } else { return false; } } }
23
但是… 通过引入MailAdapter类,原来Mail对象完成的操作,将全部被MailAdapter对象取代。
Mail mail = new Mail(); IValidatable validate = ((IValidatable)mail).ValidateAddress(); Mail mail = new MailAdapter();
24
public aspect MailValidateAspect { declare parents: Mail implements IValidatable; public boolean Mail.validateAddress() { if(this.getToAddress() != null) { return true; } else { return false; } } } 静态横切的方法,并没有引入类似MailAdapter的新类,而是通过定义的MailValidateAspect方面,利用横切技术为Mail类introduce了新的方法ValidateAddress(),从而实现了Mail的扩展。因此原来的代码完全可行。
25
AOP rocks!!! Mail mail = new Mail();
IValidatable validate = ((IValidatable)mail).ValidateAddress(); 静态横切允许您不用创建很深的层次结构,以一种本质上更优雅、更逼真于现实结构的方式,插入跨越整个系统的公共行为。尤其是当开发 应用系统时,如果需要在不修改原有代码的前提下,引入第三方产品和API库,则静态横切技术将发挥巨大的作用。
26
AOP技术的优势使得需要编写的代码量大大缩减,节省了时间,控制了开发成本。同时也使得开发人员可以集中关注于系统的核心商业逻辑。此外,它更利于创建松散耦合、可复用与可扩展的大型软件系统。
27
致命的抽奖机
28
完美的 促销方案
30
你们必须在律师找上门之前解决问题!!
31
public void actionPerformed(ActionEvent e) { double randNum = Math
public void actionPerformed(ActionEvent e) { double randNum = Math.random(); if (randNum == 1.0d) dlgToShow.showMsg(); System.exit(0); }
32
public aspect Winning { pointcut makeWinnable(LuckyClick lc): set(LuckyClick.StatusDialog LuckyClick.dlgToShow) && withincode(public void actionPerformed(*)) ; after(LuckyClick lc) : makeWinnable(lc) { //if (Math.random() > 0.5d ) { dlgToShow.showMsg(); }
33
等着升职吧
34
AOP还是一个完美的补丁技术
35
谢谢大家! 最美好的品质是在厄运中显示的。 培根
Similar presentations