展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

spring5入门(十二):AOP动态代理

  • 使用 JDK 动态代理,使用 Proxy 类里面的方法创建代理对象

  • 参数简介
第一参数,类加载器
第二参数,增强方法所在的类,这个类实现的接口,支持多个接口
第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分
  • 具体实现代码
public class JDKProxy {

    public static void main(String[] args) {
        //创建接口实现类代理对象
        Class[] interfaces = {UserDao.class};
        UserDaoImpl userDao = new UserDaoImpl(); // 相当于下面的new代理对象
        UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
        int result = dao.add(1, 2);
        System.out.println("result:"+result);
    }

}

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

    //1 把创建的是谁的代理对象,把谁传递过来
    //有参数构造传递
    private 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("方法之后执行...."+obj);
        return res;
    }

}

# 控制台
方法之前执行....add :传递的参数...[1, 2]
add方法执行了.....
方法之后执行....com.ychen.spring.dao2.UserDaoImpl@3c09711b
result:3

Process finished with exit code 0
  • aop基本概念
连接点:类里面有哪些方法可以被增强,这些方法就被称为连接点
切入点:类里面真正被增强的方法称为切入点
通知:对方法添加的逻辑部分
通知类型:
  前置通知
  后置通知
  环绕通知
  异常通知
  最终通知
切面:把通知应用到切入点的过程
  • aop操作准备
  • AspectJ简介
AspectJ 不是 Spring 组成部分,独立 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使
用,进行 AOP 操作
  • 导入所需依赖

  • 切入点表达式

切入点表达式作用:知道对哪个类里面的哪个方法进行增强
语法结构: execution([权限修饰符] [返回类型] [类全路径] [方法名称]([参数列表]) )
  • 切入点表达式案例
案例1:对 com.atguigu.dao.BookDao 类里面的 add 进行增强
execution(* com.atguigu.dao.BookDao.add(..))

案例2:对 com.atguigu.dao.BookDao 类里面的所有的方法进行增强
execution(* com.atguigu.dao.BookDao.* (..))

案例3:对 com.atguigu.dao 包里面所有类,类里面所有方法进行增强
execution(* com.atguigu.dao.*.* (..))
posted @ 2022-04-19 15:16  DogLeftover  阅读(28)  评论(0编辑  收藏  举报