SpringAOP_1(新手)和Proxy笔记和理解

1

AOP

1.概念

  • AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

  • AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

  • 使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

  • 好处:
    1.每个事物逻辑位于一个位置,代码不分散,便于维护和升级
    2.业务模块更加简洁。只包括核心业务代码

2.解决的问题:

  • 代码混乱:
    越来越多的非业务需求(日志和验证等)加入后,原有的业务方法急速膨胀,每个方法咋子处理核心逻辑的同时还必须兼顾其他多个关注点
  • 代码分散:
    例如日志需求,只是为了满足这个单一需求,就不得不在多个模块里重复相同的日志代码,如果日志需求发生变化,必须修改所有模块

3.解决方式:

  • 动态代理(Proxy):
    原理:使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象调用都要通过代理,代理独享决定是否以及何时将方法调用转到原始对象
    这里简单的叙述一下Proxy ,因为是原理,很麻烦

  • 步骤:
    1.创建被代理对象:

//要代理的对象
    private Calculator calculator;


    public  Dynamic_proxy_Caculator (Calculator calculator) {
        this.calculator=calculator;
    }
2.创建Proxy并使用newProxyInstance方法
 Calculator calculatorProxy = null;

          //需要告诉代理对象由哪一个类加载器加载
          ClassLoader classLoader = calculator.getClass().getClassLoader();
          //代理对象有哪些方法
          Class<?>[] interfaces = calculator.getClass().getInterfaces();

          //invocationHandler代理方法,执行代码逻辑
            calculatorProxy = (Calculator) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
             /*
                invoke参数:
                          proxy:正在返回的那个代理对象,一般情况下,在invoke方法中不适用该对象
                                 原因: 当你调用proxy这个对象的时候,难免会调用它的方法,它来自于invoke,造成的结果就是无限循环
                          method:正在被调用的方法
                          args:调用方法时,传入的参数

              */
              @Override
              public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                  System.out.println(method.getName());
                  System.out.println(args);

                  System.out.println("invoke");

                  Object invoke = method.invoke(calculator, args);
                  System.out.println(invoke);
                  return 0;
              }
          });

       

Proxy一般用来加强方法,我理解的原理就是把你需要代理的对象的类加载器和方法接口的数组告诉他,在通过InvocationHandler的方法来操作,传入的是被代理对象,传出的是代理对象,你没有改变任何你的被代理对象,你通过proxy来加强或者来改变你想要的逻辑行为,当你的对象执行任何代码都会执行图中的invoke。

关于aop图解:

在这里插入图片描述

  • 横切关注点:所需的逻辑行为和功能,例如图中的:蓝色图块
  • 切面:切点和通知的集合
  • Aop=切面+业务逻辑
  • 通知:切面要完成的工作(实际增强的逻辑部分)
  • 目标:被通知的对象,图上的业务逻辑
  • 代理:也就是proxy.newinstence返回的对象
  • 连接点 :程序执行的某个特定位置,它有两个信息确定:方法表示的程序执行点,相对点表示的方位,例如:add()这个方法执行前的连接点,执行点为add(),方位为该方法执行前的位置
  • 切点:每个类都拥有多个连接点,连接点是程序类中客观存在的事务,AOP通过切点定位到特定的连接点。类比:连接点相当于数据中的记录,切点相当于查询条件,切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过Pointcut接口进行描述,他使用类和方法作为连接点的查询条件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值