爱游戏全站app官网入口-爱游戏官网

spring技术内幕总结 -爱游戏全站app官网入口

2023-08-21,,

aop是aspect-oriented programming(面向方面/切面编程)的简称。aspect是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关注点。分离关注点使解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不再含有针对特定领域问题代码的调用,业务逻辑同特定领域问题的关系通过切面来封装、维护,这样原来分散在整个应用程序中的变动就可以很好地管理起来。

advice通知

advice(通知)定义在连接点做什么,为切面增强提供织入接口。在spring aop中,它主要描述spring aop围绕方法调用而注入的切面行为。

pointcut切点

pointcut(切点)决定advice通知应该作用于哪个连接点,也就是说通过pointcut来定义需要增强的方法的集合,这些集合的选取可以按照一定的规则来完成。在这种情况下,pointcut通常意味着标识方法,例如,这些需要增强的地方可以由某个正则表达式进行标识,或根据某个方法名进行匹配等。

advisor通知器

完成对目标方法的切面增强设计(advice)和关注点的设计(pointcut)以后,需要一个对象把它们结合起来,完成这个作用的就是advisor(通知器)。通过advisor,可以定义应该使用哪个通知并在哪个关注点使用它,也就是说通过advisor,把advice和pointcut结合起来,这个结合为使用ioc容器配置aop应用,或者说即开即用地使用aop基础设施,提供了便利。

aop实例

项目中使用了logback来记录日志,需要生成线程流水号invokeno来追踪线程执行过程,这里提供一种通过aop生成invokeno的实现。

1.pom.xml中引入aop的jar包:

			
cglib
cglib
2.2.2


org.aspectj
aspectjrt
1.6.11


org.aspectj
aspectjweaver
1.6.11

2.advice类:

public class invokenoaspect {
    /**
* logger
*/
private static final logger logger = loggerfactory.getlogger(invokenoaspect.class); public object process(proceedingjoinpoint joinpoint) {
try {
mdc.put("invokeno", uuid.randomuuid().tostring().replaceall("-", ""));
object obj = joinpoint.proceed();
return obj;
} catch (throwable throwable) {
logger.error("mdc标识添加异常:", throwable);
throw new runtimeexception("traceidaspect.process,mdc标识invokeno添加异常");
} finally {
mdc.clear();
}
}
}

3.advisor配置:

        
	






注:该配置必须放在bean注入配置后才起作用(如果是controller等类,需要在springmvc配置文件如dispatcher-servlet.xml中配置,如果是service类,需要在service bean注入的配置文件中配置)

以上是通过execution中引入方法表达式形式来描述切入点pointcut,execution的详细描述如下:

表达式 描述
public * *(..) 任何公共方法的执行
* cn.javass..ipointcutservice.*() cn.javass包及所有子包下ipointcutservice接口中的任何无参方法
* cn.javass..*.*(..) cn.javass包及所有子包下任何类的任何方法
* cn.javass..ipointcutservice.*(*) cn.javass包及所有子包下ipointcutservice接口的任何只有一个参数方法
* (!cn.javass..ipointcutservice ).*(..) 非“cn.javass包及所有子包下ipointcutservice接口及子类型”的任何方法
* cn.javass..ipointcutservice .*() cn.javass包及所有子包下ipointcutservice接口及子类型的的任何无参方法
* cn.javass..ipointcut*.test*(java.util.date)

cn.javass包及所有子包下ipointcut前缀类型的的以test开头的只有一个参数类型为java.util.date的方法,注意该匹配是根据方法签名的参数类型进行匹配的,而不是根据执行时传入的参数类型决定的

* cn.javass..ipointcut*.test*(..)  throws

illegalargumentexception, arrayindexoutofboundsexception

cn.javass包及所有子包下ipointcut前缀类型的的任何方法,且抛出illegalargumentexception和arrayindexoutofboundsexception异常

* (cn.javass..ipointcutservice

&& java.io.serializable ).*(..)

任何实现了cn.javass包及所有子包下ipointcutservice接口和java.io.serializable接口的类型的任何方法
@java.lang.deprecated * *(..) 任何持有@java.lang.deprecated注解的方法
@java.lang.deprecated @cn.javass..secure  * *(..) 任何持有@java.lang.deprecated和@cn.javass..secure注解的方法
(@cn.javass..secure  *)  *(..) 任何返回值类型持有@cn.javass..secure的方法
*  (@cn.javass..secure *).*(..) 任何定义方法的类型持有@cn.javass..secure的方法
* *(@cn.javass..secure (*) , @cn.javass..secure (*))

任何签名带有两个参数的方法,且这个两个参数都被@ secure标记了,

如public void test(@secure string str1, @secure string str1);

* *((@ cn.javass..secure *))或

* *(@ cn.javass..secure *)

任何带有一个参数的方法,且该参数类型持有@ cn.javass..secure;

如public void test(model model);且model类上持有@secure注解

* *(

@cn.javass..secure (@cn.javass..secure *) ,

@ cn.javass..secure (@cn.javass..secure *))

任何带有两个参数的方法,且这两个参数都被@ cn.javass..secure标记了;且这两个参数的类型上都持有@ cn.javass..secure;

* *(

java.util.map

, ..)

任何带有一个java.util.map参数的方法,且该参数类型是以< cn.javass..model, cn.javass..model >为泛型参数;注意只匹配第一个参数为java.util.map,不包括子类型;

如public void test(hashmap map, string str);将不匹配,必须使用“* *(

java.util.hashmap

, ..)”进行匹配;

而public void test(map map, int i);也将不匹配,因为泛型参数不匹配

* *(java.util.collection<@cn.javass..secure *>)

任何带有一个参数(类型为java.util.collection)的方法,且该参数类型是有一个泛型参数,该泛型参数类型上持有@cn.javass..secure注解;

如public void test(collection collection);model类型上持有@cn.javass..secure

* *(java.util.set)

任何带有一个参数的方法,且传入的参数类型是有一个泛型参数,该泛型参数类型继承自hashmap;

spring aop目前测试不能正常工作

* *(java.util.list)

任何带有一个参数的方法,且传入的参数类型是有一个泛型参数,该泛型参数类型是hashmap的基类型;如public voi test(map map);

spring aop目前测试不能正常工作

* *(*<@cn.javass..secure *>)

任何带有一个参数的方法,且该参数类型是有一个泛型参数,该泛型参数类型上持有@cn.javass..secure注解;

spring aop目前测试不能正常工作

execution描述参考文章:https://blog.csdn.net/qq_23167527/article/details/78623639

另外,advisor的配置也可以通过对目标类添加注解的方式进行拦截:

    





pointcut-ref="transactionprofilepointcut" order="300" />

也可以类似这样:

    






monitoradviceextends



*biz

spring技术内幕总结 - aop概述的相关教程结束。

网站地图