Java AOP

AOP本质:在不修改源代码的情况下添加功能。

动态代理使用的的两个类 Proxy和InvocationHandle

Proxy用于生成动态代理类

InvocationHandle用户处理代理实例,并返回结果

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

public class ProxyInvocationHandle implements InvocationHandler {
    private Object target;  // 需要代理的对象

    public void setTarget(Object target) {
        this.target = target;// 注入需要代理的对象
    }
    // 生成代理的对象
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    // 处理代理的实例并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object invoke = method.invoke(target, args);
        after();
        return invoke;
    }

    public void before(){
        System.out.println("添加执行代码之前的逻辑");
    }

    public void after(){
        System.out.println("添加执行代码之后的逻辑");
    }
}
public class Test {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();// 实例化需要被代理的对象
        ProxyInvocationHandle proxyInvocationHandle = new ProxyInvocationHandle();// 实例化代理对象
        proxyInvocationHandle.setTarget(userService); // 注入需要代理的对象
        UserService proxy = (UserService) proxyInvocationHandle.getProxy();// 获取代理的对象
        proxy.getUserById(1); // 执行被代理之后的方法
    }
}

 

上一篇:Mybatis源码流程剖析


下一篇:Java的静态代理和动态代理