Spring学习Day4

95 阅读2分钟

day4

环绕通知@Around

他是通过拦截目标方法的方式,在目标方法前后增强功能的通知,他是功能最强大的通知,一般事务使用此通知,它可以轻易改变目标方法的返回值。

环绕通知方法的规范

  1. 访问权限是public
  2. 切面方法有返回值,返回值就是目标方法的返回值
  3. 法名称自定义
  4. 方法有参数,此参数就是目标方法
  5. 回避异常
  6. 使用@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

最终通知无论目标方法是否正常执行,最终通知的代码都会被执行。

最终通知方法的规范

  1. 访问权限是public

  2. 方法没有返回值

  3. 方法名称自定义

  4. 方法没有参数如果有也只能是JointPoint

  5. 使用@After注解表明是最终通知

    参数:

    ​ value:指定切入点表达式

给切入点表达式起别名@PointCut

如果多个切面切入到同一个切入点,可以使用别名简化开发。

使用@PointCut注解,创建一个空方法,此方法的名称就是别名

@PointCut(value = "execution(* com.chenluo.s04.*.*(...))")
public void mycut(){}

别名就是mycut()
@Around(value = "mycut()")