• 概述
  • 实例
  • 总结

概述

Spring的流程切面由DefaultPointcutAdvisorControlFlowPointcut实现。 流程切点代表由某个方法直接或者间接发起调用的其他方法。


实例

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

package com.xgj.aop.spring.advisor.ControlFlowAdvisor;public class Waiter {public void greetTo(String name) {System.out.println("Waiter Greet To " + name);}public void serverTo(String name) {System.out.println("Waiter Server To " + name);}
}

我们通过一个WaiterDelegate类调用Waiter中的所有方法

package com.xgj.aop.spring.advisor.ControlFlowAdvisor;public class WaiterDelegate {private Waiter waiter;public void setWaiter(Waiter waiter) {this.waiter = waiter;}/*** * * @Title: service* * @Description: waiter类中方法的调用,通过该方法发起* * @param name* * @return: void*/public void service(String name) {waiter.greetTo(name);waiter.serverTo(name);}}

我们希望所有由WaiterDelegate .service方法发起调用的其他方法都织入GreetingBeforeAdvice前置增强,就必须使用流程切面来完成了。

编写增强

package com.xgj.aop.spring.advisor.ControlFlowAdvisor;import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;public class GreetingBeforeAdvice implements MethodBeforeAdvice {@Overridepublic void before(Method method, Object[] args, Object target)throws Throwable {// 输出切点System.out.println("Pointcut:" + target.getClass().getName() + "."+ method.getName());String clientName = (String) args[0];System.out.println("How are you " + clientName + " ?");}}

下面使用DefaultPointcutAdvisor配置一个流程切面来完成这一需求

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:p="http://www.springframework.org/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 目标类 --><bean id="waiterTarget" class="com.xgj.aop.spring.advisor.ControlFlowAdvisor.Waiter"/><!-- 增强 --><bean id="greetingBeforeAdvice" class="com.xgj.aop.spring.advisor.ControlFlowAdvisor.GreetingBeforeAdvice"/><!-- 流程切点   指定流程切点的类 和 流程切点的方法--><bean id="controlFlowPointcut" class="org.springframework.aop.support.ControlFlowPointcut"><constructor-arg type="java.lang.Class"  value="com.xgj.aop.spring.advisor.ControlFlowAdvisor.WaiterDelegate"/><constructor-arg type="java.lang.String" value="service"/> </bean><!-- 切面 --><bean id="controlFlowAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"p:pointcut-ref="controlFlowPointcut"p:advice-ref="greetingBeforeAdvice"/><!-- 代理类 --><bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean"p:interceptorNames="controlFlowAdvisor"p:target-ref="waiterTarget"p:proxyTargetClass="true"/></beans>

我们来看下ControlFlowPointcut

两个构造函数:

  • ControlFlowPointcut(Class<?> clazz) 指定一个类作为流程切点

  • ControlFlowPointcut(Class<?> clazz, String methodName) 指定一个类和某一个方法作为流程切点

我们这里指定com.xgj.aop.spring.advisor.ControlFlowAdvisor.WaiterDelegate中的service()方法作为流程切点,表示所有通过该方法直接或者间接发起的调用匹配切点。

编写测试类

package com.xgj.aop.spring.advisor.ControlFlowAdvisor;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class ControlFlowAdvisorTest {@Testpublic void test() {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/aop/spring/advisor/ControlFlowAdvisor/conf-controlFlowAdvisor.xml");Waiter waiter = ctx.getBean("waiter", Waiter.class);waiter.greetTo("XiaoGongJiang");waiter.serverTo("XiaoGongJiang");System.out.println("\n");WaiterDelegate waiterDelegate = new WaiterDelegate();waiterDelegate.setWaiter(waiter);waiterDelegate.service("XiaoGongJiang");}
}

运行结果:

2017-08-20 03:36:49,907  INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@76566fb: startup date [Sun Aug 20 03:36:49 BOT 2017]; root of context hierarchy
2017-08-20 03:36:50,020  INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/aop/spring/advisor/ControlFlowAdvisor/conf-controlFlowAdvisor.xml]
Waiter Greet To XiaoGongJiang
Waiter Server To XiaoGongJiangPointcut:com.xgj.aop.spring.advisor.ControlFlowAdvisor.Waiter.greetTo
How are you XiaoGongJiang ?
Waiter Greet To XiaoGongJiang
Pointcut:com.xgj.aop.spring.advisor.ControlFlowAdvisor.Waiter.serverTo
How are you XiaoGongJiang ?
Waiter Server To XiaoGongJiang

我们在测试类中直接调用了greetTo和serverTo,此时增强并没有起作用,
我们通过WaiterDelegate的service调用Waiter中的greetTo和serverTo,,可以看到Waiter的两个方法都织入了增强


总结

流程切面和动态切面从某种城都说说可以算是一类切面,因为二者都需要在运行期判断动态的环境。 对于流程切面来讲,代理对象那个在每次调用目标类方法时,都需要判断方法调用堆栈中是否有满足流程切点要求的方法,和动态切面一样,对性能的影响很大.

Spring-AOP 流程切面相关推荐

  1. java切面不需要接口了吗_详解Spring AOP 实现“切面式”valid校验

    why: 为什么要用aop实现校验? answer: spring mvc 默认自带的校验机制 @Valid + BindingResult, 但这种默认实现都得在Controller方法的中去接收B ...

  2. Java绝地求生—Spring AOP面向切面编程

    Java绝地求生-Spring AOP面向切面编程 背景 动态代理 构建被代理对象 自动生成代理 调用动态代理 Spring方法 方式一:使用Spring的API接口 方式二:使用自定义类 方式三:使 ...

  3. Spring AOP 面向切面编程

    AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件 ...

  4. Spring AOP(面向切面编程)

    AOP(Aspect Oriented Programming),也就是面向切面编程,作为面向对象编程的一种补充,AOP已经成为一种比较成熟的编程方式.可以这样理解:OOP是从静态角度考虑程序结构,而 ...

  5. Spring: Spring AOP 方面/切面(Aspect)

    1.美图 2.概述 概念参考:Spring :Spring AOP 中的一些术语 由于增强包括横切代码,又包含部分连接点信息(方法前.方法后主方位信息),所以可以仅通过增强类生成一个切面. 但切点仅仅 ...

  6. java框架013——Spring AOP面向切面编程

    一.Spring AOP简介 AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程).它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编 ...

  7. Spring AOP面向切面编程

    AOP面向切面编程: AOP(Aspect Oriented Programming),即面向切面编程,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公 ...

  8. JavaEE——Spring AOP(面向切面编程)

    目录 1.面向切面编程(AOP) 2.AOP术语 3.AOP类型 4.AOP 的优势 5.Spring AOP 的代理机制 6.Spring AOP 连接点 7.Spring AOP 通知类型 8.基 ...

  9. spring aop 中切面表达式规则

    spring AOP 可以通过两中方式配置: ①注解 (很简单) ②xml文件配置 这里通过说的通过xml 配置中的切面表达式 <!-- 配置事务切面 --> <aop:config ...

  10. Spring Aop面向切面编程自动注入

    1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...

最新文章

  1. 如何将四个一字节的数转换为一个四字节数
  2. python编程,外星人飞船
  3. QT | QT MSVC 2015 + VS 2015开发环境配置及GIT设置
  4. 1006 换个格式输出整数 (15 分)(c语言)
  5. java护照号码校验_SpringBoot如何优雅的校验参数
  6. 如何在Eclipse 3.3上安装jadclipse[java的反编译工具] 收藏
  7. latex支持python吗_用MarkDown和Python编写LaTex
  8. 2013 Office安装aurora公式编辑器
  9. python创建工作簿_【Python操作Excel】02_操作工作簿与工作表
  10. SQL经典50查询语句案例_5(查询没学过“叶平”老师课的同学的学号、姓名)
  11. 【合作伙伴大练兵-安全】NGFW盒式防火墙问题排查和维护
  12. web检查器要不要打开_简单粗暴,详细得不要不要的 JavaWeb快速入门
  13. windows查看tomcat版本信息
  14. 家庭NAS服务器(3)VM测试-固态缓存盘加速机械盘
  15. BT5 在线视频教程
  16. Win10 由于安装软件造成的开机蓝屏解决方法
  17. 计算机系lol口号,lol战队口号大全
  18. WEBRTC系列之基于IOS平台编译(一)
  19. 机器学习深度学习云GPU资源与对比
  20. 12-19个月阅读书目推荐(BY 丹丹)

热门文章

  1. 了解CUDA计算(一)
  2. 11. Leetcode 713. 乘积小于K的子数组 (数组-同向双指针-滑动窗口)
  3. 知识图谱 (知识计算推理)
  4. python笔记 xpinyin
  5. 错误处理:Syntax error: Bad for loop variable
  6. 机器学习笔记:ResNet 及残差连接
  7. Java高阶部分知识点汇总(一)- 成员变量与局部变量详讲
  8. MATLAB实战系列(二十一)-基于遗传算法的BP神经网络优化算法(附MATLAB代码)
  9. IDEA 2020.2 稳定版发布,带来了不少新功能...
  10. php 定义数字int,php中的int参数