zoukankan      html  css  js  c++  java
  • spring 的aop

    首先是基于Aspectj的注解的方式进行学习:

    实现日志功能:

    首先创建日志切面:(方法调用之前或者调用之后进行执行的一些日志语句)

    1、把这个类声明为一个切面需要把该类放到ioc的容器中,使用的注解标识@Component

    2、之后再声明一个切面使用的注解标识@Aspect

    3、要想在执行方法之前使用日志(即为前置通知)使干函数在另外的函数执行之前进行执行。具体的语句是

         @Before(“execution(-共有等等-  - 返回值类型-  - 包名.类名.函数名(里面是参数的类型)-)”)。然后在配置文件里加入配置。

         使Aspect j的注解起作用。使在切面里的注解(@Before)起作用:自动为匹配的类生成代理对象。

    4、如果想在日志之中显示出传过来的参数和函数名称的时候。可以子啊切片的函数中添加参数例如

    可优化为或者是

     或者

       之后就可以获取传过来的函数的名字和参数列表了。

       String methodname=joinPoint.getSignature().getName();//这是得到的传过来的函数名的名称

       List<Object> args=Arrays.asList(joinPoint.getArgs());//这是用来得到函数中带有的参数的数值的语句;

    5、如果是将前片的函数对传过来的类里面的所有的函数都起作用。那么就需要修改下面的语句:(主要是修改@Before处的语句)

        @Before(“execution(public  int 包名.类名.*(参数的列表,写类型))”);这样就可以完成操作了

    其中的一些主要的知识如下截图:

     后置通知的操作::在方法执行后执行的通知(无论是否发生一场都执行的通知)

    1、和上面讲到前置通知基本类似。主要是修改将@Before修改为@After

    2、在后置通知中还不能访问函数执行的结果只能在返回通知中访问(前置通知可以访问传过来的参数的数值)

     <!--此服务的最高境界就是你没有任何感知。服务就已经完成了-->

    返回通知实在方法正常结束之后的进行操作的(这个可以访问返回的结果)

    1、

            这个写法和之前相比:变化的是将After变成了AfterReturning之后多了value和一个参数returning=“result”;

              之后再函数的参数裂变多一个Object  result的参数。之后进行输出运行的结果

          

    异常通知是在函数运行出现异常的时候进行显示的;

    1、 他的注释了刚刚上边的返回通知的样子基本类似:

        之后再函数中的参数的写法如下。只有在利用参数进行错误类型的输出:

             

    先写出两种,变数对于不同的错误的输出。

    这是空指针的异常

     2、在方法出现异常的时候目标函数。而且可以访问到异常对象。并且可以指定发生何种异常的时候进行怎样的通知。

     环绕通知(功能最强的单并不表示是最常用的)、

    1、通用到的语句是@Arround之后的语句和前置和后置一样结果如下:

     二对于环绕通知的函数。他的参数就需要有这样的一个参数ProceedingJoinPoint  pjd这样一个参数。环绕通知类似于动态代理的全过程:ProceedingJoinPoint这个类型的参数可以决定

    是否执行目标函数方法。切环绕通知必须有返回值。返回值即为目标方法的返回值。

    2、具体的代码截图如下:

     其中的pjd.proceed();表示的是类当前所执行的函数。

    几个的之间的位置关系如下图所示:

     num1、然后想要说的就是关于切面的优先级;

    创建验证切面:使用@order(2),位置嘛,就在和@component和@Aspect一起的哪里就好。其中的这个整形参数。::数值越小优先级越高。

    num2、关于重用切点表达式方面的知识:::因为通知后边的数值基本相同

     就是这个部分。

    之后重新编写一个方法:(定义一个方法用于声明切入点表达式的。改方法不需要填入其他的代码。)

    在命名的新的函数上边使用@Pointcut(“里面是要用到的话”);整体的样子是这样的:

     之后使用这个收的用法是这样的:@Before(“declareJointPointExpression()”).。这样就可以了。之后要是进行修改的时候只修改@Pointcut里面的数值就好了、。

    那么要是外面的(另一个类)怎样使用这个呢??

    就是下面这种写法:就写类名.上杠杠的函数名。

    如果不在同一个包下面。最前面还要写上包名

    ---------------另外一个是引用通知。很少使用。在次就不进行介绍了-------------------------

    大家相互进步。。。发现不足。。。欢迎评论。。。

       

      

  • 相关阅读:
    【C#】:浅谈反射机制 【转】
    ArcGIS Server 10中的切图/缓存机制深入【转】
    ArcGIS Server的切图原理深入【转】
    【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高)
    MFC 带Ribbonbar的窗口 实现全屏和取消全屏
    C#.net开发 List与DataTable相互转换 【转】
    Net编程 详解DataTable用法【转】
    三维空间两直线/线段最短距离、线段计算算法 【转】
    OSG立体模式下动态修改相机远近裁剪面的实现
    用curl去探测接口是否正常返回结果,若没有正常返回则触发报警
  • 原文地址:https://www.cnblogs.com/dazhi151/p/12681067.html
Copyright © 2011-2022 走看看