Java实现AOP切面(动态代理)

Posted lay2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现AOP切面(动态代理)相关的知识,希望对你有一定的参考价值。

Java.lang.reflect包下,提供了实现代理机制的接口和类:

  1. public interface InvocationHandler

    InvocationHandler 是代理实例的调用处理程序 实现的接口。

  2. public class Proxy extends Object implements Serializable     

    Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。

Java的动态代理依赖于接口,虽然在生成效率上较高,但是执行效率比较慢,而且Java的反射机制本身消耗的资源就比一般的调用来得更大一点。

Spring中给予客户端自主选择是使用Java的动态代理还是使用CGLIB第三方代理实现,两者各有特点。

简单地说,Java的代理机制实现如下:

  1. 创建业务对象;
  2. 创建处理程序;
  3. 创建代理类;

示例:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * Created by lay on 21/02/2018.
 */
public class ProxyDemo {

    public static void main(String[] args) {
        // 创建 被代理对象
        FooService fooService = new FooServiceImpl();
        // 实现 被代理对象 的处理程序
        InvocationHandler handler = new MyInvocationHandler(fooService);
        // 返回 代理对象
        FooService fooServiceProxy = (FooService) Proxy.newProxyInstance(fooService.getClass().getClassLoader(), fooService.getClass().getInterfaces(), handler);
        // 代理对象调用方法
        fooServiceProxy.getData();
    }
}
/**
 * 定义用户接口
 * Created by lay on 21/02/2018.
 */
public interface FooService {
    void getData();
}
/**
 * 实现用户接口
 * Created by lay on 21/02/2018.
 */
public class FooServiceImpl implements FooService {

    @Override
    public void getData() {
        System.out.println("调用了FooService实现类方法---getData...");
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 实现JDK动态代理接口
 * Created by lay on 21/02/2018.
 */
public class MyInvocationHandler implements InvocationHandler {

    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行前...");
        Object result =  method.invoke(target,args);
        System.out.println("执行后...");
        return result;
    }
}

 

以上是关于Java实现AOP切面(动态代理)的主要内容,如果未能解决你的问题,请参考以下文章

Java实现AOP切面(动态代理)

Java--Spring之AOP面向切面编程

AOP与JAVA动态代理

java的动态代理的两种方式和spring的aop面向切面编程的对比

3.AOP面向切面编程

3.AOP面向切面编程