spring aop expression简单说明

来源:互联网 发布:形容梦醒怅然若失知乎 编辑:程序博客网 时间:2024/05/16 03:24
<aop:config>       <aop:pointcut id="userDAO"           expression="execution(public * cn.dao.IUserDAO.*(..))" />       <aop:advisor advice-ref="tx" pointcut-ref="userDAO"/></aop:config>

在上面的代码中

execution   是方法运行

public         是指定public的方法,也可以不写直接:execution(* cn.dao.IUserDAO.*(..)

*                  是任意返回值,可以有返回值,也可以是void没有返回值的方法

cn.dao.IUserDAO.*                  是指定目录下的指定类任意方法

cn.dao.IUserDAO.insert*       是指定目录下的指定类insert开头的任意方法

cn.dao.IUserDAO.*.*              是指定目录下的任意类下的任意方法

cn.dao..*.*                                是指定目录下的任意目录下任意类下的任意方法

(..)                                              是任何参数,可以是没有参数

 

 

在execution中是可以有多个的方法,例如:

execution(* com.action.userinfoAction..*(..))&&execution(* com.action.memberAction..*(..))&&!execution(* get*(..))&&!execution(* set*(..))

 

 

Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. 
Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. 
args() 
@args() 
execution() 
this() 
target() 
@target() 
within() 
@within() 
@annotation 
其中execution 是用的最多的,其格式为: 
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?) 
returning type pattern,name pattern, and parameters pattern是必须的. 
ret-type-pattern:可以为*表示任何返回值,全路径的类名等. 
name-pattern:指定方法名,*代表所以,set*,代表以set开头的所有方法. 
parameters pattern:指定方法参数(声明的类型),(..)代表所有参数,(*)代表一个参数,(*,String)代表第一个参数为任何值,第二个为String类型. 
举例说明: 
任意公共方法的执行: 
execution(public * *(..)) 
任何一个以“set”开始的方法的执行: 
execution(* set*(..)) 
AccountService 接口的任意方法的执行: 
execution(* com.xyz.service.AccountService.*(..)) 
定义在service包里的任意方法的执行: 
execution(* com.xyz.service.*.*(..)) 
定义在service包和所有子包里的任意类的任意方法的执行: 
execution(* com.xyz.service..*.*(..)) 
定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行: 
execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))") 
***> 最靠近(..)的为方法名,靠近.*(..))的为类名或者接口名,如上例的JoinPointObjP2.*(..)) 

pointcutexp包里的任意类. 
within(com.test.spring.aop.pointcutexp.*) 
pointcutexp包和所有子包里的任意类. 
within(com.test.spring.aop.pointcutexp..*) 
实现了Intf接口的所有类,如果Intf不是接口,限定Intf单个类. 
this(com.test.spring.aop.pointcutexp.Intf) 
***> 当一个实现了接口的类被AOP的时候,用getBean方法必须cast为接口类型,不能为该类的类型.

带有@Transactional标注的所有类的任意方法. 
@within(org.springframework.transaction.annotation.Transactional) 
@target(org.springframework.transaction.annotation.Transactional) 
带有@Transactional标注的任意方法. 
@annotation(org.springframework.transaction.annotation.Transactional) 
***> @within和@target针对类的注解,@annotation是针对方法的注解 

参数带有@Transactional标注的方法. 
@args(org.springframework.transaction.annotation.Transactional) 
参数为String类型(运行是决定)的方法. 
args(String) 
Pointcut 可以通过Java注解和XML两种方式配置,如下所示:

复制代码
<aop:config>    <aop:aspectref="aspectDef">        <aop:pointcutid="pointcut1"expression="execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))"/>        <aop:before pointcut-ref="pointcut1" method="beforeAdvice" />    </aop:aspect></aop:config>@Component@Aspectpublic class AspectDef {    //@Pointcut("execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))")    //@Pointcut("within(com.test.spring.aop.pointcutexp..*)")    //@Pointcut("this(com.test.spring.aop.pointcutexp.Intf)")    //@Pointcut("target(com.test.spring.aop.pointcutexp.Intf)")    //@Pointcut("@within(org.springframework.transaction.annotation.Transactional)")    //@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")    @Pointcut("args(String)")    public void pointcut1() {    }    @Before(value = "pointcut1()")    public void beforeAdvice() {        System.out.println("pointcut1 @Before...");    }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃鸡使用改名卡改名符号怎么办 爱派平板电脑密码忘了怎么办 电脑优酷下载总显示未知错误怎么办 文本文档打开时显字符丢失怎么办 系统文件过大无法放进u盘怎么办 淘宝上买的密钥激活不了怎么办 苹果手机玩游戏屏幕卡住不动怎么办 电脑系统安装好一排英文字怎么办 赴日签证申请表写错了怎么办 不知道自己想要做什么工作怎么办 三星note4微信出现闪退怎么办 魅蓝note6手机自动闪退怎么办 苹果6s系统内存占用量过大怎么办 想在一年通过会计初级和中级怎么办 特殊岗位退休档察写的力工怎么办 面试时期望工资说低了。怎么办 面试时期望薪资写低了怎么办 高考后比一模差了80分怎么办 戒了烟我不习惯没有你我怎么办 没有你我不习惯没有你我怎么办 做什么都没兴趣嫌麻烦怎么办 快递还在路上就确认收货了怎么办 微信显示时间与手机不符怎么办 微信提示银行卡预留手机不符怎么办 得了湿疹后吃了海鲜严重了怎么办 看到小区街道乱扔的垃圾你会怎么办 去韩国干服务员不会讲韩语怎么办 华为手机键盘变英文字母大了怎么办 淘宝申请售后卖家余额不足怎么办 发票名称少写了一个字怎么办 微博数量与实际数量不一致怎么办 在淘宝中要买的商品卖完了怎么办 病因写错了保险不报销怎么办? 上学期间保险名字写错了怎么办 塑料盆上的商标纸撕了胶怎么办 川航买机票名字错了两个字怎么办 买机票护照号码填错了怎么办 换旅行证给孩子改名字怎么办 浦发信用卡卡片名字印错了怎么办 公主工作很辛苦坚持不下去怎么办 在表格里怎么办名字转换成拼音