• spring核心之AOP学习总结二


    一:springAOP常用的注解

    @Aspect:声明方面组件

    @Before:声明前置通知

    @After-returning:声明后置通知

    @After:声明最终通知

    @Around:声明环绕通知

    @After-throwing:声明异常通知

    二:使用SpringAOP的注解对总结一中的案例进行重构

    1:注释掉方面组件的声明以及将方面组件应用到目标组件的配置

     1 <!-- 配置日志组件 
     2     <bean id="operatorLogger" class="com.hlcui.aspect.OperatorLogger"></bean>
     3     
     4      配置方面组件 
     5     <aop:config>
     6         <aop:aspect ref="operatorLogger">
     7             <aop:before method="logger" pointcut="within(com.hlcui.controller..*)"/>
     8         </aop:aspect>
     9         
    10         <aop:aspect ref="operatorLogger">
    11             <aop:around method="logger2" pointcut="within(com.hlcui.controller..*)"/>
    12         </aop:aspect>
    13         
    14         <aop:aspect ref="operatorLogger">
    15             <aop:after-throwing method="logger3" throwing="e" pointcut="within(com.hlcui.controller..*)"/>
    16         </aop:aspect>
    17     </aop:config>-->
    18     
    19     <!-- 开启SpringAOP的注解扫描 -->
    20     <aop:aspectj-autoproxy proxy-target-class="true"/>

    2:使用@Aspect注解声明方面组件,并且在方面组件上面声明前置、后置或者是环绕通知

     1 /**
     2  * 
     3  */
     4 package com.hlcui.aspect;
     5 
     6 import java.text.SimpleDateFormat;
     7 import java.util.Date;
     8 
     9 import org.aspectj.lang.ProceedingJoinPoint;
    10 import org.aspectj.lang.annotation.AfterThrowing;
    11 import org.aspectj.lang.annotation.Around;
    12 import org.aspectj.lang.annotation.Aspect;
    13 import org.aspectj.lang.annotation.Before;
    14 import org.springframework.stereotype.Component;
    15 
    16 
    17 /**
    18  * @author Administrator
    19  *
    20  */
    21 @Aspect
    22 @Component
    23 public class OperatorLogger {
    24     
    25     @Before("within(com.hlcui.controller..*)")
    26     public void logger(){
    27         System.out.println("-->记录用户日志");
    28     }
    29     
    30     @Around("within(com.hlcui.controller..*)")
    31     public Object logger2(ProceedingJoinPoint p ) throws Throwable{
    32         String targetName = p.getTarget().getClass().getName();
    33         String methodName = p.getSignature().getName();
    34         String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    35         String msg = date+"执行"+targetName+methodName;
    36         System.out.println(msg);
    37         Object obj = p.proceed();
    38         System.out.println("调用目标组件业务方法后");
    39         return obj;
    40     }
    41     
    42     @AfterThrowing(pointcut="within(com.hlcui.controller..*)",throwing="e")
    43     public void logger3(Exception e){
    44         StackTraceElement[] eles = e.getStackTrace();
    45         System.out.println(eles[0].toString());
    46     }
    47 }

    3:运行测试方法

    通过结果可以看出,通过注解声明方面组件成功切入目标组件。

  • 相关阅读:
    540 Single Element in a Sorted Array 有序数组中的单一元素
    539 Minimum Time Difference 最小时间差
    538 Convert BST to Greater Tree 把二叉搜索树转换为累加树
    537 Complex Number Multiplication 复数乘法
    535 Encode and Decode TinyURL 编码和解码精简URL地址
    532 K-diff Pairs in an Array 数组中差为K的数对
    530 Minimum Absolute Difference in BST 二叉搜索树的最小绝对差
    529 Minesweeper 扫雷游戏
    526 Beautiful Arrangement
    1.5 函数
  • 原文地址:https://www.cnblogs.com/warrior4236/p/6142827.html
Copyright © 2020-2023  润新知