首页IT科技spring切点表达式注解(Spring AOP切入点表达式)

spring切点表达式注解(Spring AOP切入点表达式)

时间2025-08-05 09:05:47分类IT科技浏览5036
导读:先来认识两个概念吧(其实Spring AOP实现功能增强的方式就是代理模式) 目标对象(Target :原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的 代理(Proxy :目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现...

先来认识两个概念吧(其实Spring AOP实现功能增强的方式就是代理模式)

目标对象(Target):原始功能去掉共性功能对应的类产生的对象             ,这种对象是无法直接完成最终工作的 代理(Proxy):目标对象无法直接完成工作                   ,需要对其进行功能回填       ,通过原始对象的代理对象实现

AOP切入点表达式

回归主题       ,切入点表达式再来认识两个概念:

切入点:要进行增强的方法 切入点表达式:要进行增强的方法的描述方式

切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数) 异常名)

execution(public User com.taro.service.UserService.findById(int))

🍊个🌰:

描述方式一:执行com.taro.dao包下的BookDao接口中的无参数update方法

execution(void com.taro.dao.BookDao.update())

描述方式二:执行com.taro.dao.impl包下的BookDaoImpl类中的无参数update方法

execution(void com.taro.dao.impl.BookDaoImpl.update()) execution:动作关键字                   ,描述切入点的行为动作             ,例如execution表示执行到指定切入点 public:访问修饰符,还可以是public       ,private等                    ,可以省略 User:返回值             ,写返回值类型 com.taro.service:包名,多级包使用点连接 UserService:类/接口名称 findById:方法名 int:参数                    ,直接写参数的类型                    ,多个类型用逗号隔开 异常名:方法定义中抛出指定异常,可以省略

切入点表达式就是要找到需要增强的方法             ,所以它就是对一个具体方法的描述                    ,但是方法的定义会有很多       ,所以如果每一个方法对应一个切入点表达式             ,嗯             。                    。      。             。所以来认识一下通配符吧                    。

通配符

*:单个独立的任意符号                   ,可以独立出现       ,也可以作为前缀或者后缀的匹配符出现

execution(public * com.taro.*.UserService.find*(*))

匹配com.taro包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法

..:多个连续的任意符号       ,可以独立出现                   ,常用于简化包名与参数的书写

execution(public User com..UserService.findById(..))

匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法

+:专用于匹配子类类型

execution(* *..*Service+.*(..))

同样我们🍊个🌰:

execution(void com.taro.dao.BookDao.update()) 匹配接口             ,能匹配到 execution(void com.taro.dao.impl.BookDaoImpl.update()) 匹配实现类       ,能匹配到 execution(* com.taro.dao.impl.BookDaoImpl.update()) 返回值任意                    ,能匹配到 execution(* com.taro.dao.impl.BookDaoImpl.update(*)) 返回值任意             ,但是update方法必须要有一个参数,无法匹配                    ,要想匹配需要在update接口和实现类添加参数 execution(void com.*.*.*.*.update()) 返回值为void,com包下的任意包三层包下的任意类的update方法                    ,匹配到的是实现类,能匹配 execution(void com.*.*.*.update()) 返回值为void,com包下的任意两层包下的任意类的update方法             ,匹配到的是接口                    ,能匹配 execution(void *..update()) 返回值为void       ,方法名是update的任意包下的任意类             ,能匹配 execution(* *..*(..)) 匹配项目中任意类的任意方法                   ,能匹配       ,但是不建议使用这种方式       ,影响范围广 execution(* *..u*(..)) 匹配项目中任意包任意类下只要以u开头的方法                   ,update方法能满足             ,能匹配 execution(* *..*e(..)) 匹配项目中任意包任意类下只要以e结尾的方法       ,update和save方法能满足                    ,能匹配 execution(void com..*()) 返回值为void             ,com包下的任意包任意类任意方法,能匹配                    ,*代表的是方法 execution(* com.itheima.*.*Service.find*(..)) 将项目中所有业务层方法的以find开头的方法匹配 execution(* com.itheima.*.*Service.save*(..)) 将项目中所有业务层方法的以save开头的方法匹配

书写通配符注意事项:

所有代码按照标准规范开发                    ,否则以下技巧全部失效 描述切入点通 通常描述接口 ,而不描述实现类,如果描述到实现类             ,就出现紧耦合了 访问控制修饰符针对接口开发均采用public描述(可省略访问控制修饰符描述) 返回值类型对于增删改类使用精准类型加速匹配                    ,对于查询类使用*通配符快速描述 包名书写尽量不使用…匹配       ,效率过低             ,常用*做单个包描述匹配                   ,或精准匹配 接口名/类名书写名称与模块相关的采用*匹配       ,例如UserService书写成*Service       ,绑定业务层接口名 方法名书写以动词进行精准匹配                   ,名词采用匹配             ,例如getById书写成getBy,selectAll书写成selectAll 参数规则较为复杂       ,根据业务方法灵活调整 通常 不使用异常 作为 匹配 规则

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
cannotuseaccessory翻译(全网详细解决Cannot deserialize instance of `com.xxx.实体类`out of START_ARRAY token at [Source: (PushbackInpu)