[Spring5]AOP底层原理

Posted 唐火

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Spring5]AOP底层原理相关的知识,希望对你有一定的参考价值。

AOP底层原理

1.AOP底层使用动态代理

(1)有两种情况动态代理

第一种 有接口的情况,使用JDK动态代理

a.创建接口实现类代理对象,增强类的方法

第二种 没有接口的情况,使用CGLIB动态代理

a.创建子类的代理对象,增强类的方法

AOP(JDK动态代理)

1.使用JDK动态代理,使用java.lang包中的Proxy类里面的方法创建代理对象

(1)调用newProxyInstance方法

方法有三个参数:

第一个参数,类加载器

第二个参数,增强方法所在的类,这个类实现的接口,支持多个接口

第三个参数,实现这个接口InvocationHandler,创建代理对象,写增强的部分

2.编写JDK动态代理代码

(1)创建接口,定义方法

package com.atguigu.spring.dao;

public interface UserDao 
    public int add(int a,int b);

    public String update(String id );



(2)创建接口实现类,实现方法

package com.atguigu.spring.dao;


public class UserDaoImpl implements UserDao 

    @Override
    public int add(int a, int b) 
        return a+b;
    

    @Override
    public String update(String id) 
        return id;
    


(3)使用Proxy类创建接口代理对象

package com.atguigu.spring.dao;

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

public class JDKProxy 
    public static void main(String[] args)
    
        //创建接口实现类代理对象
        Class[] interfaces = UserDao.class;

        UserDaoImpl userDao = new UserDaoImpl();

        UserDao dao = (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));

        int  result = dao.add(1, 2);
        System.out.println(result);
    


//创建代理对象代码
class UserDaoProxy implements InvocationHandler


    //1.创建的是谁的代理对象,把谁传递过来
    //有参构造传递
    private Object obj;
    public UserDaoProxy(Object obj)
    
        this.obj = obj;
    


    //增强的逻辑
    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable 

        //方法之前
        System.out.println("方法之前执行..."+method.getName()+"传递的参数..."+ Arrays.toString(objects));
        //被增强的方法执行
        Object res = method.invoke(obj, objects);
        //方法之后

        System.out.println("方法之后执行..."+obj);


        return res;
    

以上是关于[Spring5]AOP底层原理的主要内容,如果未能解决你的问题,请参考以下文章

Spring5学习笔记 — “Spring AOP底层原理(动态代理)”

spring5:AOP操作

Spring_11-Spring5总结

Spring | Spring5学习笔记 #yyds干货盘点#

Spring5 AOP 学习笔记

架构师 之 狂刷小视频Spring5