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 p、ProceedingJointPoint 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/