2019独角兽企业重金招聘Python工程师标准>>>

在编写 AspectJ 切面时, 可以直接在通知注解中书写切入点表达式. 但同一个切点表达式可能会在多个通知中重复出现.

在 AspectJ 切面中, 可以通过 @Pointcut 注解将一个切入点声明成简单的方法. 切入点的方法体通常是空的, 因为将切入点定义与应用程序逻辑混在一起是不合理的.

切入点方法的访问控制符同时也控制着这个切入点的可见性. 如果切入点要在多个切面中共用, 最好将它们集中在一个公共的类中. 在这种情况下, 它们必须被声明为 public. 在引入这个切入点时, 必须将类名也包括在内. 如果类没有与这个切面放在同一个包中, 还必须包含包名.

其他通知可以通过方法名称引入该切入点.

好吧,我们之前提过连接点、切点的定义。现在还能分清吗?如果这里需要做个分辨,那么你可以将切点理解为切点表达式,连接点为各个通知的JointPoint参数。

我们看两个切面的定义,其中一个切面的类方法中有一个方法用于声明切点表达式,这样该切点类的其他通知都可以使用这个方法来注解各个通知的切点表达式;其他切点的通知也可以只用,但要写清类名。

package com.happBKs.spring.aopbasic.aop1;import java.util.Arrays;
import java.util.List;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Order(Integer.MAX_VALUE)
@Aspect
@Component
public class DataValidateAspect {/** 定义一个方法用于声明切点表达式。一般的,该方法中再也不需要添加其他代码* 使用@Pointcut注解声明切点表达式*/@Pointcut("execution(public int com.happBKs.spring.aopbasic.aop1.AtithmeticCalculate.*(..))")public void declarePointCut(){}@Before("declarePointCut()")public boolean beforeMethod(JoinPoint joinPoint){String methodName=joinPoint.getSignature().getName();List<Object> args=Arrays.asList(joinPoint.getArgs());System.out.println("data validate---begin to "+methodName+" with "+args);if((Integer)(args.get(0))>0&&(Integer)(args.get(1))>0){System.out.println("data is OK");return true;}else{System.out.println("data is bad");return false;}}}
package com.happBKs.spring.aopbasic.aop1;import java.util.Arrays;
import java.util.List;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Aspect
@Component
public class DataValidateAspect2 {@Before("com.happBKs.spring.aopbasic.aop1.DataValidateAspect.declarePointCut()")public boolean beforeMethod(JoinPoint joinPoint){String methodName=joinPoint.getSignature().getName();List<Object> args=Arrays.asList(joinPoint.getArgs());System.out.println("data validate 2---begin to "+methodName+" with "+args);if((Integer)(args.get(0))<10000&&(Integer)(args.get(1))<10000){System.out.println("data is OK");return true;}else{System.out.println("data is bad");return false;}}}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"><context:component-scan base-package="com.happBKs.spring.aopbasic.aop1"></context:component-scan><!-- 使用AspectJ注解起作用。自动为匹配的类生成代理对象  --><aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>

测试代码:

