JDK动态代理实现AOP

JDK动态代理实现AOP


package com.example.demo;

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

// 接口
interface UserService {
    void addUser(String name);

    void delUser(String name);
}
// 实现类
class UserServiceImpl implements UserService {
    @Override
    public void addUser(String name) {
        System.out.printf("添加用户:%s", name);
    }

    @Override
    public void delUser(String name) {
        System.out.printf("删除用户:%s", name);
    }
}
// 切面类
class UserLogger {
    public void before() {
        System.out.println("---------------操作前");
    }

    public void after() {
        System.out.println("---------------操作完成");
    }

    public void afterThrowing() {
        System.out.println("---------------操作异常");
    }

    public void afterReturning() {
        System.out.println("---------------操作结束");
    }
}

// JDK动态代理的实现
class JDKProxy implements InvocationHandler {
    private Object targetObject; //目标对象

    public Object createProxyInstance(Object targetObject) {
        this.targetObject = targetObject;
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                targetObject.getClass().getInterfaces(),
                this);
    }

    public Object invoke(Object target, Method method, Object[] arg)
            throws Throwable {
        UserLogger userLogger = new UserLogger();//切面类
        try {
            //前置通知
            userLogger.before();
            // 调用目标方法
            Object obj = method.invoke(targetObject, arg);// 切入点
            userLogger.after();//后置通知
            return obj;
        } catch (RuntimeException e) {
            e.printStackTrace();
            userLogger.afterThrowing();//异常通知
        } finally {
            userLogger.afterReturning();//最终通知
        }
        return null;
    }
}

// 示例
public class Main {
    public static void main(String[] args) {
        JDKProxy proxy = new JDKProxy();
        UserService userService = (UserService) proxy.createProxyInstance(new UserServiceImpl());
        userService.addUser("a");
        userService.delUser("a");
    }
}