SpringAop中JoinPoint对象使用时出现的问题

SpringAop中JoinPoint对象使用时出现的问题

介绍不写了,API也不写了,记录问题解决。

切面类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package xyz.yuzh.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
* 日志切面
*
* @Author: z.yu
* @Date: 2018/06/19 20:35
*/
@Aspect
@Component
public class LogAspect {

/**
* 如果代理Handler,该Handler不能继承类。
*/
@AfterReturning(pointcut = "execution(* xyz.yuzh.service.*.*(..))")
public void log(JoinPoint point) {
Object[] args = point.getArgs();
for (Object a : args) {
System.out.println("入参数 -> " + a + ",");
}
System.out.println("方法签名:" + point.getSignature());
System.out.println("目标对象:" + point.getTarget());
System.out.println("代理对象:" + point.getThis());
System.out.println("-----------------------");
}

}

1、 自动代理aop的配置需要写在 spring.xml 中,因为 spring-mvc.xml 配置成只扫描的到 handler,spring.xml才能扫描到其他Component(如切面类:LogAspect)。

  • true代表CGLIB动态代理
  • false代表JDK动态代理(默认)
1
<aop:aspectj-autoproxy proxy-target-class="false"></aop:aspectj-autoproxy>

2、 使用 @AfterReturning时,如果指定了返回值,那么目标方法有返回值的才会匹配的到

1
2
3
4
@AfterReturning(pointcut = "execution(* xyz.yuzh.service.*.*(..))",returning = "returnValue")
public void log2(JoinPoint point,Object returnValue) {
//...
}

3、目标方法如果是继承或实现得到的,是代理不到的,除非覆盖其父级方法。

4、如果目标方法是 Handler中的方法,没有被代理到?

web容器加载顺序:ServletContext -> context-param -> listener-> filter -> servlet

首先一点:spring的Bean和springMVC的Bean所在的上下文是不同的

前面切入点在service层时,自动代理 <aop:aspectj-autoproxy/> 配置到spring.xml,即这里的bean是可以被代理到的。serviceBean被spring.xml扫描到,LogAspect作为切面才会生效。

  • @Component 作为spring容器中的bean被加载到了。
  • @Aspect 施加了该注解的spring容器的bean的切面应用成功。

代理handler中的方法步骤:

  • <aop:aspectj-autoproxy/> 放到spring-mvc.xml ,该配置文件才是扫描handler的。
  • 手动创建bean -> <bean id="logAspect" class="xyz.yuzh.aspect.LogAspect"></bean>,因为扫描不到。
  • 移除LogAspect的@Component注解,因为已经手动创建了,重复创建可能会出现错误。

good night( ̄o ̄) . z Z

# aop, spring

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×