Java 实现切面的技术
- 基于继承的切面。
- 基于代理的切面。
@Aspect
-
配合
@Before
、@After
、@Around
使用。-
这几个注解的意思显而易见。
-
@Aspect:作用是把当前类标识为一个切面供容器读取
@Around:环绕增强,相当于MethodInterceptor
@AfterReturning:后置增强,相当于AfterReturningAdvice,方法正常退出时执行
@Pointcut:Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。
@Before:标识一个前置增强方法,相当于BeforeAdvice的功能,相似功能的还有
@AfterThrowing:异常抛出增强,相当于ThrowsAdvice
@After: final增强,不管是抛出异常或者正常退出都会执行使用pointcut代码@DeclareParents 用于定义引介通知,相当于IntroductionInterceptor(不要求掌握)。
-
-
参数是什么?
- execution 切点表达式 拦截指定类的方法
@Pointcut
切入点声明注解,以及所有的通知注解都可以通过 value 属性或者 pointcut 属性指定切入点表达式。- 切入点表达式通过 execution 函数匹配连接点,语法:
execution([方法修饰符] 返回类型 包名.类名.方法名(参数类型) [异常类型])
- 访问修饰符可以省略;
- 返回值类型、包名、类名、方法名可以使用星号代表任意;
- 包名与类名之间一个点.代表当前包下的类,两个点…表示当前包及其子包下的类;
- 参数列表可以使用两个点…表示任意个数,任意类型的参数列表;
- 切入点表达式的写法比较灵活,比如:* 号表示任意一个,… 表示任意多个,还可以使用 &&、||、! 进行逻辑运算,不过实际开发中通常用不到那么多花里胡哨的,掌握以下几种就基本够用了。
- 通配符:
- * 匹配任意字符,但只能匹配一个元素
- … 匹配任意字符,可以匹配任意多个元素,表示类时,必须和*联合使用
+
必须跟在类名后面,如Horseman+,表示类本身和继承或扩展指定类的所有类
@Pointcut("@annotation(xx)")
拦截拥有指定注解的方法
- execution 切点表达式 拦截指定类的方法
-
例如:
-
@Pointcut("@annotation(com.example.yourannotationiface)") public void myPointCut(){} @Around(value="myPointCut()") public Object around(ProceedingJointPoint pjp){ // codes }
-