Spring-AOP
参考链接
Spring AOP介绍(切面编程)
AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。AOP的目的是实现关注点的分离;
术语、概念
- 通知(advice)
AOP框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理
- 连接点(join point)
连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用,异常的抛出。在Spring AOP中,连接点总是方法的调用。
- 切点(PointCut)
可以插入增强处理的连接点。
- 切面(Aspect)
切面是通知和切点的结合。
- 引入(Introduction)
引入允许我们向现有的类添加新的方法或者属性。
- 织入(Weaving)
将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入
9种切点表达式(@Pointcut)
引用其他命名切入点,只有@ApectJ风格(注解)支持,Schema风格(XML配置)不支持,本文展示均为@ApectJ风格。
切点表达式简单解析
合并切入点表达式:
切入点表达式可以使用
&&,||和!来合并.还可以通过名字来指向切入点表达式。【也可以用于类型和参数中】类型匹配模式:
1:
*:匹配任意类型的单个字符;比如模式(*,String)匹配了一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是String类型在字符串中表示任意长度的字符,比如
bean(demo*)匹配demo开头的bean(可匹配DemoServiceImpl、Demo2...)2:
..:匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数,可以是零到多个。3:
+:匹配指定类型及子类型(包含当前类型);仅能作为后缀放在类型后边。
万能:
execution是最灵活最常用的切点表达式。所有的表达式都可以用execution表达式表示
指定类
within=>this=>target相同点:都是指定至类的。
不同点:
within,路径可使用通配符,可指定接口,可指定类。
this,路径不可使用通配符!可指定接口,不可指定类!
target,路径不可使用通配符!不可指定接口!可指定类。
指定参数类型
args,匹配当前执行的方法传入的参数为指定类型的执行方法(是方法传入的参数类型,不是方法声明的参数类型)。参数类型的路径不可使用通配符。
args属于动态切入点,这种切入点开销非常大,非特殊情况最好不要使用
跟注解有关的
@annotation=>@target=>@within=>@args
@args匹配方法有持有某注解参数。依然是动态切入点不建议使用
@annotation匹配持有某注解的方法。
@within和@target相同点:都是匹配所有持有指定注解类型内的方法。
不同点:
@within,必须是在目标对象上声明这个注解,在接口上声明的对它不起作用
@target,必须是在目标对象上声明这个注解,在接口上声明的对它不起作用 (测试中,用@target会报错,大概意思是aop太宽泛不可以使用)
bean匹配bean名。