持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
定义切面:
@Aspect //交给AspectJ框架扫描识别切面类\
@Component\
public class MyAspect {\
*/****\
**** *后置通知切面方法的规范**\
***** 1)* *访问权限是* *public**\
*** 2)* *切面方法没有返回值* *void**\
*** 3)* *方法自定义**\
***** 4)* *切面方法可以没有参数* *,* *如果有参数则是目标方法的返回值* *,* *也可以包含参数* *JoinPoint,* *它必须是第一个参数**\
***** 5)* *使用* *@AfterReturning* *注解**\
***** 6)* *参数* *value:* *指定切入点表达式**\
***** returning:* *指定目标方法返回值的形参名称* *,* *此名称必须与切面方法的参数名称一致* *.**\
***/**\
***@AfterReturning(value = "execution(* com.bjpowernode.s02.SomeServiceImpl.*(..))",returning = "obj")\
public void myAfterReturning(Object obj){\
System.*out*.println("后置通知..........");\
//改变目标方法的返回值\
if(obj != null){\
if(obj instanceof String){\
String s = ((String) obj).toUpperCase();//转为大写\
System.*out*.println("在切面方法中的输出:"+s);\
}\
if(obj instanceof Student){\
((Student) obj).setName("李四");\
System.*out*.println("在切面方法中的输出"+(Student)obj);\
}\
}\
}\
}
测试类:
@Test\
public void test01(){\
ApplicationContext ac = new ClassPathXmlApplicationContext("s02/applicationContext.xml");\
SomeServiceImpl someService = (SomeServiceImpl) ac.getBean("someServiceImpl");\
System.*out*.println(someService.getClass());\
String s = someService.doSome("张三",22);\
System.*out*.println("在测试类中输出目标方法的返回值---"+s);\
}
运行结果:
可以改变目标方法的返回值(目标方法的返回值是引用类型)
@Test\
public void test03(){\
ApplicationContext ac = new ClassPathXmlApplicationContext("s02/applicationContext.xml");\
SomeServiceImpl someService = (SomeServiceImpl) ac.getBean("someServiceImpl");\
System.*out*.println(someService.getClass());\
Student stu = someService.change();\
System.*out*.println("在测试类中输出目标方法的返回值---"+stu);\
}
运行结果:
(1) @Around环绕通知增强方法有ProceedingJoinPoint参数
在目标方法执行之前之后执行。被注解为环绕增强的方法要有返回值,Object 类型。并且方法可以包含一个 ProceedingJoinPoint 类型的参数。接口 ProceedingJoinPoint 其有一个proceed()方法,用于执行目标方法。若目标方法有返回值,则该方法的返回值就是目标方法的返回值。