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)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...
在Spring AOP中,Pointcut表达式通常使用AspectJ的表达式语法。这些表达式允许开发者指定何时执行AOP的增强功能。以下是一些基本的Pointcut表达式语法: - **execution()**:用于匹配方法执行。 - `execution(* ...
Spring AOP中使用args表达式的方法示例 Spring AOP(Aspect-Oriented Programming)是一种面向切面编程的技术, args表达式是AOP中的一种表达式,它可以用来指定目标方法的参数类型和数量。下面我们将详细介绍...
现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...
4. **丰富的切入点表达式语言**:Spring AOP支持使用SpEL(Spring Expression Language)来定义复杂的切入点表达式,这让开发者能够更加灵活地控制通知的触发条件。 #### 四、Spring AOP的实现示例 接下来,我们...
在Spring AOP中,切面由两个主要部分组成:通知(advice)和切点(pointcut)。 2. **通知(Advice)**:通知是在特定的连接点(join point)执行的代码,它可以是前置通知(before advice)、后置通知(after ...
1. **确认是否正确配置了AOP切面**:检查AOP配置文件或类中的所有配置项是否设置正确,包括切入点表达式(Pointcut)、通知类型(Advice)等。 2. **检查Service类是否被Spring管理**:确保受影响的Service类已经...
尤其是`org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator`和`org.springframework.aop.aspectj.AspectJExpressionPointcut`这两个类,它们分别处理了基于注解的切面创建和切入点...
1. **XML配置**:在Spring的配置文件中,可以通过<aop:config>标签来定义切面,<aop:pointcut>定义切点,<aop:advisor>或<aop:aspect>定义通知。例如: ```xml <aop:config> <aop:pointcut id="myPointcut" ...
在Spring AOP中,切面是包含多个通知(advisors)的类。使用`@Aspect`注解标记切面类,例如: ```java @Aspect public class LoggingAspect { // ... } ``` #### 2. 定义通知(Advice) 通知是在特定连接点...
在SLT-Spring-AOP这个项目中,你可以找到具体的实现示例,包括如何定义切面、通知和切入点表达式,以及如何在业务代码中应用这些概念。通过对该项目的深入学习,你将能够更好地理解和掌握Spring AOP的实战应用。
2. 切点表达式(Pointcut Expression):使用正则表达式或者预定义的切入点表达式(如execution()、within()、args()等)来定义切点。 四、通知类型 1. 前置通知(Before):在目标方法执行前执行,如`@Before`。 2...
Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。
为了解决这一问题,可以利用Spring框架中的AOP(Aspect Oriented Programming,面向切面编程)技术来实现。 #### 二、Spring AOP 概述 Spring AOP 是Spring框架提供的一种实现AOP的方法。通过AOP,开发者可以在不...
在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱,而Spring AOP(面向切面编程)则是Spring框架中的一个重要组成部分。AOP允许开发者定义“切面”,它是一种将关注点分离的方式,使得我们可以把...
在Spring中,切面可以是一个Java类,其中包含了通知(advice)和切入点表达式(pointcut expression)。 2. **通知(Advice)**:通知定义了在特定连接点(join point)执行的代码,比如方法执行前、后或者异常抛出...
在 Spring 框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,这些切面可以封装跨多个对象的行为或责任。Spring AOP 提供了在运行时实现切面的功能,无需修改现有代码。本篇文章将详细...
切入点则是对连接点的精确定位,由切入点表达式(Pointcut Expression)定义,例如`execution(* com.example.service.*.*(..))`表示匹配com.example.service包下的所有方法。 8. **AOP应用场景**:Spring AOP广泛...
- `<aop:pointcut>`:定义切入点表达式,可以引用在通知中。 - `<aop:advisor>`:可以包含一个通知和一个切入点,是更细粒度的配置单元。 在实际应用中,我们会在`<bean>`元素中定义切面类,并在`<aop:config>`中...