ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Spring AOP-- @Aspect注解

2019-08-10 16:37:34  阅读:260  来源: 互联网

标签:Spring advice println void 通知 Aspect AOP fun public


Aspect:切面,通常是一个类,可定义切入点【Pointcut】和通知【advice】。

切面可使用@Aspect注解方式或者基于XML配置文件实现。此处,仅涉及注解方式。

 

切面类上通常添加两个注解:

@Aspect:把类变成切面类

@Component:把切面类添加到IOC容器中

 

@Aspect注解方式可实现前置通知、返回通知、后置通知、异常通知、环绕通知。

@Before:前置通知,目标方法之前执行

@After:后置通知,目标方法之后执行(始终执行)

@AfterReturning:返回通知,目标方法之后执行(异常不执行)

@AfterThrowing:异常通知,出现异常时候执行

@Around:环绕通知,环绕目标方法执行

 

代码实现过程如下

(1)添加需要通知的业务代码:

public class UserController {
    public void fun(){
        System.out.println("公司的原古代码……");
    }
}

(2)切面类

@Aspect
@Component
public class BDadvice {
    
    @Pointcut("execution(public void com.zparkep.controller.UserController.fun())")
    public void fun(){

    }

    //前置通知
    @Before("fun()")
    public void before(){
        System.out.println("before advice......");
    }

    //后置通知
    @After("fun()")
    public void after(){
        System.out.println("after advice........");
    }

    //返回通知
    @AfterReturning("fun()")
    public void afterReturning(){
        System.out.println("afterReturning advice........");
    }

    //异常通知
    @AfterThrowing("fun()")
    public void afterThrowing(){
        System.out.println("afterThrowing advice........");
    }


}

(3)测试

@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:app.xml")
public class AdviceTest {
 
    //对UserController进行增强测试
    @Autowired
    private UserController userController;
    @Test
    public void fun(){
        userController.fun();
    }
  
}

结果展示

 可看出,目标代码正常结束情况下,异常通知不会出现。

(4)修改目标代码

public class UserController {
    public void fun(){
        System.out.println(5/0);
    }
}

再次进行测试,结果如下

可看出,后置通知会一直出现,无论目标代码是否报错。 目标代码出错情况下,返回通知不会出现。

(5)修改切面类测试环绕通知

@Aspect
@Component
public class BDadvice {
    
    @Pointcut("execution(public void com.zparkep.controller.UserController.fun())")
    public void fun(){

    }

    /**环绕通知
     * 目标代码运行报错时打印“around advice----afterThrowing advice”
     */
    @Around("fun()")
    public void around(ProceedingJoinPoint proceedingJoinPoint){

        System.out.println("around advice----before advice");
        try {
            proceedingJoinPoint.proceed();  //执行目标代码
            System.out.println("around advice----afterReturning advice");
        } catch (Throwable throwable) {
            System.out.println("around advice----afterThrowing advice");
        }
        System.out.println("around advice----after advice");
    }
}

执行结果如下:

 再次证明,目标代码报错情况下,返回通知不会出现。

标签:Spring,advice,println,void,通知,Aspect,AOP,fun,public
来源: https://blog.csdn.net/qq_39493274/article/details/99077917

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有