spring 2.5 aop 1

上一篇 / 下一篇  2008-05-08 22:54:39 / 个人分类:spring

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 valuedoExeceptionActions()中的Throwable ex必须同名,但是这并不是意味着,只有在方法中返回”value”或者是抛出”ex”这样的参数才能够被捕获,而是在程序中只要存在返回,或者抛出,不论是什么参数,都能够被捕获

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

   publicvoiddoAccessCheck(JoinPoint j,String value)

   {}

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

   publicvoiddoExceptionActions(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,需要在配制文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>,以打开AspectJ的代理,

 

 

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

 

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

 

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

 

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-05-17  
    123
45678910
11121314151617
18192021222324
25262728293031

数据统计

  • 访问量: 38
  • 日志数: 10
  • 建立时间: 2007-12-21
  • 更新时间: 2008-05-16

RSS订阅

Open Toolbar