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


目录
相关文章
|
7天前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
|
28天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
170 73
|
3天前
|
监控 Java 数据库连接
Spring c3p0配置详解
在Spring项目中配置C3P0数据源,可以显著提高数据库连接的效率和应用程序的性能。通过合理的配置和优化,可以充分发挥C3P0的优势,满足不同应用场景的需求。希望本文的详解和示例代码能为开发者提供清晰的指导,帮助实现高效的数据库连接管理。
28 10
|
23天前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
51 21
|
16天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
65 8
|
28天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
28天前
|
Java Spring
【Spring配置相关】启动类为Current File,如何更改
问题场景:当我们切换类的界面的时候,重新启动的按钮是灰色的,不能使用,并且只有一个Current File 项目,下面介绍两种方法来解决这个问题。
|
28天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
28天前
|
Java Spring
【Spring配置】创建yml文件和properties或yml文件没有绿叶
本文主要针对,一个项目中怎么创建yml和properties两种不同文件,进行配置,和启动类没有绿叶标识进行解决。
|
1月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
110 14