Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的.
Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. 
args()
@args()
execution()
this()
target()
@target()
within()
@within()
@annotation
其中execution 是用的最多的,其格式为:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
returning type pattern,name pattern, and parameters pattern是必须的.
ret-type-pattern:可以为*表示任何返回值,全路径的类名等.
name-pattern:指定方法名,*代表所以,set*,代表以set开头的所有方法.
parameters pattern:指定方法参数(声明的类型),(..)代表所有参数,(*)代表一个参数,(*,String)代表第一个参数为任何值,第二个为String类型.
举例说明:
任意公共方法的执行:
execution(public * *(..))
任何一个以“set”开始的方法的执行:
execution(* set*(..))
AccountService 接口的任意方法的执行:
execution(* com.unisists.service.AccountService.*(..))
定义在service包里的任意方法的执行:
execution(* com.unisists.service.*.*(..))
定义在service包和所有子包里的任意类的任意方法的执行:
execution(* com.unisists.service..*.*(..))
定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:
execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))")
***> 最靠近(..)的为方法名,靠近.*(..))的为类名或者接口名,如上例的JoinPointObjP2.*(..))

pointcutexp包里的任意类.
within(com.test.spring.aop.pointcutexp.*)
pointcutexp包和所有子包里的任意类.
within(com.test.spring.aop.pointcutexp..*)
实现了Intf接口的所有类,如果Intf不是接口,限定Intf单个类.
this(com.test.spring.aop.pointcutexp.Intf)
***> 当一个实现了接口的类被AOP的时候,用getBean方法必须cast为接口类型,不能为该类的类型.

带有@Transactional标注的所有类的任意方法.
@within(org.springframework.transaction.annotation.Transactional)
@target(org.springframework.transaction.annotation.Transactional)
带有@Transactional标注的任意方法.
@annotation(org.springframework.transaction.annotation.Transactional)
***> @within和@target针对类的注解,@annotation是针对方法的注解

参数带有@Transactional标注的方法.
@args(org.springframework.transaction.annotation.Transactional)
参数为String类型(运行是决定)的方法.
args(String)
Pointcut 可以通过Java注解和XML两种方式配置,如下所示:

1,在xml中注解

<aop:config>

<aop:aspectrefaop:aspectref="aspectDef">

<aop:pointcutidaop:pointcutid="pointcut1"expression="execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))"/>

<aop:before pointcut-ref="pointcut1" method="beforeAdvice" />

</aop:aspect>

</aop:config>

2,在通过Java注解

@Component

@Aspect

public class AspectDef {

//@Pointcut("execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))")

//@Pointcut("within(com.test.spring.aop.pointcutexp..*)")

//@Pointcut("this(com.test.spring.aop.pointcutexp.Intf)")

//@Pointcut("target(com.test.spring.aop.pointcutexp.Intf)")

//@Pointcut("@within(org.springframework.transaction.annotation.Transactional)")

//@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")

@Pointcut("args(String)")

public void pointcut1() {

}

@Before(value = "pointcut1()")

public void beforeAdvice() {

System.out.println("pointcut1 @Before...");

}

最新文章

  1. 判断json数据是否为空
  2. guava学习--事件驱动模型
  3. asp.net 页面的Meta元素
  4. xocde真机测试 内存查看
  5. poj 1383 Labyrinth
  6. Android开发之View动画效果插补器Interpolator
  7. 用PYTHON硬写SOCKET
  8. Mysql性能优化之缓存参数优化
  9. 设置Tomcat默认界面
  10. jsp 有哪些动作?作用分别是什么?
  11. android面试题之一
  12. Angular2之管道学习笔记
  13. 阿里云邮件服务器怎么设置才能在QQ邮箱访问,互发邮件?
  14. SpringBoot(六):springboot热部署
  15. Vue(五)Vue规范
  16. jenkins+Gitlab+maven+tomcat实现自动集成、打包、部署
  17. Linux下Oracle表空间及用户创建
  18. 理解Docker镜像分层
  19. Git错误:error: The following untracked working tree files would be overwritten by merge:
  20. C语言怎么简单测试为大小端模式

热门文章

  1. jtds链接SqlServer数据库(整合)
  2. 【mybatis】mybatis中的&lt;if test=“”&gt;test中多条件
  3. Go -- 升级go版本
  4. [置顶] kubernetes--应用程序健康检查
  5. sqlmap工具命令行的含义
  6. linux下rar包的解压方法
  7. 三分钟教你学Git(十三) - 二分查找
  8. linux获取后台进程的控制台数据
  9. python实现大文件分割与合并
  10. Vue mixins extend