AOP 相关术语
Joinpoint(连接点): 所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。 Pointcut(切入点): 所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。 Advice(通知/增强): 所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。 通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。 Introduction(引介): 引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方 法或 Field。 Target(目标对象): 代理的目标对象。 Weaving(织入): 是指把增强应用到目标对象来创建新的代理对象的过程。 spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。 Proxy(代理): 一个类被 AOP 织入增强后,就产生一个结果代理类。 Aspect(切面): 是切入点和通知(引介)的结合。
注解配置
@Aspect表明当前类是一个切面类
@Before
作用: 把当前方法看成是前置通知。 属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Before ( "execution(* com.dustdawn.service.impl.*.*(..))" )
public void beginTransaction ( ) {
try {
dbAssit. getCurrentConnection ( ) . setAutoCommit ( false) ;
} catch ( SQLException e) {
e. printStackTrace ( ) ;
}
}
@AfterReturning
作用: 把当前方法看成是后置通知。 属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用
@AfterReturning ( "execution(* com.dustdawn.service.impl.*.*(..))" )
public void commit ( ) {
try {
dbAssit. getCurrentConnection ( ) . commit ( ) ;
} catch ( SQLException e) {
e. printStackTrace ( ) ;
}
}
@AfterThrowing
作用: 把当前方法看成是异常通知。 属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用
@AfterThrowing ( "execution(* com.dustdawn.service.impl.*.*(..))" )
public void rollback ( ) {
try {
dbAssit. getCurrentConnection ( ) . rollback ( ) ;
} catch ( SQLException e) {
e. printStackTrace ( ) ;
}
}
@After
作用: 把当前方法看成是最终通知。 属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用
@After ( "execution(* com.dustdawn.service.impl.*.*(..))" )
public void release ( ) {
try {
dbAssit. releaseConnection ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
在 spring 配置文件中开启 spring 对注解 AOP 的支持
< ! -- 开启 spring 对注解 AOP 的支持 -- >
< aop: aspectj- autoproxy/ >
环绕通知注解配置
@Around
作用: 把当前方法看成是环绕通知。 属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Around ( "execution(* com.dustdawn.service.impl.*.*(..))" )
public Object transactionAround ( ProceedingJoinPoint pjp) {
Object rtValue = null;
try {
Object[ ] args = pjp. getArgs ( ) ;
beginTransaction ( ) ;
rtValue = pjp. proceed ( args) ;
commit ( ) ;
} catch ( Throwable e) {
rollback ( ) ;
e. printStackTrace ( ) ;
} finally {
release ( ) ;
}
return rtValue;
}
切入点表达式注解
@Pointcut
作用: 指定切入点表达式 属性: value:指定表达式的内容
@Pointcut ( "execution(* com.dustdawn.service.impl.*.*(..))" )
private void pt1 ( ) { }
引用方式:
@Around ( "pt1()" )
public Object transactionAround ( ProceedingJoinPoint pjp) {
Object rtValue = null;
try {
Object[ ] args = pjp. getArgs ( ) ;
beginTransaction ( ) ;
rtValue = pjp. proceed ( args) ;
commit ( ) ;
} catch ( Throwable e) {
rollback ( ) ;
e. printStackTrace ( ) ;
} finally {
release ( ) ;
}
return rtValue;
}