第八讲 面向切面编程--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子类就可以了,前面方法写了就表示,对特定的方法发生了异常后后面异常类抛出的异常