Spring EL表达式::
1、execution 表达式
语法格式: execution(返回类型.包名.类名.方法名(参数表))
exection(*.com.xxx.AService.*(..))
com.xxx.AService 类型中的任意方法,任意类型返回结果,参数表不限定,都增加切面
应用:最常用。也是相对最通用。根据方法执行的标准,定义切点 如 事务 日志
<aop:config>
<aop:pointcut expression="execution(* com.bjsxt.test.Demo.demo1(..))" id="mypoint"/>
</aop:config>
2、target 表达式
以目标对象作为切点的表达式定义方式 (用于某一个接口or某一类接口)
语法:target(包名.接口名)
如:target(com.xx.IA) 所有实现了IA接口的实现类,作为代理的目标对象,会自动增加通知的织入,是实现切面
应用:为某一个具体的接口实现提供的配置。如 登录的时候需要执行的附属逻辑是比较多的。在不同的业务流程中,附属逻辑也不同。如,电商中,可能在登录的时候需要去执行购物车合并
<aop:config> <aop:pointcut expression="target(com.bjsxt.aop.TestService)" id="mypoint"/> </aop:config>
3、this 表达式
实现某接口的任意代理对象都作为切点
语法:this(包名.接口名)
如:this(com.xxx.IA) 代理对象 Proxy如果实现了IA接口,则作为连接点
应用:针对某个具体的代理提供的配置。比target切点粒度细致。因为目标对象可以多实现。代理对象可以针对目标对象实现的多个接口的某一个接口,提供特定的切点。如,银行中的登录,银行中的账户种类非常多,且有交叉。如借记卡,贷记卡,借记还贷卡。。。。可以针对还贷接口提供一个切点,做还贷信息 的记录等。
<aop:config> <aop:pointcut expression="this(com.bjsxt.aop.TestService)" id="mypoint"/> </aop:config>
4、 within 表达式
以包作为目标,定义切点
语法: within(包名.*) 代表在包中的任意接口或类型都作为切点
应用:针对某一个包提供的切点,粒度比target粗糙。如:某包中的所有接口都需要执行某附属逻辑。如 电商平台中的下订单。下订单服务中可能需要特定的逻辑(时间戳校验,库存检查等),这些逻辑,是其他业务线中不需要提供切面的
<aop:config> <aop:pointcut expression="within (com.bjsxt.aop.*)" id="mypoint"/> </aop:config>
5、args表达式
以参数标准作为目标,定义切点
语法: args(类型,类型.....) 代表方法的参数表符合要求的时候,作为切点,参数表是有顺序的
应用:主要应用在参数校验中。如:登录的时候必须传递两个字符串参数(登录名和密码)。可以使用args来限定。配合这execution实现。如:execution(.*.xxx.*.login(..)) args(String,String)。是使用频率最低的表达式
<aop:config> <aop:pointcut expression="args (java.lang.String)" id="mypoint"/> </aop:config>