spring注解详解与用法(3)切面环绕

导航:更多的spring注解标签点击这里

声明了切面类我们还需要定义切面的内容面向切面编程是spring的一个重要思想,也是精华之一

@Aspect	

这是一个切面的注解,声明是一个额外的面向切面的功能

用法示例:

@Aspect
public class AspectTest { }

当然,别忘了添加maven依赖

 <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.4</version>
        </dependency>

声明了切面类,我们还需要有具体的切面内容,springs提供了3个注解,如下所示

@After//后置建言(advice),在原方法前执行。
@Before//前置建言(advice),在原方法后执行。
@Around//环绕建言(advice),在原方法执行前执行,在原方法执行后再执行(@Around可以实现其他两种advice)
@Pointcut//即定义拦截规则,确定有哪些方法会被切入

使用示例


@Aspect
@Component
public class AspectTest {
    @Before("d()")
    public void a(JoinPoint joinPoint){
        System.out.println("前置");
    }
    @After("d()")
    public void b(JoinPoint joinPoint){
        System.out.println("后置");
    }
    @Around("d()")
    public Object c(ProceedingJoinPoint pjp)throws  Throwable{
        System.out.println("环绕1");
        Object obj=pjp.proceed();
        System.out.println("环绕2");
        return obj;
    }

    @Pointcut("@annotation(org.yly.minbox.boot.Test.Log)")//切入点,这里采用添加了注解来切入
    public void d(){}

}
@RestController
public class Web {
    @RequestMapping("a123")
    @Log
    public String aaa(String a){
        System.out.println("执行的方法体");
        return "111111";
    }
}
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
}

效果示例:

@AfterThrowing//异常环绕
AfterThrowing是一个增强环绕,当出现异常的时候走次方法,

使用示例

 @AfterThrowing(throwing="ex",pointcut="d()")
    public void AfterThrowing(Throwable ex){
        System.out.println("出现异常"+ex.getMessage());
    }

我们可以修改一下刚才那个接口,增加一个异常

执行效果

 

@AfterReturning//异常环绕

AfterReturning也是后置环绕,但是他和@After不一样的是可以获取主方法体的返回值

使用示例:

  @AfterReturning(returning="returnValue",pointcut="d()")
    public void AfterRun(JoinPoint joinPoint,Object returnValue){
        System.out.println("有返回值的后置环绕="+returnValue);
    }

效果:

@Order//排序

环绕排序,当一个方法同时满足多个同等环绕设置时优先走哪个方法

示例

注意(1)

启动环绕功能需要告诉spring,如果是mvc,xml配置如下

<aop:aspectj-autoproxy proxy-target-class="true"/>

如果是boot,需要在启动文件加上@EnableAspectJAutoProxy,如下图所示

注意(2)

Around环绕与其他的不同,前置环绕与后置环绕都是走完自动走下一步,但是Around他需要我们手动执行下一步,通过调用参数ProceedingJoinPoint 的proceed方法,否则会跳过方法体,如下所示

如果不调用proceed方法会导致前置环绕与方法体本身都无法执行

proceed方法用来区分方法执行前后环绕,proceed调用前的代码为方法执行前置环绕,proceed后的代码为后置环绕

 

After,Before,Around,AfterReturning的顺序

Around→Before→方法体→Around→After→AfterReturning

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章