`
raymond.chen
  • 浏览: 1436913 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring AOP使用整理:使用@AspectJ风格的切面声明

阅读更多

要启用基于@AspectJ风格的切面声明,需要进行以下的配置:

<!-- 启用@AspectJ风格的切面声明 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>

<!-- 通过注解定义bean。默认同时也通过注解自动注入 -->
<context:component-scan base-package="com.cjm"/>

 

基于@AspectJ风格的切面声明的源码:

/**
 * 声明本类为一个切面
 */
@Component
@Aspect
public class MyAspectJ {
	/**
	 * 声明一个切入点(包括切入点表达式和切入点签名)
	 */
	@Pointcut("execution(* com.cjm.model..*.*(..))")
	public void pointcut1(){}
	
	/**
	 * 声明一个前置通知
	 */
	@Before("pointcut1()")
	public void beforeAdvide(JoinPoint point){
		System.out.println("触发了前置通知!");
	}
	
	/**
	 * 声明一个后置通知
	 */
	@After("pointcut1()")
	public void afterAdvie(JoinPoint point){
		System.out.println("触发了后置通知,抛出异常也会被触发!");
	}
	
	/**
	 * 声明一个返回后通知
	 */
	@AfterReturning(pointcut="pointcut1()", returning="ret")
	public void afterReturningAdvice(JoinPoint point, Object ret){
		System.out.println("触发了返回后通知,抛出异常时不被触发,返回值为:" + ret);
	}
	
	/**
	 * 声明一个异常通知
	 */
	@AfterThrowing(pointcut="pointcut1()", throwing="throwing")
	public void afterThrowsAdvice(JoinPoint point, RuntimeException throwing){
		System.out.println("触发了异常通知,抛出了RuntimeException异常!");
	}
	
	/**
	 * 声明一个环绕通知
	 */
	@Around("pointcut1()")
	public Object aroundAdvice(ProceedingJoinPoint point)throws Throwable{
		System.out.println("触发了环绕通知 开始");
		Object o = point.proceed();
		System.out.println("触发了环绕通知 结束");
		return o;
	}
}

 

1、切入点表达式的格式:execution([可见性] 返回类型 [声明类型].方法名(参数) [异常])

 

2、切入点表达式通配符:
      *:匹配所有字符
      ..:一般用于匹配多个包,多个参数
      +:表示类及其子类

 

3、切入点表达式支持逻辑运算符:&&、||、!

 

4、切入点表达式关键词:
      1)execution:用于匹配子表达式。

            //匹配com.cjm.model包及其子包中所有类中的所有方法,返回类型任意,方法参数任意
            @Pointcut("execution(* com.cjm.model..*.*(..))")
            public void before(){}

 

      2)within:用于匹配连接点所在的Java类或者包。

            //匹配Person类中的所有方法
            @Pointcut("within(com.cjm.model.Person)")
            public void before(){}

 

            //匹配com.cjm包及其子包中所有类中的所有方法

            @Pointcut("within(com.cjm..*)")
            public void before(){}

 

     3) this:用于向通知方法中传入代理对象的引用。
            @Before("before() && this(proxy)")
            public void beforeAdvide(JoinPoint point, Object proxy){
                  //处理逻辑
            }

 

      4)target:用于向通知方法中传入目标对象的引用。
            @Before("before() && target(target)
            public void beforeAdvide(JoinPoint point, Object proxy){
                  //处理逻辑
            }

 

      5)args:用于将参数传入到通知方法中。
            @Before("before() && args(age,username)")
            public void beforeAdvide(JoinPoint point, int age, String username){
                  //处理逻辑
            }
 
      6)@within:用于匹配在类一级使用了参数确定的注解的类,其所有方法都将被匹配。 

            @Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation标注的类都将匹配
            public void before(){}

 

  @Retention(RetentionPolicy.RUNTIME)
  @Target({ElementType.TYPE, ElementType.METHOD})
  @Documented
  @Inherited
  public @interface AdviceAnnotation {

  }

  

      7)@target:和@within的功能类似,但必须要指定注解接口的保留策略为RUNTIME。
            @Pointcut("@target(com.cjm.annotation.AdviceAnnotation)")
            public void before(){}

 

      8)@args:传入连接点的对象对应的Java类必须被@args指定的Annotation注解标注。
            @Before("@args(com.cjm.annotation.AdviceAnnotation)")
            public void beforeAdvide(JoinPoint point){
                  //处理逻辑
            }

  

public class Person {
    public void say(Address address){
          //处理逻辑
   }
}

 @AdviceAnnotation
 public class Address {
   
 }

 

  如果需要在Person类的say方法被调用时触发beforeAdvide通知,那么say方法的参数对应的Java类型Address类必须要被@AdviceAnnotation标注。

 

      9)@annotation:匹配连接点被它参数指定的Annotation注解的方法。也就是说,所有被指定注解标注的方法都将匹配。
            @Pointcut("@annotation(com.cjm.annotation.AdviceAnnotation)")
            public void before(){}

 

public class Person {
      @AdviceAnnotation
      public void say(Address address){
              //处理逻辑
    }
}

  

  Person类的say方法被@AdviceAnnotation标注,所以它匹配。

 

      10)bean:通过受管Bean的名字来限定连接点所在的Bean。该关键词是Spring2.5新增的。
            @Pointcut("bean(person)")
            public void before(){}

 

            id为person的受管Bean中的所有方法都将匹配。

0
0
分享到:
评论

相关推荐

    征服Spring AOP—— @AspectJ

    例如,我们创建一个简单的日志记录切面: ```java @Aspect public class LoggingAspect { @Pointcut("execution(* com.example.service.*.*(..))") public void allServiceMethods() {} @Before(...

    Spring AOP 概念理解及@AspectJ支持

    例如,下面的代码展示了如何使用@AspectJ定义一个简单的切面: ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint...

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

    @AspectJ是一种基于Java语言的AOP实现,允许在切面类上直接使用注解定义切点和通知。这种方式更加简洁和直观。例如: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* ...

    Spring AOP @AspectJ 入门实例

    在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring AOP(面向切面编程)则是其核心特性之一,用于实现横切关注点的模块化,如日志、事务管理等。本实例将带你深入理解并实践Spring AOP与@AspectJ的结合...

    @AspectJ配置Spring AOP,demo

    为了使@AspectJ切面生效,需要在Spring配置中启用@AspectJ支持,并扫描包含切面的包。这通常在XML配置中完成: ```xml &lt;aop:aspectj-autoproxy /&gt; ``` 或者在Java配置中: ```java @Configuration @...

    Spring @AspectJ 实现AOP 入门例子

    @AspectJ是Spring支持的一种AOP实现,它使用注解来定义切面,简化了配置过程。 创建一个Spring AOP应用的第一步是设置项目结构。在给定的压缩包文件中,我们可能看到一个名为"src"的目录,通常这个目录包含项目的源...

    spring4 AOP 面向切面编程@Aspect

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理、权限检查等。`@Aspect`是Spring AOP的核心注解,用于定义一个切面。下面我们将详细...

    spring切面AOP所使用的jar包

    - 定义切面:创建一个类作为切面,定义通知方法,并使用注解@Aspect来标识。 - 配置通知:使用@Before、@After、@AfterReturning、@AfterThrowing、@Around注解来指定通知的执行时机。 - 配置切入点:使用@...

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

    而基于 AspectJ 的方式则更为强大,它允许开发者使用 AspectJ 的语言特性(如 @Aspect、@Before、@After 等)来编写切面,提供了更直观和灵活的 AOP 解决方案。 本示例将重点介绍如何使用 AspectJ 进行 AOP 演示。...

    Spring AOP面向切面三种实现

    Spring AOP支持AspectJ,可以通过引入AspectJ的库和配置,将AspectJ切面集成到Spring应用中。AspectJ提供了更丰富的语法,如`@Before`、`@After`、`@Around`等,使得切面的定义更加直观。 3. **注解驱动的切面** ...

    spring aop 自定义切面示例

    AspectJ是一个强大的面向切面的编程库,它提供了与Spring AOP集成的能力,使我们可以编写更为灵活和模块化的代码。下面我们将详细探讨如何在Spring中创建和使用自定义切面,以及AspectJ的相关知识。 首先,让我们...

    day39-Spring 06-Spring的AOP:带有切点的切面

    在"day39-Spring 06-Spring的AOP:带有切点的切面"这个主题中,我们将深入探讨如何在Spring中实现带有切点的切面,以及它们如何与源码和工具结合使用。 首先,理解AOP的基本概念非常重要。AOP的核心是切面(Aspect...

    Spring 使用AspectJ 实现 AOP

    Spring 框架是Java开发中的一个核心组件,它提供了许多功能,其中之一就是面向切面编程(AOP)。AOP是一种编程范式,允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理等。在Spring中,我们可以使用...

    aspectj的jar spring使用aop需要的jar

    4. **`aspectjweaver.jar`**:这个库是Spring与AspectJ集成的关键,它是一个类装载器代理,可以在Spring应用上下文中自动织入AspectJ切面。当你在Spring配置中启用`&lt;aop:aspectj-autoproxy&gt;`时,Spring会使用AspectJ...

    SpringBoot中的AOP+自定义注解(源代码)

    1.1 `@AspectJ` 切面类 1.2 `@Pointcut` 创建切入点 1.3 通知 1.4 Spring AOP 和 AspectJ AOP 有什么区别? 2. 在 SpringBoot 中使用 Aop 功能 2.0 创建一个SpringBoot项目 2.1 引入 POM 依赖 2.1.1 引入springboot ...

    mybatis 拦截器 + spring aop切面 + spring事务+ 反射工具类

    Spring AOP是Spring框架的一个重要特性,它实现了面向切面编程,允许开发者定义“切面”,即关注点的模块化,比如日志记录、性能监控、安全控制等。切面通过通知(advises)来增强其他对象的行为。Spring支持多种...

Global site tag (gtag.js) - Google Analytics