spring aop原理 InvocationHandler Proxy

spring aop是基于spring IOC容器来管理以及使用了JDK自身的动态代理来实现,程序运行时在被切面前后动态进行的一些逻辑处理。

 

package com.daosheng.component;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * JDK动态代理的实现
 * 实现InvocationHandler接口,重写invoke方法
 * @author fanghb
 *
 */
public class LogIntercepter implements InvocationHandler{
    /**
     * 声明目标对象也就是被代理对象
     */
    private Object target;
    
    /**
     * 获得代理对象,
     * 这个代理对象是由传入的接口类型动态构造出来的一个代理类实例类型,
     * 这个代理类是JVM在内存中动态构造的动态类
     * 
     * tar.getClass().getClassLoader()    代理类加载器需和目标对象类加载器一致
     * tar.getClass().getInterfaces()     代理对象需实现目标对象所实现的接口
     * this                               调用此方法对象本身
     * @param tar                         被代理对象
     * @return
     */
    public Object getProxy(Object tar) {
        this.target = tar;
        Object proxy = Proxy.newProxyInstance(tar.getClass().getClassLoader(),
                tar.getClass().getInterfaces(), this);
        return proxy;
    }
    
    /**
     * 此方法在被代理对象的方法被调用之前触发,
     * 可以对被代理类方法调用的前后进行一些逻辑处理
     * 
     * @param proxy       代理对象
     * @param method      当前被调用的方法
     * @param args        当前被调用的方法参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object result = null;
        before(method);//被代理类方法调用前的逻辑处理
        try {
            result = method.invoke(target, args);//调用被代理类方法
        } catch (Exception e) {
            e.printStackTrace();
        }
        after(method);//被代理类方法调用后的逻辑处理
        return result;
    }
    
    /**
     * 被代理类方法调用前后的逻辑处理
     * 
     * @param m        当前被调用的方法
     */
    public void before(Method method) {//预处理
        System.out.println("织入预处理逻辑到" + method.getName() + "方法");
    }    
    public void after(Method method) {//后处理
        System.out.println("织入后处理逻辑到" + method.getName() + "方法");
    }

}

 测试:

 

 

package com.daosheng.service;  
  
import com.daosheng.component.LogIntercepter;  
import com.daosheng.pojo.User;  
import com.daosheng.service.impl.UserServiceImpl;  

//测试  
public class LogIntercepterTest {    
    public static void main(String[] args) {   
        LogIntercepter log = new LogIntercepter();  
        UserService proxy = (UserService) log.getProxy(new UserServiceImpl());  
        User user = new User();  
        proxy.saveUser(user);  
        System.out.println();  
        proxy.deleteUser(user);  
    }  
}

 输出:

 

织入预处理逻辑到saveUser方法  
user saved ...  
织入后处理逻辑到saveUser方法  
  
织入预处理逻辑到deleteUser方法  
user deleted ...  
织入后处理逻辑到deleteUser方法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值