首先是基于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里面的数值就好了、。
那么要是外面的(另一个类)怎样使用这个呢??
就是下面这种写法:就写类名.上杠杠的函数名。
如果不在同一个包下面。最前面还要写上包名
---------------另外一个是引用通知。很少使用。在次就不进行介绍了-------------------------
大家相互进步。。。发现不足。。。欢迎评论。。。