`
gaojian881
  • 浏览: 7192 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

pointcut的定义

阅读更多

 一:一个典型的aspect类的形式如下:

public aspect MyAspectj {
         //定义连接点函数
         pointcut callF(): execution(* f(..)) && cflow(call(* Test.foo(..)));
         //定义通知函数
         before() : callF() {
             System.out.println("before call f();");
         }
} 
 

 

二:切点pointcut的定义:

1):方法的访问

   1: execution():表示方法执行是进行匹配,如下所示:

          execution(void Test.setX(int,**))

   2: call():表示在方法被调用时候进行匹配,如下所示:

          call(void Test.setX(int,**))

2):字段的访问:

    1: set():表示目标对象的修改,如下所示:

               before(int newval): set(int Test.x) && args(newval) {
                     if(newval > Test.MAX_CHANGE) {
                            throw new RuntimeException("error");
                       }
                 }

                 public static final int MAX_CHANGE = 100;
                 int x = 100;
   
                 public static void main(String[] args) {
                 Test t = new Test();
                 t.x = 10000;
                 System.out.println(t.x);
               }

     2:get():表示目标对象的获取,如下所示:

               before(): get(int Test.x)

 

3):对象的状态:

      1:this(SomeType):表示当前在执行的对象是SomeType类型进行匹配。

      2:target(SomeType):表示目标对象是SomeType类型时进行匹配。

      3:args(SomeType):表示目标函数的函数参数是SomeType类型时进行匹配。

4):连接点执行流程

      1:cflow(pointcut):表示在执行连接点pointcut所匹配的函数时进行匹配,如下所示:

         cflow(call(void Test.main()))

       其中的call(void Test.main())就是一个连接点;

       2:cflowbelow(pointcut):表示执行连接点pointcut之外所匹配的函数是进行匹配,如下所示。

          cflow(call(void Test.main()))

5):属于关系

       1:within(MyClass)表示当前正在执行的代码属于MyClass类时进行匹配(连接点匹配的时候只匹配Myclass类中的连接点),如下所示:

          within(point)

        2:withincode(method):表示在属于method函数时进行匹配,例如夏例表示的时匹配函数foo()的调用。

          withincode(public void foo())

三:匹配表达式的通配符

使用星号"*"可以匹配切点中函数表达式中的任何一个元素,包括函数的修饰符,返回值的类型,类名,方法名,参数名。

1)星号(*)

    1:下例将匹配任何函数,而不管函数返回什么的类型。

    execution(* *(..))

    2:下例用来匹配任何名为set的方法,而不管函数返回的类型。

    call(* set(..))

    3:下例用于匹配返回值为int型的任何函数。

    execution(int *(..))

    4:下例用来匹配函数名为setY,参数类型为long的函数。

    call(* setY(long))

    5:下例用于匹配类Point的函数setY,且函数的参数类型为int。

    call(* Point.setY(int))

    6:下例用来匹配任意的构造函数,且该构造函数含有两个int类型的参数。

    call(*.new(int,int))

    7:下例用来匹配任何public类型的函数。

    call(public * *(..))

    8 : 下例用来匹配任何非静态的函数。

    execution(!static * *(..))

    9:下例用来匹配任何public类型的,非静态的函数

    execution(public !static * *(..))

2):加号(+)

    1:匹配Foo的构造函数

    call(Foo.new())

    2:下例表示Foo及其所有子类的构造函数。

    call(Foo+.new())

    3:下例以Handler结尾的类名及其所有子类的构造函数。

    call(*Handler+.new())

四:匹配表达式的组合

     !:逻辑非;

      || or OR:逻辑或;

      && or And:逻辑与;

      ():用于分钟。

 

一些切点的实例:

//实例一:
pointcut setBefore(Object point, Integer id) : target(point)
&& execution(public void com.gaojian.aspectj.java1.*.setAll(Integer,..))
&& args(id,..);

before(Object point, Integer id) : setBefore(point, id){
System.out.println("多个参数的方法中args的使用");
}
//实例二:
pointcut setBefore(Object point, Integer key) : target(point)
&& ( execution(public void com.gaojian.aspectj.java1.*.setId(Integer))
|| execution(public void com.gaojian.aspectj.java1.*.setAge(Integer))
|| execution(public void com.gaojian.aspectj.java1.*.setAll(Integer,..))
)
&& args(key,..);

before(Object point, Integer key) : setBefore(point, key){
System.out.println("设值的参数为:"+key);
}
//实例三:
pointcut setIdBefore():execution(* setId(..)) && (within(com.gaojian.aspectj.java1.PointcutClass1) || within(com.gaojian.aspectj.java1.PointcutClass2));

before() : setIdBefore(){
System.out.println("切入点中within的使用");
}
分享到:
评论

相关推荐

    Spring AOP中文教程

    2. Pointcut:Pointcut定义了Advice应该在何时何地执行。它是一个匹配条件,通常基于方法签名、注解、类名等来定位。在上面的例子中,pointcut可能表示为`BeanImpl`类中的所有public方法,或者更具体地,是`the...

    AOP简介文件.docx

    Pointcut定义了相应的Advice将要发生的地方。 4. Advice(增强):Advice定义了在Pointcut里面定义的程序点具体要做的操作,它通过before、after、around来区别是在每个Join Point之前、之后还是代替执行的代码。 ...

    基于Spring Boot框架的综合应用系统.zip

    基于Spring Boot框架的综合应用系统 项目简介 本项目是一个基于Spring Boot框架的综合应用系统,涵盖了从基础的Maven项目创建、数据校验、日志管理到高级的权限管理、消息队列、定时任务... 使用Pointcut定义切点。

    Spring AOP实现

    Pointcut定义了哪些方法或在何时应用Advice。它可以是基于方法签名、类名或者其他的匹配规则。在例子中,pointcut没有显式地定义,而是通过配置文件隐含地指定,即所有实现了`Bean`接口的方法。 3. Advisor(顾问...

    AspectJ 5 quick reference

    Pointcut 定义了何处执行通知(advice)。它们可以定义在类型内: ```java private pointcut pc(): call(void Foo.m()); ``` 这是一个仅在定义类型内部可见的点切入口。也可以定义包可见的点切入口: ```java ...

    spring aop

    2. 定义切入点:使用@Pointcut定义切入点表达式,可以是方法签名、注解等。 3. 应用通知:在通知方法上使用@Before、@After等注解,并引用切入点表达式。 4. 配置AOP:在Spring配置文件或使用@Configuration注解的类...

    springAOP配置动态代理实现

    2. **注解配置**:Spring 2.5引入了基于注解的AOP配置,可以在切面类上使用@Aspect注解,@Before、@After、@AfterReturning、@AfterThrowing和@Around定义通知,@Pointcut定义切点。例如: ```java @Aspect ...

    Spring框架入门教程(新版)内含源码以及说明书可以自己运行复现.zip

    在AOP中,Pointcut定义了拦截哪些方法,而Advisor则包含了一个通知和一个切入点表达式。`5.AOP - Pointcut & Advisor.md`可能会详细解释这两者的使用方式和作用。 **6. AOP - 自动创建Proxy** Spring支持两种代理...

    springboot的aop使用

    通过@Pointcut定义切入点,配合@annotation注解用于匹配标注了特定注解的方法,@Around注解可以实现环绕通知,即在目标方法执行前后进行逻辑处理。 整个AOP使用过程实际上是开发者定义好的通知逻辑与业务逻辑的无缝...

    spring aop操作的基本jar包

    此外,还可以使用@Aspect注解来声明一个切面,使用@Pointcut定义切点,@Before、@After、@Around、@AfterReturning和@AfterThrowing来定义各种类型的通知。 总之,Spring AOP操作的核心在于理解并正确使用上述jar包...

    Spring基础:Spring AOP简单使用

    - **注解配置**:Spring 2.5引入了基于注解的AOP,可以直接在切面类上使用@Aspect,@Before、@After、@Around等注解定义通知,@Pointcut定义切点。 4. **切点表达式** - 切点表达式是用于匹配连接点的语句,如`...

    Spring 2.5.6介绍(九)——spring中没介绍的东西

    切面可以是方法拦截器,通过@Aspect注解定义,并使用@Pointcut定义切入点表达式,来指定何时应用这些拦截器。 2. **切入点**:切入点是AOP的核心概念,定义了切面应何时执行。它可以是一个方法签名,一个包名,甚至...

    Spring AOP编程

    2. **Pointcut**:Pointcut定义了Advice插入的位置,通常是特定类或方法。它可以基于方法签名、注解或其他条件来指定。 3. **Advisor**:Advisor是将Pointcut和Advice组合在一起的组件,它决定了何时、何地以及如何...

    2024-spring-aop学习项目

    4. 注解驱动的AOP:利用Spring的@Aspect注解创建切面,@Pointcut定义切入点,@Before、@After等定义通知。 五、应用场景 1. 日志记录:在方法调用前后记录日志,无需在每个方法中重复代码。 2. 事务管理:在全局...

    spring-aop.rar

    1. 注解驱动(Annotation-based):使用@Aspect注解定义切面,@Before、@After、@Around等注解定义通知,@Pointcut定义切点。 2. 配置驱动(XML-based):在spring配置文件中定义切面、通知和切点。 三、Spring ...

    SpringBoot 整合 AOP完整源码

    在Spring中,我们可以通过定义切面(Aspect)、切点(Pointcut)、通知(Advice)以及织入(Weaving)等方式来实现AOP。 集成AOP的第一步是确保项目已经正确配置了Spring Boot和Maven。在`pom.xml`文件中,我们需要...

    Spring demo

    最后,使用@Aspect注解创建切面,并通过@Pointcut定义切点,结合通知,就能实现面向切面的编程。 这个"SpringDemo_lj"项目中,很可能会包含以下文件: 1. **配置文件**(如:applicationContext.xml):定义Bean...

    spring 要点总结

    - Spring 提供了 `org.springframework.aop.Pointcut` 接口来定义切入点,可以基于类名和方法名来匹配执行点,可以是静态的也可以是动态的,动态匹配会考虑方法参数。 5. **ProxyFactoryBean**: - 用于创建代理...

Global site tag (gtag.js) - Google Analytics