Spring基于注解配置AOP

简介: Spring 的 AOP 功能是基于 AspectJ 实现的,支持使用注解声明式定义 AOP 切面。


一、概述



Spring 项目使用 AOP 功能需要定义三个部分:切面、切点和通知。


二、AOP 使用



Spring 基于注解配置 AOP 需要启用 AspectJ 自动代理功能。

基于 Java 配置

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
}

基于 XML 配置

<aop:aspectj-autoproxy/>


1. 定义切面


在 Spring 管理的 Bean 类上使用 @Aspect 注解就可以定义一个切面。

@Aspect
@Component
public class DemoAspect {
}


2. 定义切点


在切面类的方法使用 @Pointcut 注解来定义切点,然后在通知注解中使用方法签名来指定切点。

切点表达式用来匹配切入的目标类和方法。目标类只能是 Spring 容器管理的类,切面只能切入 Bean 中的方法。

@Aspect
@Component
public class DemoAspect {
    @Pointcut("execution(* cn.codeartist.spring.aop.aspectj.*.*(..))")
    public void pointcut() {
    }
    @Before("pointcut()")
    public void doBefore(JoinPoint joinPoint) {
        // do something
    }
}

切点表达式也可以在定义通知的时候指定,而不需要使用 @Pointcut 注解。

@Aspect
@Component
public class DemoAspect {
    @Before("execution(* cn.codeartist.spring.aop.aspectj.*.*(..))")
    public void doBefore(JoinPoint joinPoint) {
        // do something
    }
}


3. 定义通知


定义通知的时候需要指定切点,通知的类型决定了切入的节点。



微信图片01.png

前置通知

使用 @Before 注解定义前置通知,在方法执行前添加操作。

@Aspect
@Component
public class DemoAspect {
    @Before("pointcut()")
    public void doBefore(JoinPoint joinPoint) {
        // do something
    }
}

后置通知

使用 @AfterReturning 注解定义后置通知,在方法正常返回时执行,方法抛异常不执行。

@Aspect
@Component
public class DemoAspect {
    @AfterReturning("pointcut()")
    public void doAfterReturning(JoinPoint joinPoint) {
        // do something
    }
}

环绕通知

使用 @Around 注解定义环绕通知,切入方法前后,相当于拦截器的功能,可以捕获异常处理。

环绕通知的切入点参数为 ProceedingJoinPoint,并且需要手动调用 proceed() 来执行切入点方法的逻辑。

@Aspect
@Component
public class DemoAspect {
    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        // do something
        Object proceed = joinPoint.proceed();
        // do something
        return proceed;
    }
}

最终通知

使用 @After 注解定义最终通知,在方法退出时执行,无论是正常退出还是异常退出。

@Aspect
@Component
public class DemoAspect {
    @After("pointcut()")
    public void doAfter(JoinPoint joinPoint) {
        // do something
    }
}

异常通知

使用 @AfterThrowing 注解定义异常通知,在方法抛出异常时执行。

@Aspect
@Component
public class DemoAspect {
    @AfterThrowing("pointcut()")
    public void doAfterThrowing(JoinPoint joinPoint) {
        // do something
    }
}


4. 通过 Advisor 实现


使用 Advisor 能以编程的方式创建切面,需要实现通知的 API 来定义通知的类型。

比起使用注解定义切点,这种方式指定切点表达式更灵活。

@Bean
public AspectJExpressionPointcutAdvisor aspectJExpressionPointcutAdvisor() {
    AspectJExpressionPointcutAdvisor advisor = new AspectJExpressionPointcutAdvisor();
    advisor.setExpression("execution(* cn.codeartist.spring.aop.aspectj.*.*(..))");
    advisor.setAdvice((MethodBeforeAdvice) (method, args, target) -> {
        // do something
    });
    return advisor;
}


三、附录



1. 常用配置


配置 描述
<aop:aspectj-autoproxy/> 启用 AspectJ 自动代理,通过注解定义切面


2. 常用注解


注解 描述
@EnableAspectJAutoProxy 启用 AspectJ 自动代理,通过注解定义切面
@Aspect 定义切面类
@Before 定义前置通知
@AfterReturning 定义后置通知
@Around 定义环绕通知
@After 定义最终通知
@AfterThrowing 定义异常通知


3. 示例代码


Gitee 仓库:

https://gitee.com/code_artist/spring

项目模块:

spring-aop

示例路径:

cn.codeartist.spring.aop.aspectj


目录
相关文章
|
21天前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
119 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
9天前
|
设计模式 Java 测试技术
spring复习04,静态代理动态代理,AOP
这篇文章讲解了Java代理模式的相关知识,包括静态代理和动态代理(JDK动态代理和CGLIB),以及AOP(面向切面编程)的概念和在Spring框架中的应用。文章还提供了详细的示例代码,演示了如何使用Spring AOP进行方法增强和代理对象的创建。
spring复习04,静态代理动态代理,AOP
|
1天前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
8 2
|
9天前
|
Java Spring 容器
Spring使用异步注解@Async正确姿势
Spring使用异步注解@Async正确姿势,异步任务,spring boot
|
9天前
|
XML Java 数据格式
spring复习03,注解配置管理bean
Spring框架中使用注解配置管理bean的方法,包括常用注解的标识组件、扫描组件、基于注解的自动装配以及使用注解后的注意事项,并提供了一个基于注解自动装配的完整示例。
spring复习03,注解配置管理bean
|
9天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
9天前
|
前端开发 Java Spring
关于spring mvc 的 addPathPatterns 拦截配置常见问题
关于spring mvc 的 addPathPatterns 拦截配置常见问题
|
22天前
|
Java 数据库连接 数据库
Spring基础3——AOP,事务管理
AOP简介、入门案例、工作流程、切入点表达式、环绕通知、通知获取参数或返回值或异常、事务管理
Spring基础3——AOP,事务管理
|
22天前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
22天前
|
Java 数据库连接 Maven
Spring基础1——Spring(配置开发版),IOC和DI
spring介绍、入门案例、控制反转IOC、IOC容器、Bean、依赖注入DI
Spring基础1——Spring(配置开发版),IOC和DI
下一篇
无影云桌面