Presentation is loading. Please wait.

Presentation is loading. Please wait.

面向侧面的程序设计 方林博士 本文下载地址:

Similar presentations


Presentation on theme: "面向侧面的程序设计 方林博士 本文下载地址:"— Presentation transcript:

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


Download ppt "面向侧面的程序设计 方林博士 本文下载地址:"

Similar presentations


Ads by Google