三、面向切面编程(11~16)

第八讲  面向切面编程--aop

课时11、12  aop简介+使用springAPI实现aop

1、aop:aspect oriented programming 面向切面编程

2、aop在spring中作用

  提供声明式事务服务(声明式事务)

  允许用户实现自定义切面

3、aop:在不改变原有代码的情况下增加新的功能。

  传统的编程模式:

Aop的编程模式:横向的编程

aop的好处:(代理的好处就是aop的好处)

  a)使得真实角色处理的业务更加纯粹,不再去关注一些公共的事情。

  b)公共的业务由代理来完成---实现业务的分工

  c)公共业务发生扩展时变得更加集中和方便

4、名词解释

      关注点:增加的某个业务。如日志,安全,缓存,事务,异常处理等。(例:在前面代码的代理类的方法中增加了log();方法,那么这个方法就是一个关注点,对于这个方法我们有更好的处理,下面~~)

   切面(Aspect):一个关注点的模块化。(上面log()算是一个日志关注点,但是这个关注点,我们可以将这个方法封装到一个类里面,形成切面,因为可能在方法前面和方法后面都要使用这个方法)

   连接点:连接点表示一个方法的执行,切面在连接点上切入(如:add(); delete(); update(); select()方法是连接点)

   通知:在切面的某个特定的连接点上执行的动作是通知(其实这都是有迹可循的,例如log();是在目标方法执行前执行把它称为关注点,spring把它整理出来了前置通知,后置通知,异常通知,环绕通知,可以认为通知是一个特定的连接点)(也是一个过程,一个动作)

  目标对象:被代理的对象就叫目标对象(如前面写的推广到一般情况下的Object target)

  织入:把切面连接到其它应用程序类型或者对象上,并创建一个被通知的对象(有几种类型,上面).(其实是一个过程)

  综上,只有三个概念  1.关注点------模块化--->2.切面     3.连接点

  再综上,只有切面,连接点两个概念。

5、使用spring实现aop

   第一种实现方式--通过springAPI来实现

这个spring的aop项目结构如下,下面是代码

 Log.java---前置通知

/**
 * 现在做的内容是实现spring的第一种实现aop的方式,spring有很多种实现aop的方式
 * spring里面有很多种通知类型
 * 1、拦截环绕通知(最基础通知类型) 切面 继承Interceptor类或实现MethodInterceptor接口
 *         需要导入aopalliance包,织入中的aspectjwaver包
 * 2、前置通知    (本次演示的内容)
 * 3、异常通知
 * 4、后置通知
 * 5、引入通知
 * 6、
 * 现在这个log就是单独提取出来的了,它就是一个关注点模块化,现在可以称之为切面
 * @author 2568833032
 *
 */
public class Log implements MethodBeforeAdvice{
    /**
     * @param method 指的是被调用方法对象(相当于add(); update();delete();这些,就是切入点方法)
     * @param args 被调用的方法的参数
     * @target target 目标对象(被代理的目标对象,被调用方法的目标对象)
     * 在前置增强方法里面获取到这个方法信息
     * 下面要在applicationcontext.xml==beans.xml里面对其进行配置了aop的命名空间了
     */
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println(target.getClass().getName()+"的"+method.getName()+"方法被执行");
    }
}

AfterLog.java---后置通知

 * 这个类是为了做后置增强的演示的,相比Log类它实现了后置增强的接口
 */
public class AfterLog implements AfterReturningAdvice{
    /**
     * 目标方法执行后执行的通知
     * @param returnValue 返回值
     * @param method 被调用的方法对象
     * @param args 被调用方法对象的参数
     * @param target 被调用的方法对象的目标对象
     */
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println(target.getClass().getName()+"的"+method.getName()
        +"被成功执行,返回值是:"+returnValue);
        //现在后置通知的内容实现了,那么接下来在后面多加一个配置就可以了
    }
}

目标类-----连接点

spring的配置文件beans.xml

最后测试类代码

课时13:aop再解释

 aop的重要性---很重要

Spring aop就是将公共的业务(如日志、安全等)和领域业务结合。当执行领域业务(什么是领域业务?比喻我是干电信行业的,我是干金融的,不同的领域,也叫领域模型)时将会把公共业务加进来。实现公共业务的重复利用。领域业务更纯粹,程序员专注于领域业务。其本质还是动态代理(以后单独写aop的不太多)

第二种方式实现aop:自定义类实现aop(课时14)

 本次项目的目录结构是

log.java

业务接口及其实现类没有改变,和上面代码一样

配置文件

测试类及测试结果

 

 第三种方式实现aop:通过注解来实现(AOPannotation)

 Log.java

配置文件

测试结果

课时16:回顾

          补充一下异常通知

实现ThrowsAdvice接口,这个接口有一个方法

这个方法有一个参数带中括号,可以写可以不写,后面一个参数只要是一个throwable子类就可以了,前面方法写了就表示,对特定的方法发生了异常后后面异常类抛出的异常

原文地址:https://www.cnblogs.com/djlindex/p/11365877.html