spring学习--动态代理 实现 AOP切面编程

1.Auth 接口 
package com.springstudy.aop.proxy;

public interface Auth {

    int add(int i,int j);
    int sub(int i,int j);
    int mul(int i,int j);
    int div(int i,int j);
    
}
2.AuthImpl 实现 
package com.springstudy.aop.proxy;

public class AuthImpl implements Auth {

    @Override
    public int add(int i, int j) {
        return i + j;
    }

    @Override
    public int div(int i, int j) {
        return i / j;
    }

    @Override
    public int mul(int i, int j) {
        return i * j;
    }

    @Override
    public int sub(int i, int j) {
        return i - j;
    }

    
    
}
3.AuthLoggingProxy 代理类(动态代理核心代码)
package com.springstudy.aop.proxy;

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

public class AuthLoggingProxy {

    private Auth target;
    
    public AuthLoggingProxy(Auth target){
        this.target = target;
    }
    
    public Auth getLoggingProxy(){
        Auth proxy = null;
        
        //代理对象由那个类加载器负责加载
        ClassLoader loader = target.getClass().getClassLoader();
        //代理对象的类型,即代理对象中有哪些方法
        Class[] interfaces = new Class[]{Auth.class};
        //当调用代理对象的方法时执行一下方法中的内容
        InvocationHandler h = new InvocationHandler(){
            /*
             * (non-Javadoc)
             * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
             * proxy 正在被代理的对象,一般不在invoke方法中调用(会死循环)
             * method 正在被调用的方法
             * args 入参
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                String methodname =  method.getName();
                //日志
                System.out.println("The method " + methodname + "begins with " + Arrays.asList(args));
                //方法调用
                Object result = method.invoke(target, args);
                //日志
                System.out.println("The method " + methodname + "ends with " + result);
                return result;
            }
            
        };
        proxy = (Auth) Proxy.newProxyInstance(loader, interfaces, h);
        return proxy;
    }
    
}
4.Main 主类(测试用) 
package com.springstudy.aop.proxy;

/*
 * 动态代理    实现    AOP切面编程
 */
public class Main {

    public static void main(String[] args){

//        AuthImpl ai = new AuthImpl();
//        int result = ai.add(1, 2);
//        System.out.println(result);
//         result = ai.div(4, 2);
//        System.out.println(result);
        AuthImpl target = new AuthImpl();
        Auth proxy = (Auth) new AuthLoggingProxy(target).getLoggingProxy();
        
        int result = proxy.add(1, 2);
        System.out.println(result);
         result = proxy.div(4, 2);
        System.out.println(result);
    }
    
}

暂存代码,之后再做总结

package com.springstudy.aop.proxy;
public class AuthImpl implements Auth {
@Overridepublic int add(int i, int j) {return i + j;}
@Overridepublic int div(int i, int j) {return i / j;}
@Overridepublic int mul(int i, int j) {return i * j;}
@Overridepublic int sub(int i, int j) {return i - j;}
}

原文地址:https://www.cnblogs.com/yuntianblog/p/13404344.html