AOP

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,用于将横切关注点与业务逻辑分离。

AOP的实现原理主要包括以下几个步骤:

  1. 定义切面:指定在哪些类的哪些方法上切入。

  2. 代理生成:Spring使用AOP代理工厂(如JDK动态代理或CGLIB)来创建代理对象。

    1. 切面织入:将通知(如Before、After、Around)织入到代理对象的相应方法中。 

      // 定义一个业务接口和实现
      public interface MyService {
          void serviceMethod();
      }
       
      public class MyServiceImpl implements MyService {
          public void serviceMethod() {
              System.out.println("Service method executed");
          }
      }
       
      // 定义一个切面
      @Aspect
      public class MyAspect {
          @Before("execution(* com.example.MyService.*(..))")
          public void beforeAdvice() {
              System.out.println("Before advice");
          }
      }
       
      // 配置文件
      <beans>
          <bean id="myService" class="com.example.MyServiceImpl"/>
          <bean class="com.example.MyAspect"/>
          <!-- 启用AspectJ注解支持 -->
          <aop:aspectj-autoproxy/>
      </beans>

      在这个例子中,MyServiceImpl是业务实现类,MyAspect是切面类,其中定义了一个前置通知。在Spring配置文件中,启用了AspectJ的注解支持<aop:aspectj-autoproxy/>,这样Spring就会自动为带有@Aspect注解的类生成代理,并将通知织入到方法执行的相应环节。

       


       

      PointCut

      切入点,作用在方法上,可以被切面组合使用。

      官方文档

      package com.xyz;
      
      public class Pointcuts {
      
          @Pointcut("execution(public * *(..))")
          public void publicMethod() {}
      
          @Pointcut("within(com.xyz.trading..*)")
          public void inTrading() {}
      
          @Pointcut("publicMethod() && inTrading()")
          public void tradingOperation() {}
      }

      网友实例


      Advice

      官方文档

      通知,通过before after等表达式,和切入点组合使用。

      @Aspect
      public class BeforeExample {
      
         // Same as pointcut definition @Before(
      "execution(* com.xyz.dao.*.*(..))") public void doAccessCheck() { // ... }

      // Use pointcut method
      @Before("publicMethod()")
      public void doAccessCheck2() {

      // ...
          }
      }

       


       

      Aspect

      切面,通知spring框架自动配置。

      package com.xyz;
      
      import org.aspectj.lang.annotation.Aspect;
      
      @Aspect
      public class NotVeryUsefulAspect {
      }

       

       

posted @ 2024-10-10 10:16  A-P-I  阅读(34)  评论(0)    收藏  举报