本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7593596
建立时间:2006年5月29日




[Spring]spring aop编程(二)
软件技术

lhwork 发表于 2006/12/30 10:09:58

前面主要介绍了如何通过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();   }   }


阅读全文(2962) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.377 second(s), page refreshed 144756098 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号