spring 2.5 aop 1

Spring 2.5 aop

类别

函数

入参

说明

方法切点函数

execution

方法匹配模式串

满足某一匹配模式的所有目标类方法的连接点。如execution(*greetTo(..))表示所有目标类中的greetTo()方法

@annotation()

方法注解类名

@annotation(com.myapp.Test)表示任何标注了@Test的目标方法类

方法入参切点函数

args()

类名

args(com.myapp.Waiter)表示所有有且仅有一个按类型匹配于Waiter入参的方法

@args()

类型注解类名

@args(com.myapp.Test)表示有且仅有一个入参且如参对象的类标注@Test注解

目标类切点函数

within()

类名匹配串

within(com.myapp.service.*)表示com.myapp.service包中所有类的所有方法。

within(com.myapp.dao.*Dao)表示在com.myapp.dao包中所有以Dao结尾的所有连接点

target()

类名

通过target(com.myapp.Service)定义的切点,Service、以及Service实现类ServiceImp中所有连接点都匹配该切点

@within()

类型注解类名

@within(com.myapp.Service)定义的切点,假如Test类标注了@Service注解,那么Test以及Test的实现类TestImp的所有连接点都匹配

@target()

类型注解类名

@target(com.myapp.Test)假如Service标注了@Test,则Service所有连接点匹配切点

代理类切点函数

this()

类名

代理类按类型匹配于指定类,则被代理的目标类所有连接点匹配切点

 

使用JointPoint pProceedingJointPoint  p.getArgs()即为拦截方法所要传递的参数

 

 

在如下的两个@AfterReturning @AfterThrowing注释中,doAccessCheck()中的String value doExeceptionActions()中的Throwable ex必须同名,但是这并不是意味着,只有在方法中返回”value”或者是抛出”ex”这样的参数才能够被捕获,而是在程序中只要存在返回,或者抛出,不论是什么参数,都能够被捕获

@AfterReturning(pointcut="inexampleLayar()",returning="value")

    public void doAccessCheck(JoinPoint j,String value)

    {}

@AfterThrowing(pointcut = "method1()", throwing = "ex")

    public void doExceptionActions(JoinPoint jp, Throwable ex) {}

 

 

执行顺序:

 

开始顺序@Around()--@Before()--@AfterReturning()--@After()

结束顺序@Before()--@Around()@AfterReturning()--@After()

1.around method() start....

2.before method start..

2 before method finished...

in getFoo **  //业务执行

1 around method() finished ...

3.do access check start....

3 do access check finished...

4.after medhod check start....

4 after method finished...

 

在使用@AfterThrowing 时,必须将其放在第一位,即@Around之前,否则@AfterThrowing将实效。被捕获后的错误如果不再次抛出,将不会被函数体执行的catch块捕获,如果使用@AfterThrowing去捕获错误,则希望被捕获的函数体不要使用try catch 块,如果使用,则应该将错误再次抛出,例如try{…} catch(Exception e){ throw e}, @AfterThrowing中捕获到的异常处理之后,如果再次抛出,则上层也不会再得到异常信息。

 

 

参数入参中使用的通配符

l  * 匹配任意字符,但它只能匹配上下文中的一个元素

l  .. 匹配任意字副,可以匹配上下文中的多个元素,但在表示类时,必须和*联合使用,而在表示入参时则单独使用。

l  + 表示按类型匹配制定类的所有类,仅能跟在类名后面

 

AspectJ

使用spring 2.x AspectJ,需要在配制文件中加入,以打开AspectJ的代理,

 

 

execution(public * *(..)) 任何公共方法

 

within(aop.example..*) aop.example包中的方法

 

execution(* aop.example.FooService.setFoo(String,int)) and args(name,age) setFoo(String name,int age )方法将被拦截

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7528999/viewspace-263395/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7528999/viewspace-263395/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值