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
    评论
Spring AOP(面向切面编程)的实现原理是基于动态代理技术。 在 Spring AOP 中,主要使用了两种类型的代理:JDK 动态代理和 CGLIB 代理。 1. JDK 动态代理: - 当目标类实现了至少一个接口时,Spring AOP 使用 JDK 动态代理。 - JDK 动态代理通过 Java 的反射机制在运行时动态创建代理对象。 - 在运行时,Spring AOP 根据目标类实现的接口信息,生成一个继承了 Proxy 类并实现了目标接口的代理类。 - 当目标方法被调用时,代理类会通过反射机制调用 InvocationHandler 接口的 invoke 方法,并在该方法中执行切面逻辑。 2. CGLIB 代理: - 当目标类没有实现任何接口时,Spring AOP 使用 CGLIB 代理。 - CGLIB 是一个强大的第三方库,能够在运行时生成目标类的子类来实现代理逻辑。 - 在运行时,Spring AOP 使用 CGLIB 创建一个目标类的子类,并在子类中覆盖目标方法,加入切面逻辑。 - 当目标方法被调用时,代理对象会直接调用子类中的方法,并执行切面逻辑。 Spring AOP 的核心是切面(Aspect)和连接点(Join Point)的概念: - 切面定义了要在特定连接点执行的切面逻辑。 - 连接点是在应用程序执行过程中可以应用切面的点,如方法调用、方法执行前后、异常处理等。 Spring AOP 通过切点(Pointcut)来确定连接点,将切面逻辑织入到切点所指定的连接点上,从而实现对目标对象的增强。 总结起来,Spring AOP 的实现原理是利用动态代理技术,在运行时动态生成代理对象,并将切面逻辑织入到目标对象的方法中。 希望能清晰地回答你的问题!如果还有疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值