day4
环绕通知@Around
他是通过拦截目标方法的方式,在目标方法前后增强功能的通知,他是功能最强大的通知,一般事务使用此通知,它可以轻易改变目标方法的返回值。
环绕通知方法的规范
- 访问权限是public
- 切面方法有返回值,返回值就是目标方法的返回值
- 法名称自定义
- 方法有参数,此参数就是目标方法
- 回避异常
- 使用@Around注解声明是环绕通知 参数: value:指定切入点表达式
例子:
public interface SomeService {
String doSome(String name,int age);
}
@Service
public class SomeServiceImpl implements SomeService {
@Override
public String doSome(String name, int age) {
System.out.println("doSome业务方法执行"+name);
return "abcd";
}
}
@Aspect
@Component
public class MyAspect {
/**
* 环绕通知方法的规范
* 1)访问权限是public
* 2)切面方法有返回值,返回值就是目标方法的返回值
* 3)方法名称自定义
* 4)方法有参数,此参数就是目标方法
* 5)回避异常
* 6)使用@Around注解声明是环绕通知
* 参数:
* value:指定切入点表达式
* */
@Around(value = "execution(* com.chenluo.s03.*.*(..))")
public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
//前切功能实现
System.out.println("环绕通知中的前置功能");
//目标方法实现
Object obj = pjp.proceed(pjp.getArgs());
//后切功能实现
System.out.println("环绕通知中的后置功能");
return obj.toString().toUpperCase();//改变了目标方法的返回值
}
}
public class MyTest03 {
@Test
public void testStudent02() {
//创建容器对象并启动
ApplicationContext ac = new ClassPathXmlApplicationContext("s03/applicationContext.xml");
//取出对象
SomeService someService = (SomeService) ac.getBean("someServiceImpl");
String s = someService.doSome("张三",22);
System.out.println("在测试方法中目标方法返回值:"+s);
}
}
最终通知@After
最终通知无论目标方法是否正常执行,最终通知的代码都会被执行。
最终通知方法的规范
-
访问权限是public
-
方法没有返回值
-
方法名称自定义
-
方法没有参数如果有也只能是JointPoint
-
使用@After注解表明是最终通知
参数:
value:指定切入点表达式
给切入点表达式起别名@PointCut
如果多个切面切入到同一个切入点,可以使用别名简化开发。
使用@PointCut注解,创建一个空方法,此方法的名称就是别名
@PointCut(value = "execution(* com.chenluo.s04.*.*(...))")
public void mycut(){}
别名就是mycut()
@Around(value = "mycut()")