读书人

Spring AOP 概念懂得及@AspectJ支持

发布时间: 2012-10-18 13:46:55 作者: rapoo

Spring AOP 概念理解及@AspectJ支持

为了更好的理解Spring简介一文http://quicker.iteye.com/blog/670056中的概念,下面通过一些示例来加以说明。

首先要理解代理模式:有静态代理和动态代理

有关代理模式相关文章:

http://quicker.iteye.com/blog/571494

http://quicker.iteye.com/blog/571493

下面先给出静态代理的代码。

使用的最频繁的返回类型模式是*,它代表了匹配任意的返回类型。 一个全限定的类型名将只会匹配返回给定类型的方法。名字模式匹配的是方法名。 你可以使用*通配符作为所有或者部分命名模式。  参数模式稍微有点复杂:()匹配了一个不接受任何参数的方法, 而(..)匹配了一个接受任意数量参数的方法(零或者更多)。   模式(*)匹配了一个接受一个任何类型的参数的方法。 模式(*,String)匹配了一个接受两个参数的方法,第一个可以是任意类型, 第二个则必须是String类型。

?

任意公共方法的执行:

execution(public * *(..))

任何一个名字以“set”开始的方法的执行:

execution(* set*(..))

AccountService接口定义的任意方法的执行:

execution(* com.xyz.service.AccountService.*(..))

在service包中定义的任意方法的执行:

execution(* com.xyz.service.*.*(..))

在service包或其子包中定义的任意方法的执行:

execution(* com.xyz.service..*.*(..))

在service包中的任意连接点(在Spring AOP中只是方法执行):

within(com.xyz.service.*)

在service包或其子包中的任意连接点(在Spring AOP中只是方法执行):

within(com.xyz.service..*)

实现了AccountService接口的代理对象的任意连接点 (在Spring AOP中只是方法执行):

this(com.xyz.service.AccountService)

?

'this'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得代理对象在通知体内可用。

实现AccountService接口的目标对象的任意连接点 (在Spring AOP中只是方法执行):

target(com.xyz.service.AccountService)

?

'target'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得目标对象在通知体内可用。

任何一个只接受一个参数,并且运行时所传入的参数是Serializable 接口的连接点(在Spring AOP中只是方法执行)

args(java.io.Serializable)

'args'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得方法参数在通知体内可用。

请注意在例子中给出的切入点不同于 execution(* *(java.io.Serializable)): args版本只有在动态运行时候传入参数是Serializable时才匹配,而execution版本在方法签名中声明只有一个 Serializable类型的参数时候匹配。

目标对象中有一个 @Transactional 注解的任意连接点 (在Spring AOP中只是方法执行)

@target(org.springframework.transaction.annotation.Transactional)

?

'@target'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。

任何一个目标对象声明的类型有一个 @Transactional 注解的连接点 (在Spring AOP中只是方法执行):

@within(org.springframework.transaction.annotation.Transactional)

?

'@within'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。

任何一个执行的方法有一个 @Transactional 注解的连接点 (在Spring AOP中只是方法执行)

@annotation(org.springframework.transaction.annotation.Transactional)

?

'@annotation'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。

任何一个只接受一个参数,并且运行时所传入的参数类型具有@Classified 注解的连接点(在Spring AOP中只是方法执行)

@args(com.xyz.security.Classified)

?

'@args'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。

任何一个在名为'tradeService'的Spring bean之上的连接点 (在Spring AOP中只是方法执行):

bean(tradeService)

任何一个在名字匹配通配符表达式'*Service'的Spring bean之上的连接点 (在Spring AOP中只是方法执行):

bean(*Service)
1 楼 mengf2009 2011-07-12 请问怎么能够不直接依赖注入userManager接口,例如以component-scan方式注入userManager

读书人网 >ASP

热点推荐