Spring5----复习笔记4

今天继续更新我们的spring5复习笔记。

今天介绍AOP概念。

首先来介绍一下什么是AOP:

这里我举了个例子,比如我们在普通的用户登录板块,如果我们想要添加一些特殊的功能时,比如判断这个用户是管理员还是普通会员,如果我们一开始没有加这个功能,那我们想加入功能时就要修改我们的逻辑判断代码,这就破坏了设计模式中的封闭开放原则,是一种不好的修改方法。

但是如果我们引入了AOP,就可以解决这个问题了,我们可以在原有方法的基础上增加功能,不修改原有的代码也能实现功能的添加。

其实AOP底层采用了代理模式,接下来我将展示jdk的动态代理。

 我们可以发现当我们实现jdk的动态代理时,需要写一个接口,并用实现类实现这个接口。

接口:

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

    public String update(String id);
}

实现类:

public class UserDaoImpl implements UserDao{
    @Override
    public int add(int a, int b) {
        return a + b;
    }

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

代理对象代码:

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

    //1.把创建的是谁的代理对象,把谁传递来
    //有参构造进行传递
    Object obj;

    public UserDaoProxy(Object obj){
        this.obj = obj;
    }


    //增强的逻辑
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法之前
        System.out.println("在方法之前执行:" + method.getName() + "  传递的参数..." + Arrays.toString(args));

        //被增强的方法需要执行
        Object res = method.invoke(obj, args);
        System.out.println("原方法的返回值 : " + res);

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

        return res;
    }
}

客户端调用:

public static void main(String[] args) {
        //创建接口实现类的代理方法
        Class[] interfaces = {UserDao.class};
        UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(new UserDaoImpl()));

        int res = dao.add(1, 2);
        System.out.println(res);
        System.out.println("*********************8*****************");
        String update = dao.update("123");

        System.out.println(update);
    }

我们在创建代理类对象的时候需要

posted @ 2021-09-28 22:50  Apak陈柏宇  阅读(32)  评论(0编辑  收藏  举报