首页 > 编程知识 正文

Pointcut 注解的使用,全局异常使用的注解

时间:2023-05-04 17:12:07 阅读:179843 作者:4263

AOP的基本概念

Advice (通知,切面) :某个连接点采用的处理逻辑,即注入连接点的代码,AOP通过特定切口进行的扩展处理。

1.1 @ before :识别与before advice功能相当的前置增强方法。

1.2 @After: final的增强无论是抛出异常还是正常结束都会被执行。

1.3 @AfterReturning :后置增强,类似于AfterReturningAdvice,在方法正常结束时执行。

1.4 @AfterThrowing :异常的加速相当于ThrowsAdvice。

1.5 @Around :环绕增强相当于MethodInterceptor。

JointPoint :程序运行中某个阶段的点,如调用方法或异常抛出。

点:连接点的集合。 程序中需要注入Advice的位置集合,给出了Advice在什么条件下触发,程序中主要表现为编写切口公式。

advisor(enhanced ) :是PointCut和Advice的综合体,完全描述了在由PointCut定义的位置触发Advice。

@Aspect (切面) :通常是可以定义切口和通知的类的注释

AOP proxy :由AOP框架创建的对象。 代理是目标对象的强化。 Spring的AOP代理可以使用JDK动态代理或CGLIB代理。 前者是基于接口的,后者是基于子类的。

AOP : AspectJ-auto proxy/AOP :配置proxy-target-class=' true ' AOP : pointcut id=' service pointcut ' express AOP : advisor pointcut-ref=' service pointcut ' advice-ref=' tx advice ' order='3'//AOP : config tx : advice id=' tx advice ' transaction-manager=' tx 3360 attributes tx 3360 method name-manager 0 method name=' log * ' propagation=' requires _ new ' isolation=' read _ committed '/tx 333

表达式(expression和签名) signature ) )。

//Pointcut表达式@pointcut((execution ) com.savage.AOP.messagesender.* () ) )//Point为private void log ) ) 像、这样组合。

执行:用于执行匹配方法的连接点; within :用于匹配指定类型中的方法执行; this :用于匹配当前AOP代理对象类型的执行方法; 请注意,AOP代理对象的类型匹配。 这可能包括部署接口的类型也匹配。 target :用于匹配当前目标对象类型的执行方法; 请注意目标对象的类型匹配。 这样就不再包含部署接口和类型匹配。 args :指定要传递以匹配当前执行的方法的参数的类型的执行方法; @within :包含指定注释类型中用于匹配的方法; @target :用于匹配具有给定注释的当前目标对象类型的执行方法; @args :为匹配当前正在执行的方法而传递的参数具有指定注释的执行; @annotation (具有与当前正在执行的方法匹配的指定注释的方法; 格式

执行(modifiers-pattern )? ret-type-pattern declaring-type-pattern? 名称-参数(param-pattern ) throws-pattern? 其中有"? ”后面是可选括号中的每个pattern,表示:

修饰符匹配? )返回值匹配(ret-type-pattern ) )可以为*表示任何返回值,类路径匹配(如完整路径的类名) declaring-type-pattern? )方法名称匹配(name-pattern ) :可以指定方法名称,也可以表示全部。 set表示以set开头的所有方法参数的匹配(

(param-pattern)):可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用"" 来表示匹配任意类型的参数,"…"表示零个或多个任意参数。
如(String)表示匹配一个String参数的方法;(,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型。异常类型匹配(throws-pattern?)

eg.

任意公共方法的执行:execution(public * *(…))任何一个以“set”开始的方法的执行:execution(* set*(…))AccountService 接口的任意方法的执行:execution(* com.xyz.service.AccountService.*(…))定义在service包里的任意方法的执行: execution(* com.xyz.service..(…))定义在service包和所有子包里的任意类的任意方法的执行:execution(* com.xyz.service….(…))
第一个表示匹配任意的方法返回值, …(两个点)表示零个或多个,第一个…表示service包及其子包,第二个表示所有类, 第三个*表示所有方法,第二个…表示方法的任意参数个数定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:execution(* com.test.spring.aop.pointcutexp…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)

 

 

 

 

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。