一文读懂Spring AOP的工作原理和机制(面试经)

前言

在上文中,博主介绍了Spring IoC的核心原理和用法,相信你可以通过文章中的内容学到了关键的知识点。本文同样介绍Spring的关键知识,是什么呢? AOP

作为与IoC同负盛名的武器,AOP展现了Spring另外一面风采,它促进了Spring各类插拔式开发的发展。
在这里插入图片描述

AOP(Aspect-Oriented Programming)必学必看

Aspect-Oriented Programming(AOP) complements Object-Oriented Programming (OOP) by providing another way of thinking about program structure. The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the aspect. Aspects enable the modularization of concerns such as transaction management that cut across multiple types and objects. (Such concerns are often termed crosscutting concerns in AOP literature.)

一句话总结:这是一种面向切面编程的一种技术。通过预编译(preload)和动态代理(running)实现程序功能的统一维护。AOP是OOP(面向对象编程)的延续,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行拆分和隔离,从而使得业务单元间的耦合度降低,提高程序的可重用性和开发效率。

接下来,我们一块看看AOP到底是什么。

1. 核心概念

名词解释
Aspect这是一个模块,其中包含一组提供交叉要求的API
Join point可以插入AOP切面的应用程序中的一个点(位置)
Advice这是在方法执行之前或之后要采取的实际操作
Pointcut这是一组应该执行Advice的一个或多个连接点
Target objectadvised object(建议对象),一种代理对象

上面这些“武器”,都在AOP各个方面体现到它们的作用,通过下图我们可以一览无余:
在这里插入图片描述

2. 主要原理

Spring AOP是一个基于代理的AOP框架。这意味着要实现目标对象的方面,需要创建该对象的代理。
如何实现代理?有两种方式:

  • JDK动态代理
    Spring AOP的首选方式。只要目标对象实现了一个接口,就会使用JDK动态代理。
  • CGLIB代理
    如果目标对象未实现接口,则可以使用CGLIB代理。

如果不理解,我们可以通过下图,发现两种代理方式的异同:

在这里插入图片描述

3. 实践应用

掌握了核心概念和主要原理之后,可以实践一番,且看且行。

3.1 添加maven依赖

POM添加AOP依赖,请注意更新为最新版本号,以下仅为示例:

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	KartifactId>spring-context-support
</artifactId>
	<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-aop</artifactId>
	<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjrt</artifactId>
	<version>1.6.11</version>
</dependency>
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
	<version>1.6.11</version>
</dependency>

3.2 定义切面Aspect

Write aspect class annotated with @Aspect annotation and write point-cut expressions to match joint-point methods.

一句话总结:通过在class上添加注解@Aspect ,即可将其转换为AOP中的一个切面(Aspect)。在该切面中,需要通过point-cut 表达式匹配连接点(参考核心概念中的示意图)。
代码示意:

@Aspect
public class EmployeeAspect {
	@Before("execution(*EmployeeManager.getEmployee(..))") // point-cut expression
	public void logBeforeV1(JoinPoint joinPoint) {
		System.out.println("EmployeeAspect.logBeforev1():" + joinPoint.getSignature() - getName());
	}
}

3.3 定义Methods (join point) 切入点

Write methods on which you want to execute advices and those match with point-cut expressions。

一句话总结:创建匹配point-cut 表达式的连接点,即要执行的函数或方法。
代码示意:

@Component
public class EmployeeManager{
	public EmployeeDTO getEmployee(Integer employeeId) {
		System.out.println("Method getEmployee() called");
		return new EmployeeDTO();
	}
}

在该示例中,logBeforeV1() 先于getEmployeeById()方法执行(@Before),因为它匹配point-cut表达式。


结语

本文主要介绍了Spring AOP的核心原理和实现方法,相关知识是同样是面试必答环节,好好研习一下,可助你通关哦。

走过的、路过的盆友们,点点赞,收收藏,并加以指导,以备不时之需哈~

精彩回顾

一文读懂SpringIoC的工作原理和机制(面试经)
一文读懂SpringMVC的工作原理
Springboot中基于X509完成SSL检验的原理与实践
基于springboot+enum配置化实践


在这里插入图片描述

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值