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); }
我们在创建代理类对象的时候需要