什么是AOP,AOP能做什么?AOP的特点,Spring AOP的实现( 二 )

*** 切面* 切入点和通知的抽象 (与面向对象中的 类 相似)* 定义 切入点和通知 (切入点定义了要拦截哪些类的哪些方法,通知则定义了拦截过方法后要做什么)*/@Component // 将对象交给IOC容器去实例化public class LogCut02 {public void cut(){}/*** 声明前置通知 并将通知应用到定义的切入点上* 目标类方法执行前 执行该通知* */public void before() {System.out.println("前置通知.....");} /*** 声明返回通知 并将通知应用到定义的切入点上* 目标类方法(无异常)执行后 执行该通知* */public void afterReturn() {System.out.println("返回通知.....");} /*** 声明最终通知 并将通知应用到定义的切入点上* 目标类方法(无异常或有异常)执行后 执行该通知* */6.3.2. 配置文件(spring.xml)public void after() {System.out.println("最终通知.....");} /*** 声明异常通知 并将通知应用到定义的切入点上* 目标类方法出现异常时 执行该通知*/public void afterThrow(Exception e) {System.out.println("异常通知....." + " 异常原因:" + e.getCause());} /*** 声明环绕通知 并将通知应用到切入点上* 方法执行前后 通过环绕通知定义相应处理* 需要通过显式调用对应的方法,否则无法访问指定方法 (pjp.proceed();)* @param pjp* @return*/public Object around(ProceedingJoinPoint pjp) {System.out.println("前置通知...");Object object = null;try {object = pjp.proceed();System.out.println(pjp.getTarget() + "======" + pjp.getSignature());// System.out.println("返回通知...");} catch (Throwable throwable) {throwable.printStackTrace();System.out.println("异常通知...");} System.out.println("最终通知...");return object;}}配置文件(spring.xml)
<!--aop相关配置--><aop:config><!--aop切面--><aop:aspect ref="logCut02"><!-- 定义aop 切入点 --><aop:pointcut id="cut" expression="execution(* com.xxxx.service..*.*(..))"/><!-- 配置前置通知 指定前置通知方法名 并引用切入点定义 --><aop:before method="before" pointcut-ref="cut"/><!-- 配置返回通知 指定返回通知方法名 并引用切入点定义 --><aop:after-returning method="afterReturn" pointcut-ref="cut"/><!-- 配置异常通知 指定异常通知方法名 并引用切入点定义 -->7. Spring AOP总结7.1. 代理模式实现三要素1. 接口定义2. 目标对象与代理对象必须实现统一接口3. 代理对象持有目标对象的引用 增强目标对象行为7.2. 代理模式实现分类以及对应区别1. 静态代理:手动为目标对象制作代理对象,即在程序编译阶段完成代理对象的创建2. 动态代理:在程序运行期动态创建目标对象对应代理对象 。3. jdk动态代理:被代理目标对象必须实现某一或某一组接口 实现方式 通过回调创建代理对象 。4. cglib 动态代理:被代理目标对象可以不必实现接口,继承的方式实现 。动态代理相比较静态代理,提高开发效率,可以批量化创建代理,提高代码复用率 。7.3. Aop 理解1. 面向切面,相比oop 关注的是代码中的层 或面2. 解耦,提高系统扩展性3. 提高代码复用7.4. Aop 关键词1. 连接点:每一个方法2. 切入点:匹配的方法集合3. 切面:连接点与切入点的集合决定了切面,横切关注点的抽象4. 通知:几种通知5. 目标对象:被代理对象6. 织入:程序运行期将切面应用到目标对象 并生成代理对象的过程7. 引入:在不修改原始代码情况下,在程序运行期为程序动态引入方法或字段的过程<aop:after-throwing method="afterThrow" throwing="e" pointcutref="cut"/><!-- 配置最终通知 指定最终通知方法名 并引用切入点定义 --><aop:after method="after" pointcut-ref="cut"/><!-- 配置环绕通知 指定环绕通知方法名 并引用切入点定义 --><aop:around method="around" pointcut-ref="cut"/></aop:aspect></aop:config>六、Spring AOP总结6.1. 代理模式实现三要素1. 接口定义
2. 目标对象与代理对象必须实现统一接口
3. 代理对象持有目标对象的引用 增强目标对象行为
6.2. 代理模式实现分类以及对应区别1. 静态代理:手动为目标对象制作代理对象,即在程序编译阶段完成代理对象的创建
2. 动态代理:在程序运行期动态创建目标对象对应代理对象 。
3. jdk动态代理:被代理目标对象必须实现某一或某一组接口 实现方式 通过回调创建代理对象 。
4. cglib 动态代理:被代理目标对象可以不必实现接口,继承的方式实现 。
动态代理相比较静态代理,提高开发效率,可以批量化创建代理,提高代码复用率 。


推荐阅读