`
234390216
  • 浏览: 10229809 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462459
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775244
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398176
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:394947
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:679877
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:530770
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1183578
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:467457
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151275
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68022
社区版块
存档分类
最新评论

Spring Aop(九)——基于正则表达式的Pointcut

阅读更多

基于正则表达式的Pointcut

JdkRegexpMethodPointcut

Spring官方为我们提供了一个基于正则表达式来匹配方法名的Pointcut,JdkRegexpMethodPointcut。该Pointcut是继承自StaticMethodMatcherPointcut的。我们在定义JdkRegexpMethodPointcut时可以通过patternsexcludedPatterns来注入需要满足和排除的正则表达式,它们对应的都是一个String[]。比如我们想匹配所有的方法名以find开头的方法,我们可以如下定义:

	<bean id="regexPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
		<property name="patterns">
	        <list>
	            <value>find.*</value><!-- 所有方法名以find开始的方法 -->
	        </list>
	    </property>
	</bean>

如果我们需要匹配或需要排除的正则表达式只是单一的一个正则表达式,那么我们也可以通过patternexcludedPattern来指定单一的需要匹配和排除的正则表达式。需要注意的是patternspattern不能同时使用,excludedPatternexcludedPatterns也是一样的。当我们同时指定了patternsexcludedPatterns时,该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日)

0
0
分享到:
评论

相关推荐

    五、Spring源码分析——Spring Aop

    切点通常使用正则表达式或者自定义注解来定义,比如`@Pointcut("execution(* com.example.service.*.*(..))")`,表示拦截com.example.service包下的所有方法。 3. **切面(Aspect)**: 切面是通知和切点的结合,...

    spring aop 详细介绍

    在Spring AOP中,Pointcut可以通过使用正则表达式或者自定义的注解来定义。 3. **Advisor(顾问)**: Advisor是Pointcut和Advice的组合,它将Pointcut表达式与Advice逻辑结合起来,使得在满足Pointcut条件的连接...

    jar包---Spring AOP 还需.rar

    3. **切入点表达式**:Spring AOP使用一种基于正则表达式的语言来定义切入点,用于匹配连接点。例如,`execution(* com.example.service.*.*(..))`匹配com.example.service包下的所有类的所有方法。 4. **Spring ...

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

    它可以是方法名、方法签名,甚至复杂的正则表达式。在Spring中,我们可以使用`@Pointcut`注解定义切入点,并在通知中引用它。 4. **织入(Weaving)**:织入是将切面应用到目标对象并创建代理的过程。Spring可以在...

    springboot+aspect实现springaop拦截指定方法.zip

    SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...

    spring AOP切面编程

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

    Spring AOP实现 项目源码 Myeclipse 直接导入可用

    通常使用正则表达式或注解来定义切点。 5. **引入(Introduction)**: 引入允许在已有类中添加新的方法或字段,无需修改原始代码。 6. **目标对象(Target Object)**: 被AOP代理的对象,即包含了切面逻辑的业务...

    SPRING AOP详细培训视频

    切点通常通过使用正则表达式或自定义注解来定义。 5. 代理(Proxy):Spring AOP通过动态代理机制创建一个对象的代理,代理对象负责在方法调用前后执行通知。有两种类型的代理:JDK动态代理和CGLIB代理。JDK动态...

    spring aop学习实例

    Spring AOP使用基于正则表达式的切入点语言。 4. **织入(Weaving)**:织入是将切面应用到目标对象,创建代理的过程。Spring AOP可以在运行时或编译时完成织入。 5. **代理(Proxy)**:Spring AOP通过代理来实现...

    spring AOP的代码实例

    Spring AOP使用基于正则表达式的语法来定义切入点。 **织入(Weaving)** 织入是将切面与应用程序的其他部分结合的过程。在Spring AOP中,织入可以在编译时、类加载时或运行时完成。 **代码实例** 以下是一个简单...

    用xml配置的方式进行SpringAOP开发

    这里的`loggingAdvisor`定义了一个基于正则表达式的切点,匹配所有以`com.example.*Service.*`开头的方法,并在这些方法调用前执行`LogAdvice`中的`beforeMethod`方法。 3. **启用AOP代理**:在Spring配置文件中,...

    spring aop例子

    它可以通过正则表达式或自定义注解来定义。 5. 织入(Weaving):织入是将切面与目标对象结合的过程,可以发生在编译时、类加载时或运行时。Spring AOP默认使用动态代理进行运行时织入。 在"spring aop例子"中,...

    基于Spring AOP的工具包

    2. 声明切入点:使用`@Pointcut`注解声明切入点表达式,这可以是一个简单的类或方法名,也可以是复杂的正则表达式或通配符。 3. 编写通知:使用`@Before`、`@After`、`@Around`、`@AfterReturning`和`@...

    spring-aop源码解读

    在Spring AOP中,Pointcut通常是通过正则表达式或其他匹配策略来确定的,例如JdkRegexpMethodPointcut允许根据方法名的正则表达式来匹配。Pointcut接口定义了getMethodMatcher()方法,该方法返回一个MethodMatcher...

    Spring AOP实例

    通过使用正则表达式或自定义注解,我们可以精确地定义切入点。 5. **引入(Introduction)**:引入允许我们在运行时向现有类添加新的方法或属性,这在不修改原始类源代码的情况下提供了扩展功能。 6. **代理...

    Spring IOC和Spring AOP_spring aop_springIOC

    Spring使用正则表达式或自定义注解来指定切入点。 4. **织入**:织入是将切面应用到目标对象,形成代理对象的过程。Spring支持编译时织入、加载时织入和运行时织入。 在实际开发中,Spring AOP常用于事务管理,...

    Spring aop 简单总结

    切点定义了在何处应用通知,通常使用正则表达式或者注解来表示。通知定义了在特定切点发生时执行的代码,有前置通知、后置通知、异常通知、最终通知和环绕通知五种类型。织入是将切面应用到目标对象的过程,可以发生...

    Spring实现AOP的四种方式

    3. **切入点(Pointcut)**:切入点定义了通知执行的具体位置,可以是类或方法的名称,甚至可以用正则表达式指定。 4. **切面(Aspect)**:切面由通知和切入点组成,是关注点的模块化。 5. **引入(Introduction)**:...

    Spring——aop

    - **切点(Pointcut)**:定义了在何处应用通知,通常是一个或多个匹配方法签名的正则表达式。 - **连接点(Join Point)**:程序执行中的一个点,如方法的调用或异常的抛出。 - **引入(Introduction)**:允许在已...

    Spring AOP 项目

    它可以是一个简单的名称,也可以是一个复杂的正则表达式。 5. **引入(Introduction)**:引入允许我们向现有类添加新的方法或属性,而不修改原有类的源代码。 6. **代理(Proxy)**:Spring AOP通过创建代理对象...

Global site tag (gtag.js) - Google Analytics