spring知识五------AOP基础

Spring的两大核心—-DI和AOP。

AOP概念

Aspect Oriented Programming(AOP),面向切面编程。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。比如我们最常见的就是日志记录了。AOP 的主要编程对象是切面(aspect)

AOP简介

我们假设现在有一个计算器程序,是用来计算加减乘除的,此时我们有一需求:
–日志:在程序执行期间追踪正在发生的活动,记在方法执行进行日志打印

如果在传统的方式,我们需要找到这加减乘除四个方法,然后分别在方法题内进行日志的打印,这样的一种方式,代码如下

    @Override
    public int add(int i, int j) {
        System.out.println("ATGU---->The methor add begin with ["+i+","+j+"]");
        int result = i+j;
        System.out.println("ATGU---->The method add ends with "+result);
        return result;
    }

    @Override
    public int sub(int i, int j) {
        System.out.println("The methor sub begin with ["+i+","+j+"]");
        int result = i-j;
        System.out.println("The method sub ends with "+result);
        return result;
    }

    @Override
    public int mul(int i, int j) {
        System.out.println("The methor mul begin with ["+i+","+j+"]");
        int result = i*j;
        System.out.println("The method mul ends with "+result);
        return result;
    }

    @Override
    public int div(int i, int j) {
        System.out.println("The methor div begin with ["+i+","+j+"]");
        int result = i/j;
        System.out.println("The method div ends with "+result);
        return result;
    }

这时,我们从上面可以发现,我们重复了许多相同的日志代码,而且代码看起来非常混乱,甚至日志代码都已经远远超过了我们的核心代码,况且,如果在后期我们需要对日志内容进行修改,会非常麻烦,需要在每一个方法模块体内都进行修改。这样做真的而是费事费力。

在这种情况下,我们可以利用动态代理进行日志的打印
代理设计模式的原理: 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象. 任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上。但是使用代理过于复杂。

在这种情况下,利用spring给我们提供的AOP功能,我们可以使业务模块更简洁, 只包含核心业务代码,而且由于切面位於单独的类中,代码不分散, 便于维护和升级。

这里写图片描述

AOP术语

切面(Aspect): 横切关注点被模块化的特殊对象(logging切面),这样的话,就可以将一个切面应用到多个模块。
通知(Advice): 切面必须要完成的工作,是我们切面功能的实现,就好比上图的日志方法的实现。
目标(Target): 被通知的对象,即那些模块将要调用通知。
代理(Proxy): 向目标对象应用通知之后创建的对象。
连接点(Joinpoint):程序执行的某个特定位置:如类某个方法调用前、调用后、方法抛出异常后等。连接点由两个信息确定:方法表示的程序执行点;相对点表示的方位。例如 ArithmethicCalculator#add() 方法执行前的连接点,执行点为 ArithmethicCalculator#add(); 方位为该方法执行前的位置。
切点(pointcut):每个类都拥有多个连接点:例如 ArithmethicCalculator 的所有方法实际上都是连接点,即连接点是程序类中客观存在的事务。AOP 通过切点定位到特定的连接点。类比:连接点相当于数据库中的记录,切点相当于查询条件。切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。

AspectJ

Aspectj专门产生动态代理的一个框架,spring的aop使用了这个动态代理,他也是Java 社区里最完整最流行的 AOP 框架。

在 Spring 中启用 AspectJ 注解支持
1、要在 Spring 应用中使用 AspectJ 注解, 必须在 classpath 下包含 AspectJ 类库: aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar,而且我们还要在配置文件中增加aop命名空间。
2、要在 Spring IOC 容器中启用 AspectJ 注解支持, 只要在 Bean 配置文件中定义一个空的 XML 元素 【aop:aspectj-autoproxy】,当 Spring IOC 容器侦测到 Bean 配置文件中的 【aop:aspectj-autoproxy】元素时, 会自动为与 AspectJ 切面匹配的 Bean 创建代理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章