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里面的数值就好了、。

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

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

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

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

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

   

  

原文地址:https://www.cnblogs.com/dazhi151/p/12681067.html