基于正则表达式的Pointcut
JdkRegexpMethodPointcut
Spring官方为我们提供了一个基于正则表达式来匹配方法名的Pointcut,JdkRegexpMethodPointcut
。该Pointcut是继承自StaticMethodMatcherPointcut
的。我们在定义JdkRegexpMethodPointcut
时可以通过patterns
和excludedPatterns
来注入需要满足和排除的正则表达式,它们对应的都是一个String[]
。比如我们想匹配所有的方法名以find
开头的方法,我们可以如下定义:
<bean id="regexPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="patterns">
<list>
<value>find.*</value><!-- 所有方法名以find开始的方法 -->
</list>
</property>
</bean>
如果我们需要匹配或需要排除的正则表达式只是单一的一个正则表达式,那么我们也可以通过pattern
和excludedPattern
来指定单一的需要匹配和排除的正则表达式。需要注意的是patterns
和pattern
不能同时使用,excludedPattern
和excludedPatterns
也是一样的。当我们同时指定了patterns
和excludedPatterns
时,该Pointcut
将先匹配patterns
,对于能够匹配patterns
的将再判断其是否在excludedPatterns
中,如果存在也将不匹配。以下是该匹配逻辑的核心代码。
protected boolean matchesPattern(String signatureString) {
for (int i = 0; i < this.patterns.length; i++) {
boolean matched = matches(signatureString, i);
if (matched) {
for (int j = 0; j < this.excludedPatterns.length; j++) {
boolean excluded = matchesExclusion(signatureString, j);
if (excluded) {
return false;
}
}
return true;
}
}
return false;
}
需要说明的是在上面的匹配逻辑中传递的参数signatureString是对应方法的全路径名称,即包含该方法的类的全路径及该方法的名称,如“org.springframework.aop.support.JdkRegexpMethodPointcut.matches”这种,所以如果我们需要在使用正则表达式定义Pointcut时,也可以匹配某某类的某某方法这种形式。
RegexpMethodPointcutAdvisor
使用了JdkRegexpMethodPointcut
后,我们在使用的时候通常会进行如下配置。
<aop:config>
<aop:advisor advice-ref="logBeforeAdvice" pointcut-ref="regexPointcut"/>
</aop:config>
<bean id="logBeforeAdvice" class="com.elim.learn.spring.aop.advice.LogBeforeAdvice" />
<bean id="regexPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="patterns">
<list>
<value>find.*</value><!-- 所有方法名以find开始的方法 -->
</list>
</property>
</bean>
其实针对于JdkRegexpMethodPointcut
,Spring为我们提供了一个简便的Advisor
定义,可以让我们同时指定一个JdkRegexpMethodPointcut
和其需要对应的Advice
,那就是RegexpMethodPointcutAdvisor
,我们可以给它注入一个Advice和对应需要匹配的正则表达式(pattern或patterns注入)。
<bean class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="logBeforeAdvice"/>
<property name="pattern" value="find.*"/>
</bean>
需要注意的是
RegexpMethodPointcutAdvisor
没有提供不匹配的正则表达式注入方法,即没有excludedPattern和excludedPatterns注入,如果需要该功能请还是使用JdkRegexpMethodPointcut
。
(本文是基于Spring4.1.0所写,Elim写于2017年5月8日)
相关推荐
切点通常使用正则表达式或者自定义注解来定义,比如`@Pointcut("execution(* com.example.service.*.*(..))")`,表示拦截com.example.service包下的所有方法。 3. **切面(Aspect)**: 切面是通知和切点的结合,...
在Spring AOP中,Pointcut可以通过使用正则表达式或者自定义的注解来定义。 3. **Advisor(顾问)**: Advisor是Pointcut和Advice的组合,它将Pointcut表达式与Advice逻辑结合起来,使得在满足Pointcut条件的连接...
3. **切入点表达式**:Spring AOP使用一种基于正则表达式的语言来定义切入点,用于匹配连接点。例如,`execution(* com.example.service.*.*(..))`匹配com.example.service包下的所有类的所有方法。 4. **Spring ...
它可以是方法名、方法签名,甚至复杂的正则表达式。在Spring中,我们可以使用`@Pointcut`注解定义切入点,并在通知中引用它。 4. **织入(Weaving)**:织入是将切面应用到目标对象并创建代理的过程。Spring可以在...
SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...
2. 切点表达式(Pointcut Expression):使用正则表达式或者预定义的切入点表达式(如execution()、within()、args()等)来定义切点。 四、通知类型 1. 前置通知(Before):在目标方法执行前执行,如`@Before`。 2...
通常使用正则表达式或注解来定义切点。 5. **引入(Introduction)**: 引入允许在已有类中添加新的方法或字段,无需修改原始代码。 6. **目标对象(Target Object)**: 被AOP代理的对象,即包含了切面逻辑的业务...
切点通常通过使用正则表达式或自定义注解来定义。 5. 代理(Proxy):Spring AOP通过动态代理机制创建一个对象的代理,代理对象负责在方法调用前后执行通知。有两种类型的代理:JDK动态代理和CGLIB代理。JDK动态...
Spring AOP使用基于正则表达式的切入点语言。 4. **织入(Weaving)**:织入是将切面应用到目标对象,创建代理的过程。Spring AOP可以在运行时或编译时完成织入。 5. **代理(Proxy)**:Spring AOP通过代理来实现...
Spring AOP使用基于正则表达式的语法来定义切入点。 **织入(Weaving)** 织入是将切面与应用程序的其他部分结合的过程。在Spring AOP中,织入可以在编译时、类加载时或运行时完成。 **代码实例** 以下是一个简单...
这里的`loggingAdvisor`定义了一个基于正则表达式的切点,匹配所有以`com.example.*Service.*`开头的方法,并在这些方法调用前执行`LogAdvice`中的`beforeMethod`方法。 3. **启用AOP代理**:在Spring配置文件中,...
它可以通过正则表达式或自定义注解来定义。 5. 织入(Weaving):织入是将切面与目标对象结合的过程,可以发生在编译时、类加载时或运行时。Spring AOP默认使用动态代理进行运行时织入。 在"spring aop例子"中,...
2. 声明切入点:使用`@Pointcut`注解声明切入点表达式,这可以是一个简单的类或方法名,也可以是复杂的正则表达式或通配符。 3. 编写通知:使用`@Before`、`@After`、`@Around`、`@AfterReturning`和`@...
在Spring AOP中,Pointcut通常是通过正则表达式或其他匹配策略来确定的,例如JdkRegexpMethodPointcut允许根据方法名的正则表达式来匹配。Pointcut接口定义了getMethodMatcher()方法,该方法返回一个MethodMatcher...
通过使用正则表达式或自定义注解,我们可以精确地定义切入点。 5. **引入(Introduction)**:引入允许我们在运行时向现有类添加新的方法或属性,这在不修改原始类源代码的情况下提供了扩展功能。 6. **代理...
Spring使用正则表达式或自定义注解来指定切入点。 4. **织入**:织入是将切面应用到目标对象,形成代理对象的过程。Spring支持编译时织入、加载时织入和运行时织入。 在实际开发中,Spring AOP常用于事务管理,...
切点定义了在何处应用通知,通常使用正则表达式或者注解来表示。通知定义了在特定切点发生时执行的代码,有前置通知、后置通知、异常通知、最终通知和环绕通知五种类型。织入是将切面应用到目标对象的过程,可以发生...
3. **切入点(Pointcut)**:切入点定义了通知执行的具体位置,可以是类或方法的名称,甚至可以用正则表达式指定。 4. **切面(Aspect)**:切面由通知和切入点组成,是关注点的模块化。 5. **引入(Introduction)**:...
- **切点(Pointcut)**:定义了在何处应用通知,通常是一个或多个匹配方法签名的正则表达式。 - **连接点(Join Point)**:程序执行中的一个点,如方法的调用或异常的抛出。 - **引入(Introduction)**:允许在已...
它可以是一个简单的名称,也可以是一个复杂的正则表达式。 5. **引入(Introduction)**:引入允许我们向现有类添加新的方法或属性,而不修改原有类的源代码。 6. **代理(Proxy)**:Spring AOP通过创建代理对象...