网站空间多少钱一年,网站备案中,网站seoapp,做两个阿里网站吗对于AOP中切入点表达式#xff0c;我们总共会学习三个内容#xff0c;分别是语法格式、通配符和书写技巧。
语法格式
首先我们先要明确两个概念:
切入点:要进行增强的方法切入点表达式:要进行增强的方法的描述方式
对于切入点的描述#xff0c;我们其实是有两中方式的我们总共会学习三个内容分别是语法格式、通配符和书写技巧。
语法格式
首先我们先要明确两个概念:
切入点:要进行增强的方法切入点表达式:要进行增强的方法的描述方式
对于切入点的描述我们其实是有两中方式的先来看下前面的例子 描述方式一执行com.itheima.dao包下的BookDao接口中的无参数update方法
execution(void com.itheima.dao.BookDao.update())描述方式二执行com.itheima.dao.impl包下的BookDaoImpl类中的无参数update方法
execution(void com.itheima.dao.impl.BookDaoImpl.update())因为调用接口方法的时候最终运行的还是其实现类的方法所以上面两种描述方式都是可以的。
对于切入点表达式的语法为:
切入点表达式标准格式动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数) 异常名
对于这个格式我们不需要硬记通过一个例子理解它:
execution(public User com.itheima.service.UserService.findById(int))execution动作关键字描述切入点的行为动作例如execution表示执行到指定切入点public:访问修饰符,还可以是publicprivate等可以省略User返回值写返回值类型com.itheima.service包名多级包使用点连接UserService:类/接口名称findById方法名int:参数直接写参数的类型多个类型用逗号隔开异常名方法定义中抛出指定异常可以省略
切入点表达式就是要找到需要增强的方法所以它就是对一个具体方法的描述但是方法的定义会有很多所以如果每一个方法对应一个切入点表达式想想这块就会觉得将来编写起来会比较麻烦有没有更简单的方式呢?
就需要用到下面所学习的通配符。
通配符
我们使用通配符描述切入点主要的目的就是简化之前的配置具体都有哪些通配符可以使用? *:单个独立的任意符号可以独立出现也可以作为前缀或者后缀的匹配符出现 executionpublic * com.itheima.*.UserService.find*(*))匹配com.itheima包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法 ..多个连续的任意符号可以独立出现常用于简化包名与参数的书写 executionpublic User com..UserService.findById(..))匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法 专用于匹配子类类型 execution(* *..*Service.*(..))这个使用率较低描述子类的咱们做JavaEE开发继承机会就一次使用都很慎重所以很少用它。*Service表示所有以Service结尾的接口的子类。
接下来我们把案例中使用到的切入点表达式来分析下: execution(void com.itheima.dao.BookDao.update())
匹配接口能匹配到
execution(void com.itheima.dao.impl.BookDaoImpl.update())
匹配实现类能匹配到
execution(* com.itheima.dao.impl.BookDaoImpl.update())
返回值任意能匹配到
execution(* com.itheima.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..*())
返回值为voidcom包下的任意包任意类任意方法能匹配*代表的是方法
execution(* com.itheima.*.*Service.find*(..))
将项目中所有业务层方法的以find开头的方法匹配
execution(* com.itheima.*.*Service.save*(..))
将项目中所有业务层方法的以save开头的方法匹配后面两种更符合我们平常切入点表达式的编写规则
书写技巧
对于切入点表达式的编写其实是很灵活的那么在编写的时候有没有什么好的技巧让我们用用:
所有代码按照标准规范开发否则以下技巧全部失效描述切入点通**常描述接口**而不描述实现类,如果描述到实现类就出现紧耦合了访问控制修饰符针对接口开发均采用public描述可省略访问控制修饰符描述返回值类型对于增删改类使用精准类型加速匹配对于查询类使用*通配快速描述包名书写尽量不使用…匹配效率过低常用*做单个包描述匹配或精准匹配接口名/类名书写名称与模块相关的采用*匹配例如UserService书写成*Service绑定业务层接口名方法名书写以动词进行精准匹配名词采用匹配例如getById书写成getBy,selectAll书写成selectAll参数规则较为复杂根据业务方法灵活调整通常**不使用异常作为匹配**规则
[说明]内容主要来源黑马程序员网上资源学习