一、AOP(面向切面编程)
1、AOP简介
-
Spring有两个核心的概念,一个是
IOC/DI
,一个是AOP
。 -
AOP是在不改原有代码的前提下对代码进行增强 。
-
AOP
(Aspect Oriented Programming) 面向切面编程,一种编程范式,指导开发者如何组织程序结构。 AOP 是一种编程思想,编程思想主要的内容就是指导程序员该 如何编写程序。
OOP将应用程序分解成各个层次的对象,而AOP则是将程序分解成多个切面。
说到这里我们就来解释一下对象和切面的区别:
对象是应用程序中的具体实体,负责实现程序的各种功能。(其实就是一个具体的实体类)
切面是应用程序中的横切关注点,负责处理一些与业务逻辑无关的功能,提高应用程序的可维护性和可扩展性。
2、AOP作用
AOP作用:在不惊动原始设计的基础上为其进行功能增强(简单的说就是在不改变方法源代码的基础上对方法进行功能增强)
如果说面向对象编程是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系的话;那么面向切面编程(AOP)则是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要修改这个行为即可。
3、AOP相关术语
-
切面(Aspect): 切面用于组织多个Advice,Advice放在切面中定义。
-
连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用,或者异常的抛出。在Spring AOP中,连接点总是方法的调用。
-
增强处理(Advice): AOP框架在特定的切入点执行的增强处理。处理有"around"、"before"和"after"等类型
-
切入点(Pointcut): 可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。
在这里列举这些AOP术语是为了加深对AOP的理解,更好地将AOP运用到程序中。
4、AOP的通知类型
-
@Before:前置通知,在方法之前执行;
-
@AfterReturning:返回通知,方法正常返回以后,执行通知方法;
-
@AfterThrowing:异常通知,方法抛出异常后,执行通知方法;
-
@After:也是返回通知,不管方法是否正常结束,都会执行这个方法,类似于 finally;
-
@Around:环绕通知,在方法执行前后,都会执行通知方法;
二、事务管理
事务是一系列动作,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没有发生过一样。在企业级应用程序开发中,事务管理是必不可少的技术,用来确保数据的完整性和一致性。
操作:
-
开启事务(一组操作开始前,开启事务):start tranasction / begin ;
-
提交事务(这组操作全部成功,提交事务):commit
-
回滚事务(中间任何一个操作出现异常,回滚事务):rollback
1.事务的特征
事务有四大特性,简称ACID。
-
原子性(Atomicity):事务是一个不可分割的工作单位,要么全部执行,要么全部不执行。
-
一致性(Consistency):事务的执行结果必须使数据从一个一致性状态转换到另一个一致性状态。
-
隔离性(Isolation):一个事务的执行不能被其他事务干扰,即多个事务并发执行时,彼此之间不能影响彼此的执行。
-
持久性(Durability):一旦事务提交,对数据的修改就应该是永久性的,即使系统发生故障,修改的数据也不能丢失。
2.核心接口
-
事务管理器
Public interface PlatformTransactionManager(){ // 由TransactionDefinition得到TransactionStatus对象 TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; // 提交 Void commit(TransactionStatus status) throws TransactionException; // 回滚 Void rollback(TransactionStatus status) throws TransactionException; }
-
JDBC事务
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /></bean>
-
Hibernate事务
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /></bean>
-
JAVA持久化API事务
<bean class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /></bean>
-
JAVA原生API事务
<bean class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManagerName" value="java:/TransactionManager" /></bean>
3.事务隔离级别
-
DEFAULT
:默认的隔离级别,由底层数据库引擎决定。 -
READ_UNCOMMITTED
:最低的隔离级别,允许读取未提交的数据。该级别会导致“脏读”、“不可重复读”和“幻读”等问题。 -
READ_COMMITTED
:只允许读取已经提交的数据。该级别可以避免“脏读”,但可能会导致“不可重复读”和“幻读”等问题。 -
REPEATABLE_READ
:保证在同一个事务中多次读取同一数据时,该数据的值不会发生变化。该级别可以避免“脏读”和“不可重复读”,但可能会导致“幻读”等问题。 -
SERIALIZABLE
:最高的隔离级别,强制事务串行执行,避免了“脏读”、“不可重复读”和“幻读”等问题。但是该级别会对性能产生较大的影响,因此一般不建议使用。
在选择隔离级别时,需要根据具体的业务需求来选择合适的级别。一般来说,如果不需要在事务中读取未提交的数据,那么可以选择READ_COMMITTED
级别;如果需要避免“不可重复读”问题,可以选择REPEATABLE_READ
级别;如果需要避免“幻读”问题,可以选择SERIALIZABLE
级别。但是需要注意的是,隔离级别越高,事务的并发性越差,因此需要根据具体业务场景来权衡隔离级别和性能。