@Testpublic void testSpringAOP(){//1. 创建spring 的 IOC 容器ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//2. 从IOC容器获取bean实例AtithmeticCalculate atithmeticCalculate = (AtithmeticCalculate)ac.getBean(AtithmeticCalculate.class);//考察一下代理对象是否生成System.out.println(atithmeticCalculate.getClass().getName());//3. 使用beanSystem.out.println("Example 1:");int result=atithmeticCalculate.add(10, 5);System.out.println(result);
//      System.out.println("\r\nExample 2:");
//      int result2=atithmeticCalculate.div(10, 0);
//      System.out.println(result2);}

输出结果:

com.sun.proxy.$Proxy10

Example 1:

data validate---begin to add with [10, 5]

data is OK

data validate 2---begin to add with [10, 5]

data is OK

15

转载于:https://my.oschina.net/happyBKs/blog/483829

Spring框架笔记(二十二)——切点表达式的重用相关推荐

  1. Spring Cloud学习笔记【十二】Hystrix的使用和了解

    Spring Cloud学习笔记[十二]Hystrix的使用和了解 Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Net ...

  2. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  3. 学习笔记:CentOS7学习之二十二: 结构化命令case和for、while循环

    目录 学习笔记:CentOS7学习之二十二: 结构化命令case和for.while循环 22.1 流程控制语句:case 22.2 循环语句 22.1.2 for-do-done 22.3 whil ...

  4. 《深入浅出DPDK》读书笔记(十二):DPDK虚拟化技术篇(半虚拟化Virtio)

    Table of Contents 半虚拟化Virtio 132.Virtio使用场景 133.Virtio规范和原理 11.2.1 设备的配置 1. 设备的初始化 2. 设备的发现 3. 传统模式v ...

  5. 深度学习入门笔记(十二):深度学习数据读取

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  6. GUI的演化和python编程——Python学习笔记之二十二

    GUI的演化和python编程--Python学习笔记之二十二 写完了有关长寿的两篇博文,本该去完成哥德尔那个命题六的.对计算机图形界面的好奇,让我把注意力暂时离开那个高度抽象难读的哥德尔,给转到计算 ...

  7. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  8. Windows保护模式学习笔记(十二)—— 控制寄存器

    Windows保护模式学习笔记(十二)-- 控制寄存器 控制寄存器 Cr0寄存器 Cr2寄存器 Cr4寄存器 控制寄存器 描述: 控制寄存器有五个,分别是:Cr0 Cr1 Cr2 Cr3 Cr4 Cr ...

  9. OllyDbg 使用笔记 (十二)

    OllyDbg 使用笔记 (十二) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 演示样例程序下载地址:http://pan.baidu.com/s/1eQiV6aI 安装好程序 ...

  10. 汇编入门学习笔记 (十二)—— int指令、port

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...

最新文章

  1. 只有一流的人才能干出一流的工作,只有具备大量一流的人才的企业才能成为一流的企业...
  2. 单例Singleton
  3. 哪个瞬间你对科研圈彻底失望了?
  4. 2014-06-25nbsp;20:39
  5. 幻兽天下修复版java_宠物天下四-幻兽天下
  6. java基础相关面试题
  7. 几个安卓 app 暴露超1亿用户的数据
  8. mybatis --XML 映射配置文件
  9. SMPP协议,CMPP协议是啥子
  10. 【论文复现】ReLU、Leaky ReLU、PReLU、RReLU实验对比(2015)
  11. svn代码量统计工具StatSVN的使用
  12. uni-app 打包小程序体验版
  13. DRM驱动(二)之DRM驱动模块简介
  14. [云开发3]-将问卷调查Demo应用快速部署到SAP云平台
  15. SpringMVC数据校验、文件上传
  16. Pasqal首席技术官:模拟量子计算率先为工业带来量子优势
  17. 云从科技资深算法研究员:详解跨镜追踪(ReID)技术实现及难点 | 公开课笔记
  18. 通过层序和中序遍历序列重建二叉树
  19. android4.42 版本k2x,斐讯K1 K2最新v22.4.x以上版本通用刷第三方固件教程
  20. 文件上传漏洞——upload-labs 1-19 (详解)

热门文章

  1. 计算机课搞事情检讨,上微机课玩游戏检讨书
  2. linux可执行文件格式
  3. 一个鸡蛋”改变TA的世界——让贫困地区的孩子每天都能吃上一个鸡蛋
  4. 伦敦银行 如何计算利息
  5. spring boot (3.自动配置@enableautoconfiguration)
  6. 手机号码、获得当前时间,下拉框,填写限制
  7. scala类型推断及库方法设计原则和==与java有何差别
  8. WinForm实现类似QQ停靠,显示隐藏过程添加特效效果
  9. JavaScriptSerializer类
  10. 不负众望,窝窝世界新版放出(内测):P