`

Spring AOP中pointcut expression表达式解析

阅读更多

Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的.
Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. 
args()
@args()
execution()
this()
target()
@target()
within()
@within()
@annotation
其中execution 是用的最多的,其格式为:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
returning type pattern,name pattern, and parameters pattern是必须的.
ret-type-pattern:可以为*表示任何返回值,全路径的类名等.
name-pattern:指定方法名,*代表所以,set*,代表以set开头的所有方法.
parameters pattern:指定方法参数(声明的类型),(..)代表所有参数,(*)代表一个参数,(*,String)代表第一个参数为任何值,第二个为String类型.
举例说明:
任意公共方法的执行:
execution(public * *(..))
任何一个以“set”开始的方法的执行:
execution(* set*(..))
AccountService 接口的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
定义在service包里的任意方法的执行:
execution(* com.xyz.service.*.*(..))
定义在service包和所有子包里的任意类的任意方法的执行:
execution(* com.xyz.service..*.*(..))
定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:
execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))")
***> 最靠近(..)的为方法名,靠近.*(..))的为类名或者接口名,如上例的JoinPointObjP2.*(..))

pointcutexp包里的任意类.
within(com.test.spring.aop.pointcutexp.*)
pointcutexp包和所有子包里的任意类.
within(com.test.spring.aop.pointcutexp..*)
实现了Intf接口的所有类,如果Intf不是接口,限定Intf单个类.
this(com.test.spring.aop.pointcutexp.Intf)
***> 当一个实现了接口的类被AOP的时候,用getBean方法必须cast为接口类型,不能为该类的类型.

带有@Transactional标注的所有类的任意方法.
@within(org.springframework.transaction.annotation.Transactional)
@target(org.springframework.transaction.annotation.Transactional)
带有@Transactional标注的任意方法.
@annotation(org.springframework.transaction.annotation.Transactional)
***> @within和@target针对类的注解,@annotation是针对方法的注解

参数带有@Transactional标注的方法.
@args(org.springframework.transaction.annotation.Transactional)
参数为String类型(运行是决定)的方法.
args(String)
Pointcut 可以通过Java注解和XML两种方式配置,如下所示:

<aop:config>
	<aop:aspectref="aspectDef">
		<aop:pointcutid="pointcut1"expression="execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))"/>
		<aop:before pointcut-ref="pointcut1" method="beforeAdvice" />
	</aop:aspect>
</aop:config>

@Component
@Aspect
public class AspectDef {
	//@Pointcut("execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))")
	//@Pointcut("within(com.test.spring.aop.pointcutexp..*)")
	//@Pointcut("this(com.test.spring.aop.pointcutexp.Intf)")
	//@Pointcut("target(com.test.spring.aop.pointcutexp.Intf)")
	//@Pointcut("@within(org.springframework.transaction.annotation.Transactional)")
	//@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
	@Pointcut("args(String)")
	public void pointcut1() {
	}
	@Before(value = "pointcut1()")
	public void beforeAdvice() {
		System.out.println("pointcut1 @Before...");
	}

 

分享到:
评论

相关推荐

    在自定义spring aop中使用el获取拦截方法的变量值。

    标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...

    pointcut表达式and or not在xml中配置

    在Spring AOP中,Pointcut表达式通常使用AspectJ的表达式语法。这些表达式允许开发者指定何时执行AOP的增强功能。以下是一些基本的Pointcut表达式语法: - **execution()**:用于匹配方法执行。 - `execution(* ...

    Spring AOP中使用args表达式的方法示例

    Spring AOP中使用args表达式的方法示例 Spring AOP(Aspect-Oriented Programming)是一种面向切面编程的技术, args表达式是AOP中的一种表达式,它可以用来指定目标方法的参数类型和数量。下面我们将详细介绍...

    spring aop依赖jar包

    现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...

    Spring AOP面向方面编程原理:AOP概念

    4. **丰富的切入点表达式语言**:Spring AOP支持使用SpEL(Spring Expression Language)来定义复杂的切入点表达式,这让开发者能够更加灵活地控制通知的触发条件。 #### 四、Spring AOP的实现示例 接下来,我们...

    spring-aop实例

    在Spring AOP中,切面由两个主要部分组成:通知(advice)和切点(pointcut)。 2. **通知(Advice)**:通知是在特定的连接点(join point)执行的代码,它可以是前置通知(before advice)、后置通知(after ...

    Spring中的AOP不生效

    1. **确认是否正确配置了AOP切面**:检查AOP配置文件或类中的所有配置项是否设置正确,包括切入点表达式(Pointcut)、通知类型(Advice)等。 2. **检查Service类是否被Spring管理**:确保受影响的Service类已经...

    Spring aop 性能监控器

    尤其是`org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator`和`org.springframework.aop.aspectj.AspectJExpressionPointcut`这两个类,它们分别处理了基于注解的切面创建和切入点...

    springAOP配置动态代理实现

    1. **XML配置**:在Spring的配置文件中,可以通过&lt;aop:config&gt;标签来定义切面,&lt;aop:pointcut&gt;定义切点,&lt;aop:advisor&gt;或&lt;aop:aspect&gt;定义通知。例如: ```xml &lt;aop:config&gt; &lt;aop:pointcut id="myPointcut" ...

    spring aop注解方式、xml方式示例

    在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect public class LoggingAspect { // ... } ``` #### 2. 定义通知(Advice) 通知是在特定连接点...

    Spring Aop的简单实现

    在SLT-Spring-AOP这个项目中,你可以找到具体的实现示例,包括如何定义切面、通知和切入点表达式,以及如何在业务代码中应用这些概念。通过对该项目的深入学习,你将能够更好地理解和掌握Spring AOP的实战应用。

    spring AOP切面编程

    2. 切点表达式(Pointcut Expression):使用正则表达式或者预定义的切入点表达式(如execution()、within()、args()等)来定义切点。 四、通知类型 1. 前置通知(Before):在目标方法执行前执行,如`@Before`。 2...

    SpringAOP.zip

    Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。

    spring aop切面拦截指定类和方法实现流程日志跟踪

    为了解决这一问题,可以利用Spring框架中的AOP(Aspect Oriented Programming,面向切面编程)技术来实现。 #### 二、Spring AOP 概述 Spring AOP 是Spring框架提供的一种实现AOP的方法。通过AOP,开发者可以在不...

    spring aop xml 实例

    在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱,而Spring AOP(面向切面编程)则是Spring框架中的一个重要组成部分。AOP允许开发者定义“切面”,它是一种将关注点分离的方式,使得我们可以把...

    spring AOP实例代码(带详细的讲解)

    在Spring中,切面可以是一个Java类,其中包含了通知(advice)和切入点表达式(pointcut expression)。 2. **通知(Advice)**:通知定义了在特定连接点(join point)执行的代码,比如方法执行前、后或者异常抛出...

    Spring AOP依赖jar包

    在 Spring 框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,这些切面可以封装跨多个对象的行为或责任。Spring AOP 提供了在运行时实现切面的功能,无需修改现有代码。本篇文章将详细...

    springAop默认代理方式.zip

    切入点则是对连接点的精确定位,由切入点表达式(Pointcut Expression)定义,例如`execution(* com.example.service.*.*(..))`表示匹配com.example.service包下的所有方法。 8. **AOP应用场景**:Spring AOP广泛...

    spring aop管理xml版

    - `&lt;aop:pointcut&gt;`:定义切入点表达式,可以引用在通知中。 - `&lt;aop:advisor&gt;`:可以包含一个通知和一个切入点,是更细粒度的配置单元。 在实际应用中,我们会在`&lt;bean&gt;`元素中定义切面类,并在`&lt;aop:config&gt;`中...

Global site tag (gtag.js) - Google Analytics