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

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

时间2025-06-20 18:01:59分类IT科技浏览4794
导读:先来认识两个概念吧(其实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
腾讯电脑管家百度百科(腾讯电脑管家中腾讯新闻是什么?)