Spring通过切点来选择连接点

方法切点函数

函数 入参 说明 示例
execution() 方法匹配字符串 满足某一匹配模式的的所有目标类方法连接点 execution(* com.yc.service.*.*(..))在配置service层的事务管理时常用,定位于任意返回类型(第一个”*”) 在com.yc.service包下的所有类(第二个”*”)下的所有方法(第三个”*”),且这个方法的入参为任意类型、数量(体现在 “(..)“)
@annotation() 方法注解类名 标注了特定注解的目标方法连接点上

@anntation(com.yc.controller.needRecord),定位于controller层中任何添加@needRecord的方法,这可以方便地对控制层中某些方法被调用(如某人某时间登陆、进入后台管理界面)添加日志记录。

方法入参切点函数

函数 入参 说明 示例
args() 类名 定位于入参为特定类型的的方法 如args(com.yc.model.User,com.yc.model.Article),我们要定位于所有以User,Article为入参的方法,需要注意的是,类型的个数、顺序必须都一一对应)
@args() 类型注解类名 定位于被特定注解的类作为方法入参的连接点 @args(com.yc.annotation.MyAnnotation)。MyAnnotation为自定义注解,标注在目标对象方法入参上,被标注的目标都会被匹配。,如方法public myMethod(@MyAnnotation String args);

目标类切点函数

函数 入参 说明 示例
within() 类名匹配串 定位于特定作用于下的所有连接点 within(com.yc.service.*ServiceImpl),可以通过此注解为特定包下的所有以ServiceImpl名字结尾的类里面的所有方法添加事务控制。
target() 类名 定位于指定类及其子类 target(com.yc.service.IUserService),则可定位到IUserService接口和它的实现类如UserServiceImpl
@within() 类型注解类名 定位与标注了特定注解的类及其实现类 @within(com.yc.controller.needRecord),比如我们可以在BaseController中标注@needRecord,则所有继承了BaseController的UserController、ArticleController等等都会被定位
@target() 类型注解类名 定位于标注了特定注解的目标类里所有方法 @target(com.yc.controller.needRecord),则可以在controller层中,为我们需要日志记录的类标注@needRecord。

以上Spring支持的AspectJ指示器,只有execution指示器是实际执行匹配的,而其他指示器都是用来限制匹配的.


编写切点:

package main.java;

/**
 * @author [email protected]
 * @date 18-4-18 上午8:38
 */

public interface Performance {
    void perform();
}

        Performance接口可以代表任何类型的表演,可以作为一个切点.

        下面将展现一个切点表达式,这个表达式能够设置当perform()方法执行时触发通知的调用.

execution(* main.java.Performance.perform(..))

        execution表示在方法执行时触发

        * 表示返回任意类型

        main.java.Performance表示方法所属的类

        perform表示所属类的方法

        (..)可表示任意被重载的该方法(即使用任意参数)

        还可用下述的表达式表示需要匹配的切点仅匹配main.java包里的方法.

execution(* main.java.Performance.perform(..)) && within(main.java.*)

        除了&&,还有||和!,同C语言.

        (因为&在XML中有特殊含义,所以在Spring的XML配置里面描述切点时,它们将用and,or,not代替,同Python)


在切点中选择Bean:

        Spring还引入了一个bean()指示器,它允许在切点表达式中使用bean的ID来表示bean

execution(* main.java.Performance.perform(..)) and bean(main.java.Vina)

猜你喜欢

转载自blog.csdn.net/weixin_41704428/article/details/79983513