科学是实事求是的学问,来不得半点虚假。
目录 / 分类
数据库基础
数据库原理
SQL语言
网络原理
DB4O
Access
基础知识
驱动及连接
试题参考
技术手册
应用案例
常见问题
SQLServer
基础知识
驱动及连接
管理工具
技术手册
应用案例
常见问题
MySQL
基础知识
驱动连接
管理工具
技术手册
应用案例
常见问题
SQLite
基础知识
驱动及连接
管理工具
技术手册
应用案例
常见问题
Oracle
基础知识
驱动连接
管理工具
技术手册
应用案例
常见问题
PostgreSQL
基础知识
驱动及连接
管理工具
技术手册
应用案例
常见问题
移动应用
JavaME
Android
微信开发
经验分享
Java组件
Java开发
应用办公
常见问题解决
Delphi
硬件故障解决
WEB
HTML5
Javascript
速查表
文件同步
服务器配置
Apache
Tomcat
Resin
协议&概念
IIS&ASP
win&linux
Absolute Database
nginx
OpenFire
Redis
freeswitch
网文摘录
IT杂谈
网文转载
行业新闻
热点推荐
下载中心
软件下载
CUBRID数据库
介绍及使用
验证/二维/条形码
验证码原理及实现
二维码相关
条形码相关
在线二维码生成
在线条形码生成
当前位置:
首页
>
经验分享
>
Java组件
Spring AOP中pointcut expression表达式解析
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
aop:aspectref
=
"aspectDef"
>
<
aop:pointcutid
aop:pointcutid
="pointcut1"
expression
="execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))"
/>
<
aop:before
pointcut-ref
=
"pointcut1"
method
=
"beforeAdvice"
/>
</
aop:aspect
>
</
aop:config
>
@Component
@Aspect
public 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...");
}
上一篇:MyBatis之动态SQL语句
下一篇:Spring声明事务的时候如果代码中commit
本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by
DEVSOARTECH
豫ICP备11002312号-2
豫公网安备 41010502002439号