问题
在本类中调用切点注解方法,但是始终不走前面逻辑
代码如下
以下测试代码如下
- controller
@RestController
@RequestMapping("/aspect")
public class AspectController {
@Resource
private AspService aspService;
@GetMapping("/proxy")
public void test() {
aspService.testAs();
}
}
- service
/**
* @author xusj
* <br>CreateDate 2023/2/8 11:37
*/
public interface AspService {
public void testAs();
}
- serviceImpl
@Service
@Slf4j
public class AspectImpl implements AspService {
@Override
public void testAs() {
curSay();
}
@SayHello(hello = "a")
private void curSay() {
log.info("我是本类中的方法");
}
}
- 切面代码
@Aspect
@Component
@Slf4j
public class SayHelloAspect {
/**
* 配合注解作为切面
*/
@Pointcut("@annotation(com.future.book.annotation.SayHello)")
public void pointCut() {
}
/**
* 通过切面进入,使用前置通知
*/
@Before("pointCut()")
public void before(JoinPoint joinPoint) {
log.info("我是切面我来说句话====》你好啊!!!!");
}
}
- 注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SayHello {
String[] hello();
}
原因
导致:这样不会走切面中的方法
1.分析
- 因为我们使用的AOP所以Spring底层生产的是代理对象,
- 在本类中我们使用的是this去调用的,那么代理对象是调用不到this的,所以我们调用失败(目标方法其实是被代理对象代理的,所以使用本类是调不通的)
调用图如下
解决方案
- 拿到代理对象去调用
@Service
@Slf4j
public class AspectImpl implements AspService {
@Override
public void testAs() {
AspectImpl aspect = (AspectImpl) AopContext.currentProxy();
aspect.curSay();
}
@SayHello(hello = "a") // 不能使用private,应该使用public
private void curSay() {
log.info("我是本类中的方法");
}
}
- 特别注意不要使用private在切点方法中,需要使用public
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96089.html