Spring AOP基于注解方式快速开发

1 Spring AOP底层技术组成

  • 动态代理(InvocationHandler):JDK原生的实现方式,需要被代理的目标类必须实现接口。因为这个技术要求代理对象和目标对象实现同样的接口(兄弟两个拜把子模式)。
  • cglib:通过继承被代理的目标类(认干爹模式)实现代理,所以不需要目标类实现接口。
  • AspectJ:早期的AOP实现的框架,SpringAOP借用了AspectJ中的AOP注解。

2 初步实现

2.1 加入依赖

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.6</version>
    </dependency>
    
    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-aspects</artifactId>
       <version>6.0.6</version>
   </dependency>

2.2 准备接口

   public interface Calculator {
       
       int add(int i, int j);
       
       int sub(int i, int j);
       
       int mul(int i, int j);
       
       int div(int i, int j);
       
   }

2.3 纯净实现类

     /**
     * 实现计算接口,单纯添加 + - * / 实现! 掺杂其他功能!
     */
    @Component
    public class CalculatorPureImpl implements Calculator {
        
        @Override
        public int add(int i, int j) {
        
            int result = i + j;
        
            return result;
        }
        
        @Override
        public int sub(int i, int j) {
        
            int result = i - j;
        
            return result;
        }
        
        @Override
        public int mul(int i, int j) {
        
            int result = i * j;
        
            return result;
        }
        
        @Override
        public int div(int i, int j) {
        
            int result = i / j;
        
            return result;
        }
    }

2.4 声明切面类

   // @Aspect表示这个类是一个切面类
   @Aspect
   // @Component注解保证这个切面类能够放入IOC容器
   @Component
   public class LogAspect {
           
       // @Before注解:声明当前方法是前置通知方法
       // value属性:指定切入点表达式,由切入点表达式控制当前通知方法要作用在哪一个目标方法上
       @Before(value = "execution(public int com.atguigu.proxy.CalculatorPureImpl.add(int,int))")
       public void printLogBeforeCore() {
           System.out.println("[AOP前置通知] 方法开始了");
       }
       
       @AfterReturning(value = "execution(public int com.atguigu.proxy.CalculatorPureImpl.add(int,int))")
       public void printLogAfterSuccess() {
           System.out.println("[AOP返回通知] 方法成功返回了");
       }
       
       @AfterThrowing(value = "execution(public int com.atguigu.proxy.CalculatorPureImpl.add(int,int))")
       public void printLogAfterException() {
           System.out.println("[AOP异常通知] 方法抛异常了");
       }
       
       @After(value = "execution(public int com.atguigu.proxy.CalculatorPureImpl.add(int,int))")
       public void printLogFinallyEnd() {
           System.out.println("[AOP后置通知] 方法最终结束了");
       }
       
   }

2.5 开启aspectj注解支持

  1. xml方式
<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <!-- 进行包扫描-->
        <context:component-scan base-package="com.lx" />
        <!-- 开启aspectj框架注解支持-->
        <aop:aspectj-autoproxy />
    </beans>
  1. 配置类方式
      @Configuration
      @ComponentScan(basePackages = "com.atguigu")
      //作用等于 <aop:aspectj-autoproxy /> 配置类上开启 Aspectj注解支持!
      @EnableAspectJAutoProxy
      public class MyConfig {
      }

3 测试

//@SpringJUnitConfig(locations = "classpath:spring-aop.xml")
@SpringJUnitConfig(value = {MyConfig.class})
public class AopTest {

    @Autowired
    private Calculator calculator;

    @Test
    public void testCalculator(){
        calculator.add(1,1);
    }
}

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值