一个简单示例轻松理解Spring中的AOP

SpringAOP基本概念

AOP:(Aspect Oriented Programming)面向切面编程,一种在已存在代码段中动态嵌入其他代码段的技术,用来在不改变原有代码的情况下添加一些新的通用功能,如记录日志、参数预处理等。

**通知Advice:**需要在原有程序中新增的功能;

**连接点JoinPoint:**程序中可以接入通知的点,包括类、方法等;

**切入点PointCut:**程序运行过程中实际接入通知的点,是一种特殊的连接点;

**切面Aspect:**是一个类,在这个类中定义切入点和通知;

AOP简单实例

  1. 原程序如下

    @Service
    public class AopTestService {
        @CutPointAnno
        public void test(){
            System.out.println("测试方法执行");
        }
    
        @CutPointAnno
        public void testThrowable(){
            throw new RuntimeException();
        }
    }
    
    //此注解标注的方法被标记为切面
    public @interface CutPointAnno {
    }
    
  2. 切面,包括以注解形式定义的切入点和通知,这里定义了SpringAOP提供的四种通知类型(前置通知,后置通知,环绕通知,异常通知)其中,异常通知在程序抛出异常时执行

    @Aspect
    @Component
    public class SimpleAspect {
        @Pointcut("@annotation(cn.sunyog.aop.CutPointAnno)")
        public void pointCut(){}
    
        @Before("pointCut()")
        public void doBefore(JoinPoint joinPoint) {
            System.out.println("前置通知");
        }
    
        @After("pointCut()")
        public void doAfter(JoinPoint joinPoint){
            System.out.println("后置通知");
        }
    
        @Around("pointCut()")
        public void doAround(ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("环绕通知,前段");
            joinPoint.proceed();//程序执行
            System.out.println("环绕通知,后段");
        }
    
        @AfterThrowing("pointCut()")
        public void doThrowing(JoinPoint joinPoint){
            System.out.println("异常通知");
        }
    }
    
  3. 启动Aop代理配置

    @Configuration
    @ComponentScan("cn.sunyog.aop")//包扫描,扫描此包中所有的Bean,注册到容器中
    @EnableAspectJAutoProxy//启用SpringAOP代理,包括jdk动态代理和cglib代理两种形式
    public class AopConfig {
    }
    
  4. 启动容器,测试Aop是否成功

    public class AOPTest {
        private ApplicationContext ctx;
    
        @Before
        public void doBefore(){
            ctx=new AnnotationConfigApplicationContext(AopConfig.class);
        }
    
        @After
        public void doAfter(){
    
        }
    
        @Test
        public void test(){
            AopTestService service = ctx.getBean(AopTestService.class);
            service.test();
            System.out.println();
            service.testThrowable();
        }
    }
    
  5. 打印结果

    环绕通知,前段
    前置通知
    测试方法执行
    后置通知
    环绕通知,后段
    
    环绕通知,前段
    前置通知
    异常通知
    后置通知
    

可见,通知的执行顺序为:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李奇技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值