@Before前置通知方法有JoinPoint参数

112 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

Step5:测试类中使用目标对象的 id

@Test\
public void test01(){\
    ApplicationContext ac = new ClassPathXmlApplicationContext("s01/applicationContext.xml");\
    SomeService someService = (SomeService) ac.getBean("someService");\
    System.*out*.println(someService.getClass());\
    String s = someService.doSome("张三",22);\
    System.*out*.println(s);\
}

运行结果:

image.png

(2)  @Before前置通知方法有JoinPoint参数

在目标方法执行之前执行。被注解为前置通知的方法,可以包含一个 JoinPoint 类型参数。该类型的对象本身就是切入点表达式。通过该参数,可获取切入点表达式、方法签名、目标对象等。

不光前置通知的方法,可以包含一个 JoinPoint 类型参数,所有的通知方法均可包含该参数。

@Aspect   //交给AspectJ框架去识别切面类,来进行切面方法的调用\
public class MyAspect {\
**@Before(value = "execution( * com.bjpowernode.s01.*.*(..))")\
    public void myBefore(JoinPoint joinPoint){\
        System.*out*.println("前置功能输出...............");\
        System.*out*.println("目标方法的签名:"+joinPoint.getSignature());\
        System.*out*.println("目标方法的所有参数:"+ Arrays.*toString*(joinPoint.getArgs()));\
    }

运行结果:

image.png

(3)  @AfterReturning后置通知注解有returning属性

在目标方法执行之后执行。由于是目标方法之后执行,所以可以获取到目标方法的返回值。该注解的 returning 属性就是用于指定接收方法返回值的变量名的。所以,被注解为后置通知的方法,除了可以包含 JoinPoint 参数外,还可以包含用于接收返回值的变量。该变量最好为 Object 类型,因为目标方法的返回值可能是任何类型。

接口方法:

public interface SomeService {\
    String doSome(String name, int age);\
    Student change();\
}

实现方法:

@Component\
public class SomeServiceImpl implements SomeService {\
    @Override\
    public String doSome(String name, int age) {\
        System.*out*.println(name+"doSome方法被调用 (主业务方法)");\
        return "abcd";\
    }\
    @Override\
    public Student change() {\
        return new Student("张三");\
    }\
}