pointcut 中 this 和 target的区别

本文讲述了SpringAOP中this和target指示符在定义切点时的不同,主要区别在于this针对代理对象类型,target针对目标对象类型,选择取决于具体需求,避免不必要的匹配。
摘要由CSDN通过智能技术生成

在Spring AOP中,thistarget是两种用于定义切点(Pointcut)的指示符,它们的主要区别在于它们所匹配的对象类型不同。

this指示符用于匹配当前AOP代理对象的执行方法。这里的“代理对象”是指Spring AOP在运行时为被代理对象(即目标对象)创建的代理实例。因此,this关注的是代理对象的类型。由于代理对象可能会实现一些额外的接口(例如,用于支持AOP的接口),所以使用this时可能会匹配到这些接口中的方法,即使这些方法在目标对象本身中并不存在。

相比之下,target指示符用于匹配当前目标对象的执行方法。这里的“目标对象”是指被Spring AOP代理的实际业务对象。因此,target关注的是目标对象的类型,而不是代理对象的类型。由于target直接关注目标对象,所以它不会匹配到代理对象可能实现的额外接口中的方法。

举个例子来说明:

假设我们有一个接口MyInterface和一个实现了该接口的类MyClass。Spring AOP为MyClass的实例创建了一个代理对象。现在,如果我们想要拦截所有实现了MyInterface的方法调用,我们应该使用target(MyInterface),因为我们要匹配的是目标对象(即MyClass的实例)是否实现了MyInterface。而如果我们使用this(MyInterface),则可能会因为代理对象实现了额外的接口而导致不期望的匹配。

总结来说,thistarget的主要区别在于它们关注的对象类型不同:this关注代理对象的类型,而target关注目标对象的类型。因此,在选择使用哪个指示符时,需要根据你的具体需求来确定。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Pointcut 注解用于定义切入点,它可以根据表达式来选择连接点。表达式的写法如下: 1. execution:用于匹配方法执行的连接点,语法为:execution(修饰符模式 返回类型 包名.类名.方法名(参数列表) 异常模式) 例如:@Pointcut("execution(public * com.example.demo.service.*.*(..))") 表示匹配com.example.demo.service包下所有类的所有公共方法。 2. within:用于匹配指定包内的连接点,语法为:within(包名.类名) 例如:@Pointcut("within(com.example.demo.service.*)") 表示匹配com.example.demo.service包下所有方法。 3. this:用于匹配当前AOP代理对象类型的连接点,语法为:this(类型名) 例如:@Pointcut("this(com.example.demo.service.UserService)") 表示匹配实现UserService接口的对象。 4. target:用于匹配当前目标对象类型的连接点,语法为:target(类型名) 例如:@Pointcut("target(com.example.demo.service.UserService)") 表示匹配UserService接口的实现对象。 5. args:用于匹配当前执行的方法传入的参数为指定类型的连接点,语法为:args(类型名) 例如:@Pointcut("args(java.lang.String)") 表示匹配传入参数为String类型的方法。 6. @annotation:用于匹配使用指定注解的连接点,语法为:@annotation(注解类型) 例如:@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)") 表示匹配使用GetMapping注解的方法。 7. bean:用于匹配指定bean名称的连接点,语法为:bean(名称) 例如:@Pointcut("bean(userService)") 表示匹配名称为userService的bean的方法。 需要注意的是,以上语法的*号表示任意字符,..表示任意多个字符,+表示类及其子类,&&表示与,||表示或。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值