Download presentation
Presentation is loading. Please wait.
1
面向侧面的程序设计 方林博士 fanglin1970@gmail.com 本文下载地址: http://www.popframework.net
2
什么是 AOP AOP , Aspect-Oriented Programming AOP 的目的:系统在运行用户的函数之前和之后希 望能进行一些统一操作,例如: – 读写日志 – 打开或关闭数据库连接 – 启动或终止事务 (Transaction) – 权限验证 – 统计汇总 AOP 是一种用于开发系统软件或平台软件的技术 AOP 对所有相关函数统一发挥作用
3
用户的目的 (AOP 要解决的问题 ) public interface UserInterface { public void userMethod(); } public class UserClass extends UserInterface { @Override public void userMethod() { …… } } UserInterface userObject = new AOPUserClass(); userObject.userMethod(); 用户 ( 即程序员 ) 希望系统能够在 调用这个函数之前自动地启动一个 数据库连接,调用完毕之后则能自 动地关闭这个数据库连接。
4
AOP 程序的用户 一般程序的用户就是使用该程序的最终用 户。但用 AOP 技术开发出来的程序的用户是 程序员而不是最终用户。即程序员可以利 用这些 AOP 程序使自己的函数在被调用前后 能够自动地做些事情。
5
如果没有 AOP public interface UserInterface { public void userMethod(); } public class UserClass extends UserInterface { @Override public void userMethod() { …… } } public class AOPUserClass extends UserClass { @Override public void userMethod() { 打开数据库连接 ; super.userMethod(); 关闭数据库连接 ; } UserInterface userObject = new AOPUserClass(); userObject.userMethod(); 开发人员将不 得不为每一个 UserClass 创建 一个子类
6
致命的细节 打开数据库连接 ; super.userMethod(); 关闭数据库连接 ; 打开数据库连接 ; try { super.userMethod(); } finally { 关闭数据库连接 ; }
7
Java 如何实现 AOP InvocationHandler Proxy java.lang.reflect UserClass UserInterface Method UserInvocationHandler Java 约定:只 有在接口中声 明的函数才能 被 AOP 化。
8
Java 的 InvocationHandler package java.lang.reflect; public interface InvocationHandler { object invoke(Object proxy, Method method, Object[] args); }
9
Java 的 Proxy package java.lang.reflect; public class Proxy { public static object newProxyInstance( ClassLoader classLoader, Class[] interfaces, InvocationHandler handler) { …… } }
10
public class UserInvocationHandler implements InvocationHandler { UserInterface userObject; public UserInvocationHandler(UserClass userObject) { this.userObject = userObject; } @Override public object invoke(Object proxy, Method method, Object[] args) { 打开数据库连接 ; method.invoke(this.userObject, args); 关闭数据库连接 ; } UserInterface userObject = new UserClass(); UserInterface userProxy = (UserInterface) Proxy.newProxyInstance( classLoader, new Class[] { UserInterface.class }, new UserInvocationHandler(userObject) ); userProxy.userMethod();
11
谢谢大家 方林 fanglin1970@gmail.com 本文下载地址: http://www.popframework.net
Similar presentations