美文网首页Java学习笔记
Java 反射实现 Aop 代理

Java 反射实现 Aop 代理

作者: 小小俊子 | 来源:发表于2017-03-22 22:52 被阅读256次

利用反射生成JDK的动态代理,也就是AOP中的AOP代理,代替目标对象,从而在代码中织入增强。

定义代理接口

由于JDKf动态代理只能为接口创建动态代理,故先定义接口,假定我们需要对数据的Save方法添加事务处理,我们有一个UserDao接口,里面有一个Save方法,代码如下:
<pre>
public interface UserDao {
public void save();
}
</pre>

定义代理实现

下面具体来实现接口定义的Save方法,我们采用下面的代码来实现。

public class UserDaoImpl implements UserDao {

    @Override
    public void save() {
        System.out.println("I am save user....");
    }

}

定义增强代码

我们有如下的操作,在保存用户之前打开事务,在保存用户之后提交事务,在增强代码中定义两个方法before()和after(),分别用在save()方法的执行开始之前和执行之后。
<pre>
public class UserTx {
public void before(){
System.out.println("before save.....");
}

public void after(){
    System.out.println("after save......");
}

}
</pre>

定义Invocation handler

&smsp;之所以要定义handler是因为执行动态代理时,实际执行的是handler里面的invoke()方法,这样的话,我们在invoke()方法里面自定义方法的内容,从而就达到了代理和增强的逻辑和效果。
<pre>
public class UserDaoInvocationHandler implements InvocationHandler {
/**
* 需要代理的对象
/
private Object proxyObj;
/
*
* 指定我们需要代理的对象
* @param proxyObj
*/
public void setProxyObj(Object proxyObj) {
this.proxyObj = proxyObj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
UserTx tx = new UserTx();
tx.before();
Object resultObj = method.invoke(proxyObj, args);
tx.after();
return resultObj;
}

}
</pre>

测试结果

上面已经定义好所有的东西,我们就实际来动态代理我们指定的对象,用代理后的对象来执行我们要执行的方法,验证是否代理成功。
<pre>
import java.lang.reflect.Proxy;

public class ProxyTst {

public static void main(String[] args) {
    // proxy object
    UserDao target = new UserDaoImpl();
    // invocation handler
    UserDaoInvocationHandler handler = new UserDaoInvocationHandler();
    handler.setProxyObj(target);
    // proxy 
    UserDao targeted = (UserDao) Proxy.newProxyInstance(
            target.getClass().getClassLoader(), 
            target.getClass().getInterfaces(), 
            handler);
    // execute proxyed object
    targeted.save();
}

}
</pre>
 执行上面的代码之后我们可以在控制台看见如下的输出,证明UserDao已经被成功代理,同时我们也为我们的程序成功的添加了事务功能。
<pre>
before save.....
I am save user....
after save......
</pre>

相关文章

  • Java 反射实现 Aop 代理

    利用反射生成JDK的动态代理,也就是AOP中的AOP代理,代替目标对象,从而在代码中织入增强。 定义代理接口 由于...

  • 开源.Net动态代理框架:Machete.Proxy

    1.介绍 动态代理是个非常有用的东西,比如用动态代理加上反射可以做AOP拦截。Java中的动态代理很容易实现,有两...

  • Spring AOP IOC 实现原理,面试问到如何回答

    IOC:控制反转,通过依赖注入方式实现,IOC利用java反射机制,AOP利用代理模式。所谓控制反转是指,本来被调...

  • 深入探究Java动态代理

    深入探究Java动态代理 提起Java的动态代理,大家首先就会想到Spring的AOP,Spring在实现AOP的...

  • Java动态代理

    Java动态代理 引言 最近在看AOP代码,其中利用到了Java动态代理机制来实现AOP织入。所以好好地把Java...

  • 代理设计模式与 AOP

    本文为大家讲解代理模式,包括静态代理的作用和代码实现、动态代理的作用、使用反射实现动态代理的过程,从而理解 AOP...

  • Dubbo Proxy 原理与实例

    Java代理 Java代理:通过反射和InvocationHandler回调接口实现 Proxy.newProxy...

  • Spring AOP详解

    AOP AOP的实现一般都是基于 代理模式 ,在JAVA中采用JDK动态代理模式,但是我们都知道,JDK动态代理模...

  • SpringAOP

    springAOP实现方式 1.动态代理 使用 Proxy机制,使用反射技术,创建实际对象的代理对象,添加AOP的...

  • 【啃啊啃 Spring5 源码】细碎三:AOP两种动态代理的区别

    spring 中 AOP是基于 “动态代理” 实现,其采用了两种方式: java代理:采用java内置的代理API...

网友评论

    本文标题:Java 反射实现 Aop 代理

    本文链接:https://www.haomeiwen.com/subject/qjvanttx.html