AOP面向切面编程的简单动态代理实现
2017-08-17 09:46
435 查看
AOP(Aspect Oriented Programming)面向切面编程的简单动态代理实现
注:本次实现的动态代理仅仅依赖于java核心包面向切面编程是对面向对象编程思想的一种强有力的补充,它可以使得在做程序设计时,编程人员只需要关注主要业务流程的编写,无需考虑其他的权限、安全、数据验证、日志等”细枝末节”,这些独立于主业务的工作完全可以通过AOP在程序运行期动态地加载上去,特别是Spring框架的出现,更是大大减少了程序编写的难度和复杂性。
实现动态代理首先需要编写一个”编织类”,将额外的验证或者日志和程序的主要业务编织在一起,使程序在运行主业务时一同运行这些挂载上去的逻辑代码。
代码如下(通用代码,不针对具体的业务逻辑类):
package com.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DynamicProxy implements InvocationHandler{ //被代理的类,即主业务逻辑实现类 private Object target; public DynamicProxy(Object target) { this.target = target; } //实现的InvocationHandler接口方法,用于编织验证代码和主业务类的方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //主业务之外验证或者日志代码,可以通过调用额外的方法来添加大量逻辑 System.out.println("----method "+method.getName()+" start------"); //调用target对象里的method.getName()(方法名)方法,参数列表为args Object o = method.invoke(target, args); System.out.println("----method "+method.getName()+" end------"); return o; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } }
一个小Demo:
package com.main; import java.lang.reflect.Proxy; import com.test.DynamicProxy; import com.tools.StrReplace; import com.tools.StrReplaceImpl; public class DynamicProxyTest { public static void main(String[] args) { //将要被代理的业务逻辑类对象,类定义和接口定义见下文 StrReplace target = new StrReplaceImpl(); //InvocationHandler的实现类,用来编织主业务逻辑和用于日志(或验证)的代码 DynamicProxy dynamicProxy = new DynamicProxy(target); //代理类的生成,调用静态方法Proxy.newProxyInstance()生成的类实现了StrReplace接口 //第一个参数是target对象类的类加载器,这里传参是为了保证两个类使用相同的类加载器 //为什么要一致请百度类加载器,可能以后会写博文解释这个问题 //第二个参数是target对象实现的接口列表,接口里定义的方法就是proxy代理对象能够使用的方法 //第三个参数就是编织类,通过这个类的定义使上述接口中每个方法前后能能加上那些额外的代码逻辑(验证或者日志等) StrReplace proxy = (StrReplace) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), dynamicProxy); try { proxy.setFilePath("E:/java"); } catch (Exception e) { e.printStackTrace(); } //具体调用,这些方法都是StrReplace接口中定义的方法,与target调用这些方法的不同之处在于每个方法调用前后都会有额外的代码逻辑运行 proxy.setEncoding("UTF-8"); proxy.setKeyStr(".java"); proxy.setFilterStr("filter"); proxy.processReplace("ttr1", "str1"); } }
StrReplace接口定义:
package com.tools; public interface StrReplace{ public void setFilePath(String filePath) throws Exception; public void processReplace(String oldStr,String newStr); public void setEncoding(String encoding); public void setKeyStr(String keyStr); public void setFilterStr(String filterStr); }
StrReplace接口的实现类StrReplaceImpl见我的上一篇博文,改改类名和实现的接口就行,这个业务逻辑类是谁都无所谓,只要它有实现某一个接口(java自定义的动态代理需要,Spring的AOP不需要,Spring直接在字节码上加代码)
这样我们就实现了一个简单的动态代理(称作动态代理意思是说我
9e93
们可以通过配置文件在运行时来动态地加载它,在测试时main函数中能够不改变调用类实现代码的情况下,改变类的之间的实现结构也可以称为动态)
在Spring框架中,我们可以通过xml配置文件或annotation标签来控制类实现的注入,这样就能更加方便的实现动态的代理
而这种在整个程序运行线路上横切一刀加入额外代码逻辑的编程方式,就称为AOP(面向切面编程)
相关文章推荐
- 代理模式之静态代理的简单实现---理解AOP(面向切面编程)的前奏---想要理解AOP,必须先理解一下
- Java利用动态代理模拟实现Spring的AOP(面向切面编程)功能的小实践
- 代理模式之静态代理的简单实现---理解AOP(面向切面编程)的前奏---想要理解AOP,必须先理解一下
- Java反射之JDK动态代理实现简单AOP
- Spring(八)jdk动态代理(AOP简单实现)
- Java动态代理实现简单AOP
- JAVA动态代理 和 Spring AOP 4种通知的简单实现
- Java反射之JDK动态代理实现简单AOP
- JDK动态代理实现简单AOP--转
- Spring AOP面向切面编程及两种动态代理
- spring框架学习之路(一)-入门基础(2)-动态代理和AOP(面向切面编程)
- JAVA动态代理 和 Spring AOP 4种通知的简单实现
- spring_由XML实现AOP面向切面编程_实现动态代理
- 使用动态代理实现简单AOP
- 代理模式之静态代理的稍微复杂实现---理解AOP(面向切面编程)---以具体实例来理解AOP概念
- JDK动态代理实现简单AOP--转
- spring_由注解实现AOP面向切面编程_实现动态代理
- Java动态代理模式jdk和cglib的2种实现以及二者的区别(AOP面向切面的前奏)
- Java动态代理实现(简单AOP实现)
- JAVA动态代理 和 Spring AOP 4种通知的简单实现