`

spring日记(六):@AspectJ高级主题

阅读更多

>> 命名切点

下面是一个命名切点定义类

package com.springzoo.aspectj.advanced;
 
import org.aspectj.lang.annotation.Pointcut;
 
public class TestNamePointcut {
    @Pointcut("within(com.springzoo.*)")
    private void inPackage(){}
 
    @Pointcut("execution(* greetTo(..)))")
    protected void greetTo(){}
 
    @Pointcut("inPackage() and greetTo()")
    public void inPkgGreetTo(){}
}

然后使用这个:

@Aspect
public class TestAspect {
    //-------------复合运算----------
//  @Before("!target(com.springzoo.NaiveWaiter) "+
//          "&& execution(* serveTo(..)))")
//  public void notServeInNaiveWaiter() {
//      System.out.println("--notServeInNaiveWaiter() executed!--");
//  }
//  @After("within(com.springzoo.*) "
//          + " && execution(* greetTo(..)))")
//  public void greeToFun() {
//      System.out.println("--greeToFun() executed!--");
//  }
//  
//  @AfterReturning("target(com.springzoo.Waiter) || "+
//                  " target(com.springzoo.Seller)")
//  public void waiterOrSeller(){
//      System.out.println("--waiterOrSeller() executed!--");
//  }
     
//  //------------引用命名切点----------//
//  @Before("TestNamePointcut.inPkgGreetTo()")
//  public void pkgGreetTo(){
//      System.out.println("--pkgGreetTo() executed!--");
//  }
//
//  @Before("!target(com.springzoo.NaiveWaiter) && "
//          +"TestNamePointcut.inPkgGreetTo()")
//  public void pkgGreetToNotNaiveWaiter(){
//      System.out.println("--pkgGreetToNotNaiveWaiter() executed!--");
//  }
//
    //------------访问连接点对象----------//
    @Around("execution(* greetTo(..)) && target(com.springzoo.NaiveWaiter)")
    public void joinPointAccess(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("------joinPointAccess-------");
        System.out.println("args[0]:"+pjp.getArgs()[0]);        
        System.out.println("signature:"+pjp.getTarget().getClass());
        pjp.proceed();
        System.out.println("-------joinPointAccess-------");
    }
//  
//  //------------绑定连接点参数----------//
//  @Before("target(com.springzoo.NaiveWaiter) && args(name,num,..)")
//  public void bindJoinPointParams(int num,String name){
//     System.out.println("----bindJoinPointParams()----");
//     System.out.println("name:"+name);
//     System.out.println("num:"+num);
//     System.out.println("----bindJoinPointParams()----");
//  }
 
  //------------绑定代理对象----------//
//  @Before("execution(* greetTo(..)) && this(waiter)")
//  @Before("this(waiter)")
//  public void bindProxyObj(Waiter waiter){
//     System.out.println("----bindProxyObj()----");
//     System.out.println(waiter.getClass().getName());
//     System.out.println("----bindProxyObj()----");
//  }
     
      //------------绑定类标注对象----------//
//  @Before("@within(m)")
//  public void bindTypeAnnoObject(Monitorable m){
//     System.out.println("----bindTypeAnnoObject()----");
//     System.out.println(m.getClass().getName());
//     System.out.println("----bindTypeAnnoObject()----");
//  }
    //------------绑定抛出的异常----------//
//  @AfterReturning(value="target(com.springzoo.SmartSeller)",returning="retVal")
//  public void bingReturnValue(int retVal){
//     System.out.println("----bingReturnValue()----");
//     System.out.println("returnValue:"+retVal);
//     System.out.println("----bingReturnValue()----");
//  }
     
//    //------------绑定抛出的异常----------//
//  @AfterThrowing(value="target(com.springzoo.SmartSeller)",throwing="iae")
//  public void bindException(IllegalArgumentException iae){
//     System.out.println("----bindException()----");
//     System.out.println("exception:"+iae.getMessage());
//     System.out.println("----bindException()----");
//  }   
}

>> 访问连接点信息

AspectJ使用org.aspcetj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强,使用org.aspectj.lang.ProceedingJoinPoint表示连接点对象。

有几个主要方法:

* java.lang.Object[] getArgs():获取连接点方法运行时的入参列表

* Signature getSignature():获取连接点的方法签名对象

* java.lang.Object getTarget():获取连接点所在的目标对象

* java.lang.Object getThis():获取代理对象本身

而ProceedingJoinPoint继承自JoinPoint,它新增两个用于执行连接点方法的方法:

* java.lang.Object proceed() throws Throwable:通过反射执行目标对象的连接点处的方法

* java.lang.Object proceed(java.lang.Object[] args) throws Throwable:通过反射执行连接点处方法,不过传入了新的参数。

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

分享到:
评论

相关推荐

    征服Spring AOP—— @AspectJ

    @AspectJ是AspectJ项目的一部分,但已被Spring框架集成,使得在Spring应用中使用AspectJ变得更加方便。使用@AspectJ,我们可以创建一个包含切面逻辑的类,并通过注解来声明切点(pointcuts)和通知(advisors)。...

    @AspectJ配置Spring AOP,demo

    **Spring AOP与@AspectJ配置详解** Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它提供了一种模块化和声明式的方式来处理应用程序中的横切关注点,如日志、事务管理等。在传统的面向对象编程中,...

    Spring AOP @AspectJ 入门实例

    本实例将带你深入理解并实践Spring AOP与@AspectJ的结合使用。 首先,了解AOP的基本概念。面向切面编程是一种编程范式,它允许程序员定义“切面”,即跨越多个对象的行为或责任。这些切面可以包含业务逻辑、日志、...

    spring AOP 实例(@AspectJ)

    一个基于@AspectJ的spring2.0 AOP应用实例,很小很简单,没有任何额外信息,最适合AOP入门学习。使用log4j打印信息。把项目直接import进myeclipse就可以使用啦......

    Spring @AspectJ 实现AOP 入门例子

    本篇文章将深入探讨如何利用Spring的@AspectJ注解来实现AOP,这是一个入门级别的例子,旨在帮助开发者理解并掌握这一关键特性。 首先,我们要明白什么是AOP。面向切面编程是一种编程范式,它允许程序员定义“切面”...

    Spring AOP 概念理解及@AspectJ支持

    **Spring AOP 概念理解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它允许我们通过...理解和熟练运用Spring AOP及其@AspectJ注解是每个Spring开发者必备的技能之一。

    Spring的AOP实例(XML+@AspectJ双版本解析+源码+类库)

    **Spring的AOP实例——XML与@AspectJ双版本解析** Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统的交叉关注点,如日志、事务管理等。AOP的核心概念包括切面...

    Spring4 In Action-4.2-@AspectJ-切面

    Spring4 In Action-4.2-@AspectJ-切面,Spring4 In Action-4.2-@AspectJ-切面。Spring4 In Action-4.2-@AspectJ-切面

    【Spring AOP】@Aspect结合案例详解(二): @Pointcut使用@within和within

    上文我们已讲完五种通知Advice注解,所以从本文开始介绍@Pointcut切点表达式,虽然Spring AOP的切点表达式尚未 全部实现 @AspectJ 的切点指示符,但是也已经足够多和灵活,本文主要介绍@Pointcut切点表达式中的@...

    Spring源码学习十二:@Transactional是如何工作的1

    如果配置了 mode=aspectj,则使用 AspectJ 代码织入模式进行后续处理。 在本篇中,我们分析使用代理模式的代码,进入 AopAutoProxyConfigurer.configureAutoProxyCreator 方法。上图代码中标出了重要的一行代码,...

    spring源码导入所需aspectj包

    在Spring框架中,AspectJ是一种强大的面向切面编程(AOP)工具,它允许开发者定义“切面”——即跨越多个对象的行为或属性。这些切面可以用来封装那些分散在整个应用中的横切关注点,例如日志、事务管理或者安全控制...

    Spring 使用AspectJ 实现 AOP

    在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...

    springIOC核心组件分析.vsdx

    pring源代码各个模块作用 核心模块: 1 spring-core:核心模块 依赖注入IOC和DI的最基本实现 spring-beans:Bean工厂与装配 spring-context:上下文,即IOC...spring-aspects:集成AspectJ,Aop应用框架 spring-instrume

    spring对AOP的支持(使用AspectJ进行AOP演示)

    Spring 提供了两种主要的 AOP 实现方式:基于代理的和基于 AspectJ 的。基于代理的方式是 Spring 默认的实现,它通过 JdkDynamicProxy 或 CGLIB 创建代理对象来实现切面。而基于 AspectJ 的方式则更为强大,它允许...

    spring基于AspectJ实现事务控制

    在Spring框架中,提供了多种事务管理方式,其中之一就是基于AspectJ的事务控制。本文将深入探讨如何在Spring中利用AspectJ实现事务控制。 首先,我们需要理解什么是AspectJ。AspectJ是一种面向切面编程(AOP)的...

    Spring2.5使用AOP需要的aspectJ

    AspectJ是一个成熟的AOP框架,Spring在其AOP实现中整合了AspectJ,提供了更强大的面向切面编程能力。本篇文章将详细探讨在Spring 2.5中使用AspectJ进行AOP开发所需的知识点。 首先,我们需要理解AOP的核心概念: 1....

Global site tag (gtag.js) - Google Analytics