AOP 概述
AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP、OOP 在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。而 AOP 则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。
面向切面编程的好处就是: 减少重复,专注业务;
(注意:面向切面编程只是面向对象编程的一种补充)
核心原理:
使用动态代理的方式在执行方法前后或者出现异常的时候做加入相关的逻辑.
AOP 的基本概念
**连接点(Joinpoint):**类中可以被增强的方法,这个方法就被称为连接点
**切入点(pointcut):**类中有很多方法可以被增强,但实际中只有 add 和 update被增了,那么 add 和 update 方法就被称为切入点(实际实现的连接点)
通知(Advice): 通知是指一个切面在特定的连接点要做的事情(增强的功能)。通 知分为方法执行前通知,方法执行后通知,环绕通知等
**切面(Aspect)😗*把通知添加到切入点的过程叫切面
目标(Target): 代理的目标对象(要增强的类)
代理(Proxy): 向目标对象应用通知之后创建的代理对象
AOP 的基本概念(翻译过来)(上面的简化)
连接点: 类中可以被增强的方法
切入点: 类中实际上被增强的方法,称为切入点
通知: 要增强的方法 ,又分为前置通知,后置通知,环绕通知,异常通知
切面(Aspect):把通知添加到切入点的过程叫切面
目标: 代理的目标类,(要增强的方法所在的类)
代理(Proxy): 向目标对象应用通知之后创建的代理对象
springAOP 实现
对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一,可以完成面向切面编程。然而,AspectJ 也实现了 AOP 的功能,AspectJ 是一个基于 Java 语言的 AOP框架,它提供了强大的 AOP 功能,且其实现方式更为简捷,使用更为方便, 而 且还支持注解式开发。所以,Spring 又将 AspectJ 的对于 AOP 的实现也引入到了自己的框架中。
在 Spring 中使用 AOP 开发时,一般使用 AspectJ 的实现方式。AspectJ 是一个优秀面向切面的框架,它扩展了 Java 语言,提供了强大的切 面实现。
AspectJ 中常用的通知有五种类型:
前置通知,后置通知,环绕通知,异常通知,最终通知.
AOP案例
在业务方法中,频繁多次的调用一些与业务代码没有直接关系的功能很是麻烦
解决办法:
AOP面向切面编程
面向对象是对整个程序逻辑设计(宏观上)
面向切面是在面向对象的基础上,对程序中业务代码与非业务代码进行隔离,使得耦合性降低了,提高了开发效率
本质核心使用的是动态代理的思想,我们只需要通过配置(告诉哪个类,哪个方法,之前还是之后,执行哪个方法),spring在生成对象时,就可以将这些关系初始化好. 在运行时,可以通过spring中提供的代理去调用这些非业务代码.aop就是在执行业务代码时,可以帮助我们动态代理调用我们需要执行的非业务代码,从而不需要在业务代码中显示的调用.
AOP在spring中的使用案例就是spring中对事物的管理
事物: 事物可以看做是由对数据库若干操作(加 ,减)组成的一个单元。
事物就是一次对数据库若干操作的管理,让这若干操作要么都成功执行,要么都不执行.这是事物的原子性特征
提交事务,才表示真正在数据库执行.
事务是属于数据库的功能, spring事务管理,实际上指的spring框架帮助我们统一进行事务提交.
底层使用的aop的方式,将提交事务的代码进行抽取,在需要提交事务的业务代码中进行配置即可.
spring中的事务管理分为:
编程式事务
需要在业务代码中,显示的提交事务 ,使用TransactionTemplate transactionTemplate;
transactionTemplate.execute() 在此方法中执行业务代码
声明式事务
就是使用注解标签对需要添加事务的方法进行声明即可,这样次方法就会在事务管理中执行