- 浏览: 1325051 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (896)
- spring4 (14)
- hibernate3 (26)
- spring2 (35)
- struts2 (55)
- struts1 (15)
- 设计模式 (15)
- java (172)
- mybatis3 (11)
- sql (17)
- mysql (13)
- jbpm (10)
- J2EE (45)
- tools (29)
- js (83)
- 数据结构 (13)
- Html (26)
- web (22)
- flex (33)
- Oracle (57)
- linux (49)
- 算法 (6)
- 其它 (12)
- easyui (1)
- bootstrap (13)
- xml (2)
- tomcat (1)
- redis (10)
- activemq (2)
- webservice (11)
- maven (2)
- springboot (1)
- ubuntu (1)
- python (14)
- rocketmq (1)
- springcloud (10)
- opencv (1)
最新评论
-
mike_eclipse:
Hashtable是线程不安全的吗?好像是线程安全的吧?
多线程之集合类 -
July01:
推荐用StratoIO打印控件,浏览器和系统的兼容性都很好,而 ...
lodop打印控件 -
xingcxb:
经过测试,假的,依旧会出现中文乱码!!!!store方法里面采 ...
java 读写Properties文件,不会出现中文乱码 -
tiger20111989:
...
Spring注解方式管理事务 -
zw7534313:
...
js 文字上下滚动 无间断循环显示
切点指示符
切点指示符是切点定义的关键字,切点表达式以切点指示符开始。
开发人员使切点指示符来告诉切点将要匹配什么,有以下9种切点指示符:
execution、within、this、target、args、@target、@args、@within、@annotation。
(1)execution
execution是一种使用频率比较高比较主要的一种切点指示符,用来匹配方法签名,方法签名使用全限定名,
包括访问修饰符(public/private/protected)、返回类型,包名、类名、方法名、参数,
其中返回类型,包名,类名,方法,参数是必须的,如:
@Pointcut("execution(public String org.baeldung.dao.FooDao.findById(Long))")
上面的代码片段里的表达式精确地匹配到FooDao类里的findById(Long)方法,但是这看起来不是很灵活。
假设我们要匹配FooDao类的所有方法,这些方法可能会有不同的方法名,不同的返回值,不同的参数列表,
为了达到这种效果,我们可以使用通配符。如:
@Pointcut("execution(* org.baeldung.dao.FooDao.*(..))")
第一个通配符匹配所有返回值类型,第二个匹配这个类里的所有方法,()括号表示参数列表,
括号里的用两个点号表示匹配任意个参数,包括0个
(2)within
使用within切点批示符可以达到上面例子一样的效果,within用来限定连接点属于某个确定类型的类。如下面代码的效果与上面的例子是一样的:
@Pointcut("within(org.baeldung.dao.FooDao)")
我们也可以使用within指示符来匹配某个包下面所有类的方法(包括子包下面的所有类方法),如下代码所示:
@Pointcut("within(org.baeldung..*)")
(3)this 和 target
this用来匹配的连接点所属的对象引用是某个特定类型的实例,target用来匹配的连接点所属目标对象
必须是指定类型的实例;那么这两个有什么区别呢?原来AspectJ在实现代理时有两种方式:
1、如果当前对象引用的类型没有实现自接口时,spring aop使用生成一个基于CGLIB的代理类实现切面编程
2、如果当前对象引用实现了某个接口时,Spring aop使用JDK的动态代理机制来实现切面编程
this指示符就是用来匹配基于CGLIB的代理类,通俗的来讲就是,如果当前要代理的类对象没有实现某个接口的话,
则使用this;target指示符用于基于JDK动态代理的代理类,通俗的来讲就是如果当前要代理的目标对象有
实现了某个接口的话,则使用target.:
public class FooDao implements BarDao {
}
比如在上面这段代码示例中,spring aop将使用jdk的动态代理来实现切面编程,在编写匹配这类型的目标对象的连接点
表达式时要使用target指示符, 如下所示:
@Pointcut("target(org.baeldung.dao.BarDao)")
如果FooDao类没有实现任何接口,或者在spring aop配置属性:proxyTargetClass设为true时,Spring Aop会使用基于CGLIB的动态字节码技为目标对象生成一个子类将为代理类,这时应该使用this指示器:
@Pointcut("this(org.baeldung.dao.FooDao)")
参数
参数指示符是一对括号所括的内容,用来匹配指定方法参数:
@Pointcut("execution(* *..find*(Long))")
这个切点匹配所有以find开头的方法,并且只一个Long类的参数。如果我们想要匹配一个有任意个参数,
但是第一个参数必须是Long类的,我们这可使用下面这个切点表达式:
@Pointcut("execution(* *..find*(Long,..))")
(4)@Target
这个指示器匹配指定连接点,这个连接点所属的目标对象的类有一个指定的注解:
@Pointcut("@target(org.springframework.stereotype.Repository)")
(5)@args
这个指示符是用来匹配连接点的参数的,@args指出连接点在运行时传过来的参数的类必须要有指定的注解
,假设我们希望切入所有在运行时接受实@Entity注解的bean对象的方法:
@Pointcut("@args(org.baeldung.aop.annotations.Entity)")
public void methodsAcceptingEntities() {}
为了在切面里接收并使用这个被@Entity的对象,我们需要提供一个参数给切面通知:JointPoint:
@Before("methodsAcceptingEntities()")
public void logMethodAcceptionEntityAnnotatedBean(JoinPoint jp) {
logger.info("Accepting beans with @Entity annotation: " + jp.getArgs()[0]);
}
(6)@within
这个指示器,指定匹配必须包括某个注解的的类里的所有连接点:
@Pointcut("@within(org.springframework.stereotype.Repository)")
上面的切点跟以下这个切点是等效的:
@Pointcut("within(@org.springframework.stereotype.Repository *)")
(7)@annotation
这个指示器匹配那些有指定注解的连接点,比如,我们可以新建一个这样的注解@Loggable:
@Pointcut("@annotation(org.baeldung.aop.annotations.Loggable)")
public void loggableMethods() {}
我们可以使用@Loggable注解标记哪些方法执行需要输出日志:
@Before("loggableMethods()")
public void logMethod(JoinPoint jp) {
String methodName = jp.getSignature().getName();
logger.info("Executing method: " + methodName);
}
(8)切点表达式组合
可以使用&&、||、!、三种运算符来组合切点表达式,表示与或非的关系。
@Pointcut("@target(org.springframework.stereotype.Repository)")
public void repositoryMethods() {}
@Pointcut("execution(* *..create*(Long,..))")
public void firstLongParamMethods() {}
@Pointcut("repositoryMethods() && firstLongParamMethods()")
public void entityCreationMethods() {}
切点指示符是切点定义的关键字,切点表达式以切点指示符开始。
开发人员使切点指示符来告诉切点将要匹配什么,有以下9种切点指示符:
execution、within、this、target、args、@target、@args、@within、@annotation。
(1)execution
execution是一种使用频率比较高比较主要的一种切点指示符,用来匹配方法签名,方法签名使用全限定名,
包括访问修饰符(public/private/protected)、返回类型,包名、类名、方法名、参数,
其中返回类型,包名,类名,方法,参数是必须的,如:
@Pointcut("execution(public String org.baeldung.dao.FooDao.findById(Long))")
上面的代码片段里的表达式精确地匹配到FooDao类里的findById(Long)方法,但是这看起来不是很灵活。
假设我们要匹配FooDao类的所有方法,这些方法可能会有不同的方法名,不同的返回值,不同的参数列表,
为了达到这种效果,我们可以使用通配符。如:
@Pointcut("execution(* org.baeldung.dao.FooDao.*(..))")
第一个通配符匹配所有返回值类型,第二个匹配这个类里的所有方法,()括号表示参数列表,
括号里的用两个点号表示匹配任意个参数,包括0个
(2)within
使用within切点批示符可以达到上面例子一样的效果,within用来限定连接点属于某个确定类型的类。如下面代码的效果与上面的例子是一样的:
@Pointcut("within(org.baeldung.dao.FooDao)")
我们也可以使用within指示符来匹配某个包下面所有类的方法(包括子包下面的所有类方法),如下代码所示:
@Pointcut("within(org.baeldung..*)")
(3)this 和 target
this用来匹配的连接点所属的对象引用是某个特定类型的实例,target用来匹配的连接点所属目标对象
必须是指定类型的实例;那么这两个有什么区别呢?原来AspectJ在实现代理时有两种方式:
1、如果当前对象引用的类型没有实现自接口时,spring aop使用生成一个基于CGLIB的代理类实现切面编程
2、如果当前对象引用实现了某个接口时,Spring aop使用JDK的动态代理机制来实现切面编程
this指示符就是用来匹配基于CGLIB的代理类,通俗的来讲就是,如果当前要代理的类对象没有实现某个接口的话,
则使用this;target指示符用于基于JDK动态代理的代理类,通俗的来讲就是如果当前要代理的目标对象有
实现了某个接口的话,则使用target.:
public class FooDao implements BarDao {
}
比如在上面这段代码示例中,spring aop将使用jdk的动态代理来实现切面编程,在编写匹配这类型的目标对象的连接点
表达式时要使用target指示符, 如下所示:
@Pointcut("target(org.baeldung.dao.BarDao)")
如果FooDao类没有实现任何接口,或者在spring aop配置属性:proxyTargetClass设为true时,Spring Aop会使用基于CGLIB的动态字节码技为目标对象生成一个子类将为代理类,这时应该使用this指示器:
@Pointcut("this(org.baeldung.dao.FooDao)")
参数
参数指示符是一对括号所括的内容,用来匹配指定方法参数:
@Pointcut("execution(* *..find*(Long))")
这个切点匹配所有以find开头的方法,并且只一个Long类的参数。如果我们想要匹配一个有任意个参数,
但是第一个参数必须是Long类的,我们这可使用下面这个切点表达式:
@Pointcut("execution(* *..find*(Long,..))")
(4)@Target
这个指示器匹配指定连接点,这个连接点所属的目标对象的类有一个指定的注解:
@Pointcut("@target(org.springframework.stereotype.Repository)")
(5)@args
这个指示符是用来匹配连接点的参数的,@args指出连接点在运行时传过来的参数的类必须要有指定的注解
,假设我们希望切入所有在运行时接受实@Entity注解的bean对象的方法:
@Pointcut("@args(org.baeldung.aop.annotations.Entity)")
public void methodsAcceptingEntities() {}
为了在切面里接收并使用这个被@Entity的对象,我们需要提供一个参数给切面通知:JointPoint:
@Before("methodsAcceptingEntities()")
public void logMethodAcceptionEntityAnnotatedBean(JoinPoint jp) {
logger.info("Accepting beans with @Entity annotation: " + jp.getArgs()[0]);
}
(6)@within
这个指示器,指定匹配必须包括某个注解的的类里的所有连接点:
@Pointcut("@within(org.springframework.stereotype.Repository)")
上面的切点跟以下这个切点是等效的:
@Pointcut("within(@org.springframework.stereotype.Repository *)")
(7)@annotation
这个指示器匹配那些有指定注解的连接点,比如,我们可以新建一个这样的注解@Loggable:
@Pointcut("@annotation(org.baeldung.aop.annotations.Loggable)")
public void loggableMethods() {}
我们可以使用@Loggable注解标记哪些方法执行需要输出日志:
@Before("loggableMethods()")
public void logMethod(JoinPoint jp) {
String methodName = jp.getSignature().getName();
logger.info("Executing method: " + methodName);
}
(8)切点表达式组合
可以使用&&、||、!、三种运算符来组合切点表达式,表示与或非的关系。
@Pointcut("@target(org.springframework.stereotype.Repository)")
public void repositoryMethods() {}
@Pointcut("execution(* *..create*(Long,..))")
public void firstLongParamMethods() {}
@Pointcut("repositoryMethods() && firstLongParamMethods()")
public void entityCreationMethods() {}
发表评论
-
服务端推送multipart/x-mixed-replace
2023-12-07 15:26 415往网页分批推送数据:boundary=END,总头--> ... -
使用httpclient提交post请求
2020-08-22 08:35 481import org.apache.http.HttpEnt ... -
Groovy超强的Java动态计算能力
2020-06-25 09:03 695//Groovy超强的Java动态计算能力 groovy-2. ... -
bsh(BeanShell)动态执行java代码
2020-06-25 07:59 994import java.util.Date; /** * B ... -
延时任务处理订单超时方案
2020-05-23 16:05 1011JDK的延迟队列 方案是利用JDK自带的DelayQueue ... -
HttpsURLConnection
2020-04-29 10:51 861import java.net.URL; import jav ... -
Log4j的ConversionPattern参数的格式含义
2020-04-22 14:23 512Log4j的ConversionPattern参数的格式含义 ... -
thread 的join
2020-04-16 18:02 423java里面也有这个方法,Java Thread中, join ... -
GZIPOutputStream压缩文件
2020-04-16 17:52 794import java.io.BufferedReader; ... -
软引用SoftReference的使用
2020-04-16 15:48 586软引用SoftReference的使用 SoftRefere ... -
Fastjson
2020-04-15 14:53 407import java.util.ArrayList; imp ... -
6位随机数
2020-04-14 09:47 812import org.apache.commons.lang. ... -
Java加密和数字签名
2020-04-14 09:38 423Java加密和数字签名 消息摘要 这是一种与消息认证码结合使 ... -
DES加密、解密
2020-04-02 16:42 437import java.security.SecureRand ... -
Java利用 AES/ECB/PKCS5Padding 算法加解密
2020-04-02 11:19 1068对称加密、解密 import javax.crypto.Ci ... -
springboot中使用springmvc的拦截器-HandlerInterceptorAdapter
2018-12-13 16:04 1392springboot中使用springmvc的拦截器-Hand ... -
spring之AspectJ面向切面编程
2018-12-13 14:15 911spring之AspectJ面向切面编程 面向切面编程,实现 ... -
设计模式之策略模式
2018-05-30 21:17 562public class Person { priva ... -
使用反射将对象转Map
2018-05-27 17:33 732//使用反射将对象转Map<String, St ... -
设计模式之原型模式
2018-05-20 18:42 554/** * 原型设计模式:原型模式主要用于对象的复制 ...
相关推荐
Pointcut 是 AspectJ 中的核心概念之一,它定义了在程序执行过程中的特定“连接点”(Join Points),即何处应用切面。连接点可以是方法调用、字段访问、构造器执行等。以下是一些关于 Pointcut 的基本语法和操作符...
在AspectJ中,连接点可以是以下几种: - 方法调用(MethodCall) - 类边界(ClassBoundary) - 方法执行(MethodExecution) - 成员变量访问修改(AccessorModification) - 异常处理(ExceptionHandlers) - 静态和...
AspectJ通过引入切面(Aspect)、通知(Advice)、连接点(Join Point)、切点(Pointcut)等概念,提供了一种静态类型的AOP解决方案。切面是关注点的模块化,它封装了横切逻辑;通知定义了在特定连接点执行的行为;...
AspectJ的核心概念之一是连接点(Join point),它是指那些可以被声明为切面目标的特定点。在AspectJ中,可以声明的连接点包括方法调用、方法执行、构造器调用、构造器执行、字段获取、字段设置、初始化代码块、静态...
AspectJ通过切点(pointcut)来指定一组连接点,并在这些点上织入(weave)增强(advice),以实现跨切面的代码逻辑。 **二、AspectJ的主要概念** 1. **切面(Aspect)**:切面是封装了横切关注点的类。例如,日志...
2. **AspectJ语法**: AspectJ提供了强大的语法结构,包括`pointcut`(切点)、`advice`(通知)和`join point`(连接点)。切点定义了代码执行的特定位置,通知是在这些位置执行的代码,而连接点则是实际触发通知的...
- **动态连接点模型**:AspectJ支持动态确定哪些方法调用应该被拦截或增强。 - **切点**:定义了何时和何处应用某个通知。 - **通知**:定义了在切点触发时所执行的操作。 - **暴露切点环境**:允许访问连接点的相关...
此外,“语言语义”章节深入探讨了AspectJ的内部工作原理,如连接点、切点定义、上下文暴露、原始切点等概念,为希望深入了解AspectJ底层机制的读者提供了宝贵的资源。 总之,《AspectJ编程指南》是一本全面的书籍...
切入点是指在程序执行过程中特定的连接点,如方法调用或异常抛出。通知则是在切入点匹配时执行的代码块,它可以是前置通知、后置通知、环绕通知、异常通知等。 `aspectj-1.6.9.jar` 包含了以下核心组件: 1. **织...
4. **切入点(Pointcut)**:定义一组连接点的规则,用于确定哪些连接点会应用通知。 5. **引入(Introduction)**:允许在现有类型中添加新的方法或字段。 6. **织入(Weaving)**:将切面与主程序代码合并的过程,可以...
面向切面编程(AOP)的核心概念包括切面、通知、连接点、切入点和织入。在AspectJ中: 1. **切面(Aspects)**:是关注点的模块化,它封装了跨越多个对象和类的横切关注点。一个切面通常包含一个或多个通知和一个或...
切面包含通知(advice),如前置通知(before)、后置通知(after)、环绕通知(around)等,它们定义了在特定连接点(join point,如方法调用)执行的行为。 4. 定义切入点:切入点是切面生效的具体位置。可以使用...
1. **AspectJ基础**:介绍AspectJ的基本元素,包括切面、通知(advice)、连接点(join point)、切点(pointcut)和织入(weaving)。这些概念构成了AspectJ的基础,理解它们是使用AspectJ的前提。 2. **切面和...
- **点切点**:用于匹配连接点的表达式,确定哪些连接点应该被切面所拦截。 #### 结论 《AspectJ in Action》第二版是一本深度剖析AspectJ及其在Spring框架中应用的专业书籍。通过详尽的理论介绍和丰富的实践案例...
通过深入研究这些文件,开发者可以了解到AspectJ的实现细节,学习AOP的核心概念,如切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等,并且可以根据自己的需求对项目进行扩展或集成到自己...
在这本书中,作者深入浅出地阐述了AspectJ的基本概念和核心特性,包括切面、通知(advice)、连接点(join points)、切入点(pointcuts)以及引入(introductions)。他们通过丰富的实例和实际应用来展示如何利用...
AspectJ通过引入切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)等概念,使得开发者可以更好地组织代码。切面是封装横切关注点的模块,而通知则是在特定连接点执行的代码。连接点是程序...
2. **通知(Advice)**:通知是在特定连接点(join point)执行的代码块,它实现了切面的功能。AspectJ 支持五种不同类型的通知:前置通知(before),后置通知(after returning),异常后通知(after throwing),...
例如,可以使用`@Aspect`注解声明一个切面类,使用`@Before`、`@After`、`@Around`等注解来定义通知(advice),这些通知会在特定的连接点(join point)如方法调用、构造器执行等时机被触发。 2. `license.txt`:...
AspectJ 使用切入点表达式(Pointcut Expression)来确定哪些连接点应该应用通知。 5. **切入点表达式(Pointcut Expression)**:切入点表达式是用于定义通知应何时触发的条件语句。它可以基于方法名、包名、注解...