AOP
1.什么是AOP,在项目中使用过吗?
-
AOP 是面向切面编程,是Spring Framework的核心子模块;
-
是一种设计思想,在不修改源代码的情况下给程序统一添加额外功能的一种技术
-
面向对象的一种增强
2.AOP的作用?
-
代码重用:将一些通用的功能(日志记录,安全控制)抽象出来,形成可重用的模块
-
简化开发:使开发人员将关注点从业务逻辑中分离出来,使得开发更加简单明了
-
提高系统可扩展性:需求变化时,修改AOP模块而不是业务逻辑,易于扩展和维护
-
降低代码耦合度:将不同的关注点分离开来,可以避免代码之间的紧耦合
3.使用AOP的流程?
-
添加依赖
<!--引入aop依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2. 创建切面类 添加@Aspect注解
@Aspect
@Component
public class LogAspect {
/**
* Before注解: 前置通知,在目标方法执行之前执行;
* value参数: 切入点表达式,指定哪些方法需要被植入增强逻辑;
*/
@Before(value = "execution(public int cn.tedu._07springaop.aop.CalculatorImpl.*(..))") public void beforeMethod(){ //前置通知的增强逻辑 } }
3. 编写切入点表达式,使用通知类型的注解对目标函数进行功能增强.
4.什么是切入点表达式?
切入点表达式指定了哪些方法需要被植入增强逻辑.它是一个表达式,用于匹配目标对象中的方法,提供切入点的精确定义
5.通知类型有哪些?
-
前置通知:@Before 在被代理的目标方法前执行
-
返回通知:@AfterReturning 在被代理的目标方法成功结束后执行
-
后置通知:@After 在被代理的目标方法最终结束后执行
-
异常通知:@AfterThrowing 在被代理的目标方法异常结束后执行
-
环绕通知:@Around try-catch-finally 围绕整个被代理的目标方法 以上四种通知对应的位置
6.返回通知和后置通知的区别?
-
执行时机
返回通知是在目标方法执行后返回结果时执行的通知,只有目标方法正常返回时才会执行
后置通知在目标方法执行后执行的通知,无论是否正常抛异常与否,后置通知都执行
AOP应用场景
-
问题思考
现在有一个业务对象,这个对象已经实现了一些核心业务功能,但是我们希望在核心业务的基础上添加一些拓展任务,要求不能对目标业务对象中的实现进行修改
-
解决思路
-
为目标类创建子类或者为目标类创建兄弟类,对目标业务进行功能拓展,如果拓展业务多,这种方法工作量大
-
AOP会在系统启动时为目标类型创建子类或兄弟类型对象,称为动态代理对象.
事务的注解 @Transactional
若依框架 @Log