`

Spring AOP 的@Aspect

 
阅读更多

 

从Spring 2.0开始,可以使用基于schema及@AspectJ的方式来实现AOP,本文以一个简单的实例介绍了如何以@AspectJ方式在Spring中实现AOP。由于@Aspect是基于注解的,因此要求支持注解的5.0版本以上的JDK。

 

 环境要求:
    1. Web应用
    2. 有一个专门提供系统服务的Service层

 

 我们的目标是,如果用户调用Service层中任一方法,都在其插入一个记录信息的功能。

 

 1. 一个最简单的AOP

 

     共有2步。

 

     1.1 定义一个Aspect

 

    1.  package com.sarkuya.aop.aspect;
    2.  import org.aspectj.lang.annotation.Aspect;
    3.  import org.aspectj.lang.annotation.Before;
    4.  @Aspect
    5.  public class SampleAspect {
    6.      @Before("execution(* com.sarkuya.service..*.*(..))")
    7.      public void doBeforeInServiceLayer() {
    8.          System.out.println("=====================================");
    9.          System.out.println("Aop: do before in Service layer");
    10.         System.out.println("=====================================");
    11.   }
    12. }

 

    第4行,必须使用@Aspect在类名之前注解。

 

    第6行,当用户调用com.sarkuya.service包中任一类的任一方法,在调用前,Spring将自动执行下面的doBeforeInServiceLayer()方法,此方法只是简单地打印一些信息。

 

     1.2 在Spring配置文件applicationContext.xml中配置

 

     <beans xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

 

         <aop:aspectj-autoproxy />
        <bean class="com.sarkuya.aop.aspect.SampleAspect" />

 

         <!-- ================ YOUR CONTENTS GOES BELOW =================== -->
    </bean>

 

     就这么简单。

 

 2. 将Pointcut及Advice分开

 

     上面的Aspect中混杂了Pointcut及Advice,因此最好将其分开。共有3步。

 

     2.1 定义Pointcut

 

     1.  package com.sarkuya.aop.aspect;
    2.  import org.aspectj.lang.annotation.Aspect;
    3.  import org.aspectj.lang.annotation.Pointcut;
    4.  @Aspect
    5.  public class SampleAspect {
    6.      @Pointcut("execution(* com.sarkuya.service..*.*(..))")
    7.      public void inServiceLayer() {
    8.      }
    9.  }

 

    Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,如第6行;二是方法签名,如第7行。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。

 

     2.2 定义Advice

 

    1.  package com.sarkuya.aop.advice;
    2.  import org.aspectj.lang.annotation.Aspect;
    3.  import org.aspectj.lang.annotation.Before;
    4.  @Aspect
    5.  public class SampleAdvice {
    6.      @Before("com.sarkuya.aop.aspect.SampleAspect.inServiceLayer()")
    7.      public void logInfo() {
    8.          System.out.println("=====================================");
    9.          System.out.println("Aop: do before in service layer");
    10.         System.out.println("=====================================");
    11.     }
    12. }

 

     第4行,对于Advice,也只能使用@Aspect来注解。

 

    第6行,与第1.1节中第6行不同,这次不是直接使用Pointcut的表达式,而是使用了Pointcut中的方法签名。

 

    单独定义Pointcut的好处是,一是通过使用有意义的方法名,而不是难读的Pointcut表达式,使代码更加直观;二是Pointcut可以实现共 享,被多个Advice直接调用。若有多个Advice调用某个Pointcut,而这个Pointcut的表达式在将来有改变时,只需修改一个地方,维 护更加方便。

 

    第7行,我们将Advice的方法法改为logInfo(),以更加明确此Advice的作用。

 

     2.3 配置文件

 

    <aop:aspectj-autoproxy />
    <bean class="com.sarkuya.aop.advice.SampleAdvice" />

 

     只需配置SampleAdvice,无需配置SampleAspect。

 

 3. 重构:明确Pointcut职责

 

     对于SampleAspect来说,其主要职责是定义Pointcut,可以在此类中同时定义多个Pointcuts。但其类名反映不出这个特点,因此,应将其重构以明确其职责。

 

    package com.sarkuya.aop.pointcut;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    @Aspect
    public class PointcutsDefinition {
        @Pointcut("execution(* com.sarkuya.service..*.*(..))")
        public void inServiceLayer() {
        }
    }

 

     将SampleAspect重命名为PointcutsDefinition,并移到com.sarkuya.aop.pointcut包中。

 

     对于SampleAdvice来说,只需改变@Before()的注解,指向
    @Before("com.sarkuya.aop.pointcut.PointcutsDefinition.inServiceLayer()")

 

     而Spring配置文件保持不变。

 

 小结:
    我们先从一个最简单的Aspect实例开始,了解AOP的作用及最基本的要求,再重构为更有意义的代码,明确了AOP中的Pointcut及Advice的概念,有助于我们构建更复杂的Aspect。

 

 
分享到:
评论

相关推荐

    spring4 AOP 面向切面编程@Aspect

    `@Aspect`是Spring AOP的核心注解,用于定义一个切面。下面我们将详细探讨Spring 4中的AOP和`@Aspect`的使用。 首先,了解AOP的基本概念。AOP通过“切面”来封装横切关注点,切面是跨越多个对象的行为或责任的模块...

    Spring AOP @Aspect 基本用法

    1、@Aspect放在类头上,把这个类作为一个切面。 2、 @Pointcut放在方法头上,定义一个可被别的方法引用的切入点表达式。 3、5种通知。 3.1、@Before,前置通知,放在方法头上。 3.2、@After,后置【finally】...

    【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知

    在微服务流行的当下,在使用SpringCloud/Springboot框架开发中,AOP使用的非常广泛,尤其是@Aspect注解方式当属最流行的,不止功能强大,性能也很优秀,还很舒心!所以本系列就结合案例详细介绍@Aspect方式的切面的...

    springboot+aspect实现springaop拦截指定方法.zip

    SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...

    Spring AOP @AspectJ 入门实例

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

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

    在微服务流行的当下,在使用Spring Cloud / Spring Boot框架开发中,AOP使用的非常广泛,尤其是@Aspect注解方式当属最流行的,不止功能强大,性能也很优秀,还很舒心!所以本系列就结合案例详细介绍@Aspect方式的切...

    Spring Aop实例(AOP 如此简单)@Aspect、@Around 注解方式配置

    Spring AOP 实例(AOP 如此简单)@Aspect、@Around 注解方式配置 Spring AOP 是 Spring 框架中的一种面向切面编程(Aspect-Oriented Programming,AOP)技术,用于解决横切关注点的问题。AOP 的主要思想是将通用...

    spring aop实例annotation方法实现

    在IT行业中,Spring AOP(面向切面编程)是一种强大的工具,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本实例将详细探讨如何通过注解(Annotation)来实现Spring AOP的方法拦截。 一、Spring...

    Spring Aop四个依赖的Jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...

    Spring加Aspect的jar包

    Spring+Aspect所需jars,包括Spring-aop、Spring-Aspect、aopalliance-1.0、Aspect Jweaver-1.8.7等包,个人学习时从各地凑出来的,送上资源免得各位大大们继续跟我一样还得花时间从各地一点一点地去凑这几个包。

    征服Spring AOP—— @AspectJ

    在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring AOP(面向切面编程)则是其核心特性之一,用于实现横切关注点的模块化,如日志、事务管理等。@AspectJ是Spring AOP的一种注解驱动方式,它极大地简化了...

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...

    Spring @Aspect注解

    在 Spring实现 AOP面向切面编程, 是通过 @Aspect注解来实现切面的 使用场景 常见用于记录日志, 异常集中处理, 权限验证以及 Web参数有效验证等等 列子1 (演示基本过程 @Aspect @Component public class TestAspect ...

    简单spring aop 例子

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...

    Spring Mvc AOP通过注解方式拦截controller等实现日志管理

    在Spring MVC框架中,AOP(面向切面编程)是一种强大的工具,用于实现跨切面的关注点,如日志管理。本教程将详细介绍如何利用注解来配置和使用AOP来拦截Controller层的方法,以便记录执行过程中的相关信息,实现日志...

    基于spring@aspect注解的aop实现过程代码实例

    Spring AOP实现过程代码实例基于@Aspect注解 基于Spring @Aspect注解的AOP实现过程代码实例是指通过使用Spring框架中的AOP(Aspect-Oriented Programming)机制来实现面向切面编程的代码实例。在这个实例中,我们将...

    Spring AOP完整例子

    在Spring XML配置中,我们可以使用`&lt;aop:config&gt;`元素来定义切点表达式,然后使用`&lt;aop:aspect&gt;`元素来声明切面,并将通知方法与切点关联起来。此外,还可以使用注解驱动的配置,通过`@EnableAspectJAutoProxy`注解...

    Spring AOP 16道面试题及答案.docx

    Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...

    spring aop依赖jar包

    现在,我们回到主题——"springaop依赖的jar包"。在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:...

    spring aop demo 两种实现方式

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许程序员在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行拦截和处理。这为日志、事务管理、性能监控等提供了方便。本示例提供了一种...

Global site tag (gtag.js) - Google Analytics