基于@Aspect的AOP

        @AspectJ使用注解来描述切点和增强
        Spring在处理@AspectJ注释表达式的时候,需要将asm模块添加到类路径中。asm是轻量级的字节码处理框架,因为java的反射机制无法获取入参名,Spring就
使用asm来处理入参名。
        此外spring采用AspectJ提供的@AspectJ注释类库以及相应的解析类库,将ivy-cache/repository目录下的aspectj.weaver和aspectj.tools类包加入到类路>径下。
        一个简单例子:
                package com.baobaotao;
                public class NaiveWaiter implements Waiter{
                        public void greetTo(String client){
                                System.out.println("NaiveWaiter:greet to"+clientName+"...");
                        }
                        public void serveTo(String clientName){
                                System.out.println("NaiveWaiter:serving"+clientName+"...");
                        }
                } 
        下面我们使用@AspectJ注解定义一个切面:
                package com.baobaotao.aspectj.aspectj;
                import org.aspectj.lang.annotation.Aspect;
                import org.aspectj.lang.annotation.Before;
                @AspectJ//通过该注释将PreGreetingAspect标识为一个切面
                public class PreGreetingAspect{
                        @Before("execution(* greetTo(..))")//横切点和增强类型
                        public void beforeGreeting(){//横切增强逻辑
                                System.out.println("How are you!");
                        }
                } 
        下面我们通过org.springframework.aop.aspectj.annotation.AspectProxyFactory为NaiveWaiter生成织入PreGreetingAspect切面的代理:
                package com.baobaotao.aspectj.example;
                import org.springframework.aop.aspectj.annotation.AspectProxyFactory;
                import com.baobaotao.NaiveWaiter;
                import com.baobaotao.Waiter;
                public class AspectJProxyTest{
                        Waiter target=new NaiveWiater();
                        AspectJProxyFactory factory=new AspectJProxyFactory();
                        factory.setTarget(target);
                        Waiter proxy=factory.getProxy();
                        proxy.greetTo("John");
                        proxy.greetTo("John");
                }
@AspectJ为各种的增强类型提供了不同的注解类,他们位于org.aspectj.lang.annotation.*包中:
                @Before:前置增强,两个成员:value(用于定义切点)、argNames(增强方法的参数名)
                @AfterReturning:后置增强,四个成员:value(定义切点)、pointcut(表示切点的信息)、returning(目标对象的返回值绑定给增强方法)、argNames(增强方法参数名)
                @Around:环绕增强,两个成员:value、argNames
                @AfterThrowing:抛出增强,四个成员:value、argNames、throwing、pointcut
                @After:Final增强,不管是抛出异常还是正常退出,该增强都会得到执行。两个成员:value、argNames
                @DeclareParants:引介增强,两个成员:value、defaultImpl(默认的接口实现)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值