转自:http://www.iteye.com/topic/141350
在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature)。让我们先看看execution表示式的格式:
java 代码
execution(modifier-pattern?
ret-type-pattern
declaring-type-pattern?
name-pattern(param-pattern)
throws-pattern?)
括号中各个pattern分别表示修饰符匹配(modifier-pattern?)、返回值匹配(ret-type-pattern)、类路径匹配(declaring-type-pattern?)、方法名匹配(name-pattern)、参数匹配((param-pattern))、异常类型匹配(throws-pattern?),其中后面跟着“?”的是可选项。
在各个pattern中可以使用“*”来表示匹配所有。在(param-pattern)中,可以指定具体的参数类型,多个参数间用“,”隔开,各个也可以用“*”来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(*,String)表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(..)表示零个或多个任意参数。
现在来看看几个例子:
1)execution(* *(..))
表示匹配所有方法
2)execution(public * com. savage.service.UserService.*(..))
表示匹配com.savage.server.UserService中所有的公有方法
3)execution(* com.savage.server..*.*(..))
表示匹配com.savage.server包及其子包下的所有方法
除了execution表示式外,还有within、this、target、args等Pointcut表示式。一个Pointcut定义由Pointcut表示式和Pointcut签名组成,例如:
java 代码
//Pointcut表示式
@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
//Point签名
private void log(){}
然后要使用所定义的Pointcut时,可以指定Pointcut签名,如
java 代码
@Before("og()")
上面的定义等同与:
java 代码
@Before("execution(* com.savage.aop.MessageSender.*(..))")
Pointcut定义时,还可以使用&&、||、!运算,如:
java 代码
@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
private void logSender(){}
@Pointcut("execution(* com.savage.aop.MessageReceiver.*(..))")
private void logReceiver(){}
@Pointcut("logSender() || logReceiver()")
private void logMessage(){}
这个例子中,logMessage()将匹配任何MessageSender和MessageReceiver中的任何方法。
还可以将一些公用的Pointcut放到一个类中,以供整个应用程序使用,如:
java 代码
package com.savage.aop;
import org.aspectj.lang.annotation.*;
public class Pointcuts {
@Pointcut("execution(* *Message(..))")
public void logMessage(){}
@Pointcut("execution(* *Attachment(..))")
public void logAttachment(){}
@Pointcut("execution(* *Service.*(..))")
public void auth(){}
}
在使用这些Pointcut时,指定完整的类名加上Pointcut签名就可以了,如:
java 代码
package com.savage.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
@Aspect
public class LogBeforeAdvice {
@Before("com.sagage.aop.Pointcuts.logMessage()")
public void before(JoinPoint joinPoint) {
System.out.println("Logging before " + joinPoint.getSignature().getName());
}
}
当基于XML Sechma实现Advice时,如果Pointcut需要被重用,可以使用<aop:pointcut></aop:pointcut>来声明Pointcut,然后在需要使用这个Pointcut的地方,用pointcut-ref引用就行了,如:
xml 代码
<aop:config>
<aop:pointcut id="log"
expression="execution(* com.savage.simplespring.bean.MessageSender.*(..))"/>
<aop:aspect id="logging" ref="logBeforeAdvice">
<aop:before pointcut-ref="log" method="before"/>
<aop:after-returning pointcut-ref="log" method="afterReturning"/>
</aop:aspect>
</aop:config>
分享到:
相关推荐
在Spring框架中,切入点(pointcut)表达式是AOP(面向切面编程)的核心组成部分,用于定义关注点的精确位置,比如哪些方法应该被拦截。切入点表达式是基于AspectJ语法的,允许开发者精确地指定要拦截的方法。下面将详细...
Spring aop 配置 Spring aspect 配置 Spring advisor 配置 Spring pointcut 配置
本篇文章将详细讲解Spring AOP的实例,包括Pointcut和Advisor两个关键概念,同时结合源码和工具进行深入探讨。 首先,让我们了解什么是Spring AOP。AOP(Aspect-Oriented Programming)是一种编程范式,它允许...
在微服务流行的当下,在使用SpringCloud/Springboot框架开发中,AOP使用的非常广泛,尤其是@Aspect注解方式当属最流行的,不止功能强大,性能也很优秀,还很舒心!所以本系列就结合案例详细介绍@Aspect方式的切面的...
JavaEE源代码 Spring_PointcutJavaEE源代码 Spring_PointcutJavaEE源代码 Spring_PointcutJavaEE源代码 Spring_PointcutJavaEE源代码 Spring_PointcutJavaEE源代码 Spring_PointcutJavaEE源代码 Spring_...
上文我们已讲完五种通知Advice注解,所以从本文开始介绍@Pointcut切点表达式,虽然Spring AOP的切点表达式尚未 全部实现 @AspectJ 的切点指示符,但是也已经足够多和灵活,本文主要介绍@Pointcut切点表达式中的@...
### 如何使用Spring Boot的@Pointcut注解 #### 第一部分:@Pointcut注解简介 在Spring Boot中,@Pointcut注解是AspectJ框架的一部分,用于定义切点(Pointcut)。切点是在应用程序中定义的一组特定方法,当这些方法...
在这篇文章中,我们将深入探讨Spring中的切入点(Pointcut)概念,它是AOP的关键组成部分。 首先,我们要明白什么是AOP。AOP是一种编程范式,它允许程序员定义“方面”——关注点的模块化,这些关注点是跨越多个...
spring-framework-3.1.1.RELEASE jdk1.7 环境下 can't find referenced pointcut 问题解决 换了对应的jar文件即可 aspectjrt.jar aspectj-1.6.6.jar aspectjweaver.jar
在Spring AOP框架中,Pointcut(切入点)是AOP的核心概念之一,它定义了哪些Joinpoint(连接点)会被通知(Advice)所影响。在实际开发过程中,我们常常需要对切入点进行更精细的控制,例如只对某些方法或类应用增强...
6. **AOP模块**:提供了基于代理的AOP实现,可以定义切点(Pointcut)、通知(Advice)、切面(Aspect)等,实现对代码的无侵入式增强。 7. **数据访问/集成**:Spring支持JDBC、ORM(如Hibernate、MyBatis)和OXM...
在源码中,`Advisor`、`Pointcut`和`Advice`等接口是描述切面的关键,而`ProxyFactoryBean`或`AspectJAutoProxyCreator`则是创建代理对象的工具。 Spring还提供了大量的模块,如数据访问/集成(DAO)、Web MVC、JMS...
Pointcut定义切入点,Advice定义增强处理,Advisor结合两者,Aspect则封装了多个Advisor。 6. **Spring 声明式事务处理**:基于AOP,Spring实现了声明式事务管理。在配置文件中,可以使用@Transactional注解指定...
<aop:pointcut expression="execution(* com.spring.service..*(..))" id="pointCut"/>声明一个切入点,注意execution表达式的写法 <aop:before method="before" pointcut-ref="pointCut"/> aop前置通知 ...
它在Spring的许多特性中都有应用,例如AOP的pointcut表达式和bean属性的动态设置。 通过深入研究这些源码和注释,开发者不仅可以提升自己的Spring框架技能,还能对Java编程有更深入的理解,尤其是在设计模式和面向...
此外,`@Pointcut`定义了切点表达式,用于匹配方法或类。 Spring 4.3还增强了对Java 8的支持,比如对Lambda表达式的集成,使得与Spring框架的交互更加简洁。例如,你可以使用Lambda表达式来编写事件监听器或者在`@...
Spring AOP通过Pointcut表达式来指定这些点,Pointcut可以理解为匹配连接点的规则。 6. **切点(Pointcut)** 切点是实际匹配连接点的逻辑,定义了哪些方法会受到通知的影响。`@Pointcut`注解用于定义切点,通常...
在Spring AOP中,切面由通知(Advice)和切点(Pointcut)定义。 2. **通知(Advice)**:通知是在特定连接点(Join Point)执行的代码,例如方法调用前、后或者异常发生时。Spring AOP支持五种类型的通知:前置...
### Spring中的AOP不生效的原因及解决方法 在Java开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的编程思想和技术手段,主要用于处理横切关注点问题,如日志记录、性能统计、安全控制、...
`org.springframework.aop`和`org.springframework.aop.framework`包下的类,如`Advised`、`Advisor`、`Pointcut`和`ProxyFactoryBean`,构成了Spring AOP的基础。通过阅读源码,我们可以学习如何定义切面、切入点...