Some examples of common pointcut expressions are given below.
-
the execution of any public method:
-
execution(public * *(..))
-
the execution of any method with a name beginning with "set":
-
execution(* set*(..))
-
the execution of any method defined by the
AccountService
interface: -
execution(* com.xyz.service.AccountService.*(..))
-
the execution of any method defined in the service package:
-
execution(* com.xyz.service.*.*(..))
-
the execution of any method defined in the service package or a sub-package:
-
execution(* com.xyz.service..*.*(..))
-
any join point (method execution only in Spring AOP) within the service package:
-
within(com.xyz.service.*)
-
any join point (method execution only in Spring AOP) within the service package or a sub-package:
within(com.xyz.service..*)
-
any join point (method execution only in Spring AOP) where the proxy implements the
AccountService
interface:this(com.xyz.service.AccountService)
'this' is more commonly used in a binding form :- see the following section on advice for how to make the proxy object available in the advice body.
-
any join point (method execution only in Spring AOP) where the target object implements the
AccountService
interface:target(com.xyz.service.AccountService)
'target' is more commonly used in a binding form :- see the following section on advice for how to make the target object available in the advice body.
-
any join point (method execution only in Spring AOP) which takes a single parameter, and where the argument passed at runtime is
Serializable
:args(java.io.Serializable)
'args' is more commonly used in a binding form :- see the following section on advice for how to make the method arguments available in the advice body.
Note that the pointcut given in this example is different to
execution(* *(java.io.Serializable))
: the args version matches if the argument passed at runtime is Serializable, the execution version matches if the method signature declares a single parameter of typeSerializable
. -
any join point (method execution only in Spring AOP) where the target object has an
@Transactional
annotation:@target(org.springframework.transaction.annotation.Transactional)
'@target' can also be used in a binding form :- see the following section on advice for how to make the annotation object available in the advice body.
-
any join point (method execution only in Spring AOP) where the declared type of the target object has an
@Transactional
annotation:@within(org.springframework.transaction.annotation.Transactional)
'@within' can also be used in a binding form :- see the following section on advice for how to make the annotation object available in the advice body.
-
any join point (method execution only in Spring AOP) where the executing method has an
@Transactional
annotation:@annotation(org.springframework.transaction.annotation.Transactional)
'@annotation' can also be used in a binding form :- see the following section on advice for how to make the annotation object available in the advice body.
-
any join point (method execution only in Spring AOP) which takes a single parameter, and where the runtime type of the argument passed has the
@Classified
annotation:@args(com.xyz.security.Classified)
'@args' can also be used in a binding form :- see the following section on advice for how to make the annotation object(s) available in the advice body.
-
any join point (method execution only in Spring AOP) on a Spring bean named '
tradeService
':bean(tradeService)
-
any join point (method execution only in Spring AOP) on Spring beans having names that match the wildcard expression '
*Service
':bean(*Service)
对应的中文:
任意公共方法的执行:
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'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得代理对象可以在通知体内访问到的部分。
实现了 AccountService 接口的目标对象的任意连接点(在Spring AOP中只是方法执行) :
target(com.xyz.service.AccountService)
'target'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得目标对象可以在通知体内访问到的部分。
任何一个只接受一个参数,且在运行时传入的参数实现了 Serializable 接口的连接点 (在Spring AOP中只是方法执行)
args(java.io.Serializable)
'args'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得方法参数可以在通知体内访问到的部分。 请注意在例子中给出的切入点不同于 execution(* *(java.io.Serializable)): args只有在动态运行时候传入参数是可序列化的(Serializable)才匹配,而execution 在传入参数的签名声明的类型实现了 Serializable 接口时候匹配。
有一个 @Transactional 注解的目标对象中的任意连接点(在Spring AOP中只是方法执行)
@target(org.springframework.transaction.annotation.Transactional)
'@target' 也可以在binding form中使用:请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。
任何一个目标对象声明的类型有一个 @Transactional 注解的连接点(在Spring AOP中只是方法执行)
@within(org.springframework.transaction.annotation.Transactional)
'@within'也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。
任何一个执行的方法有一个 @Transactional annotation的连接点(在Spring AOP中只是方法执行)
@annotation(org.springframework.transaction.annotation.Transactional)
'@annotation' 也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。
任何一个接受一个参数,并且传入的参数在运行时的类型实现了 @Classified annotation的连接点(在Spring AOP中只是方法执行)
@args(com.xyz.security.Classified)
相关推荐
在Spring AOP(面向切面编程)中,切入点表达式是定义通知(advice)执行时机的关键元素。本文将深入探讨9种不同的切入点表达式及其用法,通过实际的示例代码来帮助理解它们的工作原理。 1. **execute()**: `...
使用mindmaster打开
总之,Spring框架的切入点表达式是实现AOP功能的关键,通过它们可以灵活地定义拦截的范围和规则,实现如事务管理、日志记录等横切关注点。通过熟练掌握切入点表达式的使用,可以提高代码的模块化和可维护性。
- `<aop:pointcut>`:定义切入点表达式,例如`execution(* com.example.service.*.*(..))`表示匹配com.example.service包下的所有方法。 - `<aop:advisor>`:定义通知和切入点的关联,指定何时何地执行通知。 - `...
例如,切入点表达式`execution(* EmployeeManager.getEmployeeById(...))`表示匹配所有在`EmployeeManager`接口中名为`getEmployeeById`的方法执行。 总的来说,Spring AOP通过代理和通知机制,实现了横切关注点的...
在传统的AOP配置中,我们需要定义切入点表达式和通知(advice)在XML配置文件中。然而,使用注解可以让这些配置变得更加直观和易于维护。例如,我们可以使用`@Aspect`注解来定义一个切面类,`@Before`、`@After`、`@...
在实际项目中,你可以根据需求定义不同的通知类型,如`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`,以及复杂的切入点表达式。通过这些,你可以实现更精细的控制,如只对特定方法、异常或返回值进行...
4. **丰富的切入点表达式语言**:Spring AOP支持使用SpEL(Spring Expression Language)来定义复杂的切入点表达式,这让开发者能够更加灵活地控制通知的触发条件。 #### 四、Spring AOP的实现示例 接下来,我们...
切入点表达式匹配连接点,决定通知何时执行。 5. **代理(Proxy)**:Spring AOP通过动态代理机制创建目标对象的代理对象,代理对象负责在方法调用前后执行通知。 在XML配置中,我们通常会定义一个`<aop:config>`...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是...在`myaop`项目中,你可以找到具体的示例代码,包括切面类、切入点表达式以及相应的注解使用,通过这些示例可以更深入地理解Spring AOP的注解配置。
在编写切入点表达式时,我们需要使用AspectJ的类型匹配语法,如`*`代表任意字符,`..`匹配任意数量的子包或参数,`+`匹配指定类型的子类型。这些通配符使得切入点表达式具有很高的灵活性,能够精确或广泛地定位到...
- **切入点(Pointcut)**:匹配连接点的表达式,用于指定通知应用的具体位置。 - **织入(Weaving)**:将切面与应用程序的其他部分结合在一起的过程,可以发生在编译时、类加载时或运行时。 ### 2. Spring AOP的...
2. **XML配置驱动**:在Spring配置文件中定义切面、通知和切入点表达式。 **Spring AOP示例** 以入门级的`advice`为例,我们可能有一个简单的日志切面: ```java @Aspect @Component public class LoggingAspect ...
切入点表达式是面向切面编程(AOP)中不可或缺的一部分,尤其在AspectJ和Spring框架中,用于精确地定义何时及何处应用切面。本文将深入探讨AspectJ的切入点表达式,包括其语法结构和常见用法。 切入点表达式的核心...
2. 开启AOP代理:在Spring配置文件中,通过`<aop:config>`标签开启AOP支持,并可以定义切入点表达式(pointcut expression)和通知类型。 3. 定义切面:你可以使用Spring的`@Aspect`注解来定义一个切面类,然后在类...
切入点表达式是AOP的核心,它定义了哪些方法会被通知拦截。基本语法包括: - `execution()`:匹配方法执行。 - `this()`:匹配目标对象类型。 - `target()`:匹配目标bean的类型。 - `args()`:匹配方法参数。 - `@...
-- 定义切入点表达式 --> <aop:pointcut id="myPointcut" expression="execution(* com.example.service.*.*(..))"/> <!-- 配置通知 --> <aop:before method="beforeMethod" pointcut-ref="myPointcut"/> <aop...
AspectJ是一个强大的、成熟的AOP框架,它扩展了Java语言,允许开发者定义切面、切入点表达式和通知。在Spring AOP中,你可以选择使用AspectJ的编译时或运行时织入,以实现更细粒度的控制和更高的性能。 2. **...
`<aop:before>`和`<aop:after>`标签分别定义了在方法执行前和执行后调用的advice(通知),pointcut(切入点表达式)定义了这些通知应该应用到哪些方法上。 接下来,我们来看看使用AOP标签的方式。从Spring 3.0开始...
1. 当Spring容器启动时,会扫描所有带有`@Aspect`注解的类,并将其转换为对应的`AspectJExpressionPointcut`对象,这是Spring AOP的核心类,用于匹配切入点表达式。 2. 当遇到一个切入点匹配的连接点时,Spring会...