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

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

时间2025-09-16 15:57:39分类IT科技浏览5573
导读:先来认识两个概念吧(其实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
看新闻赚钱的十大软件排行榜,已赚10万挣钱游戏排行(什么软件看新闻赚钱快-还在“刷新闻赚现金”?当心碰触到法律底线) ie浏览器怎么清除保存的登录账号(如何清理IE浏览器的鼠标右键菜单?)