spring切点表达式注解(Spring AOP切入点表达式)
导读:先来认识两个概念吧(其实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版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!