aop 介绍以及在spring boot中的使用

一、什么是aop?

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是Spring框架中的一个重要内容,它通过对既有程序定义一个切入点,然后在其前后甚至异常处切入不同的执行内容,比如常见的有:打开数据库连接/关闭数据库连接、打开事务/关闭事务、记录日志等。基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

二、aop中的术语

1.连接点(Joinpoint)

程序执行的某个特定位置:如类开始初始化前、类初始化后、类某个方法调用前、调用后、方法抛出异常后。一个类或一段程序代码拥有一些具有边界性质的特定点,这些点中的特定点就称为“连接点”。Spring仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常时以及方法调用前后这些程序执行点织入通知。连接点由两个信息确定:第一是用方法表示的程序执行点;第二是用相对点表示的方位。

2.切点(Pointcut)

每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。AOP通过“切点”定位特定的连接点。连接点相当于数据库中的记录,而切点相当于查询条件。切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。在Spring中,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件,Spring AOP的规则解析引擎负责切点所设定的查询条件,找到对应的连接点。其实确切地说,不能称之为查询连接点,因为连接点是方法执行前、执行后等包括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需要提供方位信息。

3.通知(Advice)

通知是织入到目标类连接点上的一段程序代码,在Spring中,通知除用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。结合执行点方位信息和切点信息,我们就可以找到特定的连接点。
通知有以下几种:

前置通知(Before advice):在切入点匹配的方法执行之前运行。使用@Before注解来声明
返回后通知(After returning advice):在切入点匹配的方法返回的时候执行。使用@AfterReturning注解来声明
抛出后通知(After throwing advice):在切入点匹配的方法执行时抛出异常的时候运行。使用 @AfterThrowing 注解来声明
后置通知(After(finally)advice):不论切入点匹配的方法是正常结束的,还是抛出异常结束的,在它结束后(finally)后通知(After(finally)advic)都会运行。使用@After注解来声明。这个通知必须做好处理正常返回和异常返回两种情况。通常用来释放资源。
环绕通知(Around Advice):环绕通知既在切入点匹配的方法执行之前又在执行之后运行。并且,它可以决定这个方法在什么时候执行,如何执行,甚至是否执行。在环绕通知中,除了可以自由添加需要的横切功能以外,还需要负责主动调用连接点(通过 proceed)来执行激活连接点的程序。请尽量使用最简单的满足你需求的通知。(比如如果前置通知也可以适用的情况下,就不要使用环绕通知)。环绕通知使用 @Around 注解来声明。而且该通知对应的方法的第一个参数必须是 ProceedingJoinPoint 类型 。在通知体内(即通知的具体方法内),调用 ProceedingJoinPoint 的 proceed() 方法来执行连接点方法 。
4.目标对象(Target Object)

通知逻辑的织入目标类。如果没有AOP,目标业务类需要自己实现所有逻辑,而在AOP的帮助下,目标业务类只实现那些非横切逻辑的程序逻辑,而性能监视和事务管理等这些横切逻辑则可以使用AOP动态织入到特定的连接点上。

5.引入(Introduction)

引入是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,我们可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。

6.织入(Weaving)

织入是将通知添加到目标类具体连接点上的过程。AOP像一台织布机,将目标类、通知或引入通过AOP这台织布机天衣无缝地编织到一起。根据不同的实现技术,AOP有三种织入的方式:

  • 编译期织入&#
Spring Boot 使用 AOP,可以通过以下步骤来配置: 1. 在 Maven 或 Gradle 构建文件,添加 `spring-boot-starter-aop` 依赖项,以引入 Spring Boot AOP 模块。 2. 定义一个切面类,使用 `@Aspect` 注解标注该类,同时在该类定义一个或多个通知方法,通知方法使用 `@Before`、`@After`、`@Around` 等注解来标注。 3. 在 Spring Boot 应用程序类上添加 `@EnableAspectJAutoProxy` 注解,以启用 AspectJ 自动代理。 4. (可选)如果需要使用基于注解的 AOP 配置,可以在 Spring Boot 应用程序类上添加 `@ComponentScan` 注解,以扫描切面类和被切入的类。 5. 在 Spring Boot 配置文件(如 `application.properties` 或 `application.yml`),可以配置 AOP 的相关属性,例如日志级别、切入点表达式等。 下面是一个简单的示例: ``` // 定义切面类 @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.demo.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("method " + joinPoint.getSignature().getName() + " is called"); } } // 启用 AspectJ 自动代理 @EnableAspectJAutoProxy @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 在上面的示例,定义了一个切面类 `LoggingAspect`,它包含一个 `@Before` 通知方法。在 `DemoApplication` 类上添加了 `@EnableAspectJAutoProxy` 注解,以启用 AspectJ 自动代理。在 `LoggingAspect` 类上添加了 `@Component` 注解,以使它能够被 Spring 扫描到并注册为一个切面类。在 `@Before` 注解定义了一个切入点表达式,表示该通知方法将在 `com.example.demo.service` 包的任何方法执行前调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值