Spring创建Advice

Spring AOP实践:从XML到注解
本文介绍了如何在Spring中使用AOP技术,首先通过XML Schema配置创建Advice,简化代码并方便应用程序维护。具体步骤包括定义切面、切入点和Advice,如设置<aop:config>、<aop:aspect>、<aop:pointcut>、<aop:before>和<aop:after>标签。接着,文章探讨了基于注解的@AspectJ方式,直接在Java类上标注@Aspect、@Pointcut、@Before和@After,实现相同的功能。

基于Xml Schema实现aop技术

   1、简化代码实现

   2、容易对应用程序进行维护

   3、所有元素都定义在<aop:config>标签元素中

  eg:

   <bean id="apbean" class="aspecBean"></bean>

   <bean id="he" class="hello"></bean>

   <!-- 包含多个切面,切入点、advice等标签元素 -->

   <aop:config>

   <!-- 定义一个切面 -->

   <aop:aspect id="ap" ref="apbean">

   <!-- 定义切入点的信息   

        expression是执行表达式

           *:代表匹配任意的返回类

           ():匹配了一个不接受任何参数的方法

           (..):匹配了接受任何参数的方法(一个至多个)

   -->

   <aop:pointcut expression="execution(*.hello.*(..))" id="pc"/>

   <!-- 用于匹配BeforeAdvice -->

   <aop:before method="startLog" pointcut-ref="pc"/>   //开启记录

    <!-- 用于匹配AfterAdvice -->

   <aop:after method="endLog" pointcut-ref="pc"/>     //结束记录

   </aop:aspect>

   </aop:config>

基于Annotation

  以注解的方式对java的普通类进行标注

  @AspectJ采用jdk5.0的注解技术

  eg:

   @Aspect  //声明切面

   public class aspectBean{

      @Pointcut("execution(* hello.*(..))")

      public void log(){}

    

      @Before(value="log()")   //在切入点之前执行

      public void startLog(){

         System.out.println("开始记录!");

      }

 

      @After(value="log()")   //在切入点之后执行

      public void endLog(){

          System.out.println("结束记录!"); 

      }

}

Spring Boot中,创建advice通常指的是创建切面(Aspect)中的通知(Advice)。Spring AOP(面向切面编程)允许我们在不修改代码的情况下,通过切面来添加横切关注点(如日志记录、事务管理、权限验证等)。以下是如何在Spring Boot中创建advice的步骤: 1. **创建切面类**:使用`@Aspect`注解标注一个类,使其成为一个切面。 2. **定义切点**:使用`@Pointcut`注解定义切点,即在哪些方法上应用通知。 3. **创建通知**:使用`@Before`、`@After`、`@Around`等注解定义通知,即在切点执行前、执行后或环绕执行时执行的方法。 下面是一个简单的示例: ```java import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Aspect @Component public class MyAdvice { // 定义切点 @Pointcut("execution(* com.example.service.*.*(..))") public void myPointcut() {} // 在切点执行前执行 @Before("myPointcut()") public void beforeAdvice() { System.out.println("Before advice executed"); } // 在切点执行后执行 @After("myPointcut()") public void afterAdvice() { System.out.println("After advice executed"); } // 环绕切点执行 @Around("myPointcut()") public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("Around advice before execution"); Object result = joinPoint.proceed(); System.out.println("Around advice after execution"); return result; } } ``` 在这个示例中: - `@Aspect`注解将类标记为一个切面。 - `@Component`注解将该类注册为Spring Bean。 - `@Pointcut`注解定义了一个切点,匹配`com.example.service`包下的所有方法。 - `@Before`、`@After`和`@Around`注解定义了在切点执行前、执行后和环绕执行的逻辑。 通过这种方式,你可以在不修改业务代码的情况下,添加横切关注点的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值