spring aop编程(二)
2007-01-24 16:41
344 查看
前面主要介绍了如何通过xml实现aop编程,下面主要介绍如何通过@AspectJ来实现。
为了使@AspectJ 支持生效,
需要做以下步骤:
在xml中设置
<aop:aspectj-autoproxy/>
或者
在xml中加入
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
声明 aspect
<bean id="myAspect" class="org.xyz.NotVeryUsefulAspect">
<!-- configure properties of aspect here as normal -->
</bean>
package org.xyz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class NotVeryUsefulAspect {
}
声明 pointcut
@Pointcut("execution(* transfer(..))")
public void transfer() {}
声明 advice
Before advice:
@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
public void doAccessCheck() {
// ...
}
After returning advice:
@AfterReturning("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
public void doAccessCheck() {
// ...
}
或者
@AfterReturning(
pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",
returning="retVal")
public void doAccessCheck(Object retVal) {
// ...
}
After throwing advice:
@AfterThrowing("SystemArchitecture.dataAccessOperation()")
public void doRecoveryActions() {
// ...
}
或者
@AfterThrowing(
pointcut=" SystemArchitecture.dataAccessOperation()",
throwing="ex")
public void doRecoveryActions(DataAccessException ex) {
// ...
}
After (finally) advice:
@After("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
public void doReleaseLock() {
// ...
}
Around advice:
@Around("com.xyz.myapp.SystemArchitecture.businessService()")
public Object doBasicProfiling( ProceedingJoinPoint pjp) throws Throwable {
// start stopwatch
Object retVal = pjp.proceed();
// stop stopwatch
return retVal;
}
Advice parameters:
@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation() &&" + "args(account,..)" )
public void validateAccount(Account account) {
// ...
}
声明参数名称:
@Before(
value="com.xyz.lib.Pointcuts.anyPublicMethod() && " +
"@annotation(auditable)",
argNames="auditable" )
public void audit(Auditable auditable) {
AuditCode code = auditable.value();
// ...
}
Advice 排序:
一般以声明的方法次序为先后
不同的 Advice ,通过实现 Ordered 接口,来排序
Introductions
用于引入新的接口
@Aspect
public class UsageTracking {
@DeclareParents(value="com.xzy.myapp.service.*+",
defaultImpl=DefaultUsageTracked.class)
public static UsageTracked mixin;
@Before("com.xyz.myapp.SystemArchitecture.businessService() &&" +
"this(usageTracked)")
public void recordUsage(UsageTracked usageTracked) {
usageTracked.incrementUseCount();
}
}
www.javabc.com
为了使@AspectJ 支持生效,
需要做以下步骤:
在xml中设置
<aop:aspectj-autoproxy/>
或者
在xml中加入
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
声明 aspect
<bean id="myAspect" class="org.xyz.NotVeryUsefulAspect">
<!-- configure properties of aspect here as normal -->
</bean>
package org.xyz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class NotVeryUsefulAspect {
}
声明 pointcut
@Pointcut("execution(* transfer(..))")
public void transfer() {}
声明 advice
Before advice:
@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
public void doAccessCheck() {
// ...
}
After returning advice:
@AfterReturning("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
public void doAccessCheck() {
// ...
}
或者
@AfterReturning(
pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",
returning="retVal")
public void doAccessCheck(Object retVal) {
// ...
}
After throwing advice:
@AfterThrowing("SystemArchitecture.dataAccessOperation()")
public void doRecoveryActions() {
// ...
}
或者
@AfterThrowing(
pointcut=" SystemArchitecture.dataAccessOperation()",
throwing="ex")
public void doRecoveryActions(DataAccessException ex) {
// ...
}
After (finally) advice:
@After("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
public void doReleaseLock() {
// ...
}
Around advice:
@Around("com.xyz.myapp.SystemArchitecture.businessService()")
public Object doBasicProfiling( ProceedingJoinPoint pjp) throws Throwable {
// start stopwatch
Object retVal = pjp.proceed();
// stop stopwatch
return retVal;
}
Advice parameters:
@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation() &&" + "args(account,..)" )
public void validateAccount(Account account) {
// ...
}
声明参数名称:
@Before(
value="com.xyz.lib.Pointcuts.anyPublicMethod() && " +
"@annotation(auditable)",
argNames="auditable" )
public void audit(Auditable auditable) {
AuditCode code = auditable.value();
// ...
}
Advice 排序:
一般以声明的方法次序为先后
不同的 Advice ,通过实现 Ordered 接口,来排序
Introductions
用于引入新的接口
@Aspect
public class UsageTracking {
@DeclareParents(value="com.xzy.myapp.service.*+",
defaultImpl=DefaultUsageTracked.class)
public static UsageTracked mixin;
@Before("com.xyz.myapp.SystemArchitecture.businessService() &&" +
"this(usageTracked)")
public void recordUsage(UsageTracked usageTracked) {
usageTracked.incrementUseCount();
}
}
www.javabc.com
相关文章推荐
- 使用Spring进行切面(AOP)编程
- spring AOP切面编程在方法执行前后切入日志
- spring学习之五(spring aop编程)
- Spring AOP编程实例
- Spring AOP: Spring之面向方面编程
- 【我看Spring】从一个简单的AOP示例看切面编程
- Spring代理模式、AOP编程、jdbc支持
- [Spring] Spring AOP编程理解
- Spring AOP编程-aspectJ注解开发
- spring面向切面编程AOP(Aspect-orented programming)
- Spring AOP面向切面编程一个简单例子和在配置过程中出现错误
- Spring之AOP,面向切面编程
- AOP面向切编程及在Spring中的使用方法
- spring aop 2.0 编程
- java ssh spring aop 切面编程 操作日志
- spring系列(五):切面编程(aop)3
- spring AOP面向切面编程的四种实现方式
- SSH学习之——Spring面向方面编程AOP
- spring的AOP编程中各个通知出现的地方和顺序
- Spring aop 编程