连接点 JointPoint
表示需要在程序中插入横切关注点的扩展点,连接点可能是类初
始化、方法执行、方法调用、字段调用或处理异常等等,Spring
只支持方法执行连接点
切入点 Pointcut
选择一组相关连接点的模式,即可以认为连接点的集合,Spring
支持perl5正则表达式和AspectJ切入点模式,Spring默认使用
AspectJ语法
通知 Advice
在连接点上执行的行为,通知提供了在AOP中需要在切入点所选
择的连接点处进行扩展现有行为的手段;在Spring中通过代理模
式实现AOP
方面/切面 Aspect
横切关注点的模块化,比如上边提到的日志组件。可以认为是通知、引入和切入点的组合;在Spring中可以使用Schema和@AspectJ方式进行组织实现。
目标对象 Target Object
需要被织入横切关注点的对象,即该对象是切入点选择的对象,需
要被通知的对象,从而也可称为“被通知对象”;由于Spring
AOP 通过代理模式实现,从而这个对象永远是被代理对象。
AOP代理 AOP Proxy
AOP框架使用代理模式创建的对象,从而实现在连接点处插入通
知(即应用切面),就是通过代理来对目标对象应用切面。在
Spring中,AOP代理可以用JDK动态代理或CGLIB代理实现,而通
过拦截器模型应用切面。
织入 Weaving
织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期、类装载期、运行期进行。
前置通知 Before Advice
在切入点选择的连接点处的方法之前执行的通知,该通知不影响正常程序执行流程。
后置通知 After Advice
• 在切入点选择的连接点处的方法之后执行的通知
• 后置返回通知(After returning Advice)
• 后置异常通知(After throwing Advice)
• 后置最终通知(After finally Advice)
环绕通知 Around Advice
• 环绕着在切入点选择的连接点处的方法所执行的通知
定义切入点,就是执行的条件。切入点的方法不用任何代码,返回值是void,最重要的是执行的条件的表达式。
@Pointcut("execution(* com.test.service.*.*(..))")
public void executeService()
{
}
1)execution:用于匹配子表达式。
//匹配com.cjm.model包及其子包中所有类中的所有方法,返回类型任意,方法参数任意
@Pointcut("execution(* com.cjm.model..*.*(..))")
public void before(){}
2)within:用于匹配连接点所在的Java类或者包。
//匹配Person类中的所有方法
@Pointcut("within(com.cjm.model.Person)")
public void before(){}
//匹配com.cjm包及其子包中所有类中的所有方法
@Pointcut("within(com.cjm..*)")
public void before(){}
3) this:用于向通知方法中传入代理对象的引用。
@Before("before() && this(proxy)")
public void beforeAdvide(JoinPoint point, Object proxy){
//处理逻辑
}
4)target:用于向通知方法中传入目标对象的引用。
@Before("before() && target(target)
public void beforeAdvide(JoinPoint point, Object proxy){
//处理逻辑
}
5)args:用于将参数传入到通知方法中。
@Before("before() && args(age,username)")
public void beforeAdvide(JoinPoint point, int age, String username){
//处理逻辑
}
6)@within :用于匹配在类一级使用了参数确定的注解的类,其所有方法都将被匹配。
@Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation标注的类都将匹配
public void before(){}
7)@target :和@within的功能类似,但必须要指定注解接口的保留策略为RUNTIME。
@Pointcut("@target(com.cjm.annotation.AdviceAnnotation)")
public void before(){}
8)@args :传入连接点的对象对应的Java类必须被@args指定的Annotation注解标注。
@Before("@args(com.cjm.annotation.AdviceAnnotation)")
public void beforeAdvide(JoinPoint point){
//处理逻辑
}
9)@annotation :匹配连接点被它参数指定的Annotation注解的方法。也就是说,所有被指定注解标注的方法都将匹配。
@Pointcut("@annotation(com.cjm.annotation.AdviceAnnotation)")
public void before(){}
10)bean:通过受管Bean的名字来限定连接点所在的Bean。该关键词是Spring2.5新增的。
@Pointcut("bean(person)")
public void before(){}
请注意我们使用了“&&”操作符把execution()和within()指示器连接在一起形成与(and)关系(切点必须匹配所有的指示器)。类似地,我们可以使用“||”操作符来标识或(or)关系,而使用“!”操
作符来标识非(not)操作。
因为“&”在XML中有特殊含义,所以在Spring的XML配置里面描述切点时,我们可以使用and来代替“&&”。同样,or和not可以分别用来代替“||”和“!”。
通知参数
任何通知方法可以将第一个参数定义为org.aspectj.lang.JoinPoint类型(环绕通知需要定义第一个参数为ProceedingJoinPoint类型,它是 JoinPoint 的一个子类)。JoinPoint接口提供了一系列有用的方法,比如 getArgs()(返回方法参数)、getThis()(返回代理对象)、getTarget()(返回目标)、getSignature()(返回正在被通知的方法相关信息)和 toString()(打印出正在被通知的方法的有用信息)
切入点表达式
定义切入点时需要一个包含名字和任意参数的签名,还有一个切入点表达式,就是* findById*(..)这一部分。
切入点表达式的格式:execution([可见性] 返回类型 [声明类型].方法名(参数) [异常])
其中【】中的为可选,其他的还支持通配符的使用:
*:匹配所有字符
..:一般用于匹配多个包,多个参数
+:表示类及其子类
运算符有:&&、||、!
在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut”切入点”
例如定义切入点表达式 execution (* com.sample.service.impl..*. *(..))
execution()是最常用的切点函数,其语法如下所示:
整个表达式可以分为五个部分:
1、execution(): 表达式主体。
2、第一个*号:表示返回类型, *号表示所有的类型。
3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。
4、第二个*号:表示类名,*号表示所有的类。
5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数
相关博客:
http://www.cnblogs.com/lic309/p/4079194.html
http://blog.csdn.net/lk7688535/article/details/51989746