理解AOP

本文介绍了什么是AOP,如何在Spring框架下使用注解实现切面编程,通过实例演示了@Aspect、@Pointcut、@Before、@Around等切点的使用。通过一个简单的服务类展示了切面编程的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、定义

AOP是面向切面编程,是对面向编程的一种补充。

将各个对象之间的相同处提取出来,并且做统一管理,将这一部分与业务\逻辑代码分离,提高代码的阅读性、扩展性。

2、使用

首先要引用Spring-Aspect

切面方法使用@Aspect

在配置xml中开启自动扫包

在配置xml中开启自动生成代理,扫描@Aspect注解的方法

切面对象只能跟一个实现类生成代理,有多个的话会报错

3、代码实现

此处先用注解的方式实现面向切面编程,只需要在引用的方法上加上注解即可,不需要配指定目录扫描,两种方式各有优劣。

3.1 新建注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Aspt {

}

新建一个注解,名字叫Aspt,@Tatget选择这个注解的作用域,我这边选的是METHOD,也就是说只能加在方法上,然后@Retention选择生命周期,这边选的是RUNTIME.

3.2 编写对应的切面类


@Aspect
@Component
public class CommonAspect {
    // 定义切面作用范围
    @Pointcut("@annotation(Aspt)")
    public void commonAspectCut(){

    }

    @Before("commonAspectCut()")
    public void before(JoinPoint joinPoint){
        System.out.println("before running" + LocalDateTime.now());
    }

    @Around("commonAspectCut()")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("around before cut" + LocalDateTime.now());
        proceedingJoinPoint.proceed();
        System.out.println("around after cut" + LocalDateTime.now());
    }

    @After("commonAspectCut()")
    public void after(JoinPoint joinPoint){
        System.out.println("after running" + LocalDateTime.now());
    }

    @AfterReturning("commonAspectCut()")
    public void AfterReturning(JoinPoint joinPoint){
        System.out.println("after returning" + LocalDateTime.now());
    }
}

新建一个类,然后@Pointcut里选择刚刚我们新建的注解,里面的表达式可以配置很多种,这边用的是@annotation,表示引用这个注解的方法,就会走进这个切面类中。

下面是切面类中五种切点的定义:

@Before

目标方法调用之前执行。

@Around

目标方法执行时候执行。

@After

目标方法调用之后执行,包括返回和抛出异常之后。

@AfterReturning

目标方法返回之后执行。

@AfterThrowing

目标方法抛出异常之后执行。

3.3 目标方法类

@Service
public class CommonConnectServiceImpl implements CommonConnectService {
    @Aspt
    @Override
    public void simpleExample() {
        int a = 10;
        int b = 20;
        int c = a * b;
        System.out.println(c);
    }

    @Async
    @Override
    public void asyncTest(Integer i) {
        for (int j=0;j<10;j++) {
            System.out.println(i*10 + j);
        }
    }
}

新建一个service类,新建个测试方法并加上定义的切面注解,然后调用此方法,发现控制台打印

 一个简单的面向切面编程例子就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值