spring是一个轻量级的开源框架,它的核心就是IOC和AOP。

IOC,控制反转,又称依赖注入,它不需要我们再去频繁的new对象,spring会自动帮我们装配bean,需要的时候直接到这个IOC容器中去取,就好比如租房子,以前租房子需要一个房子一个房子找,费时费力,然后现在加入一个房屋中介,把你需要的房型告诉中介,就可以直接选到需要的房子,中介就相当于spring容器。
有反转,也就有正转。由我们自己在对象中主动控制去直接获取依赖对象,就是正转;而反转由容器来帮忙创建以及注入依赖对象。
@autowild这个注解实现注入,把注入的类放到IOC容器中,底层反射自动帮你创建对象,放在容器中,进行调用。

AOP,面向切面编程,对事务进行管理,提高程序的可重用性,提高开发效率。我们只需要专注于业务的处理,剩下的都交给AOP进行管理,相当于演员和经纪人的关系,演员只需要负责表演,剩下的工作都交给了经纪人,AOP相当于经纪人。

AOP支持两种动态代理:

若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
 优点:因为有接口,所以使系统更加松耦合 
 缺点:为每一个目标类创建接口 
 例如:dao层实现、service层实现类若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
 优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。 
 缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。
 例如:AOP切面、通知、连接点

说到AOP管理事务,那现在就来说一下事务。

什么是事务? 一系列的数据库操作,在完成一个功能的时候涉及到好几条sql语句的执行。

事务控制:

Spring提供两种管理事务的方式,一种是声明式事务,一种是编程式事务。

Spring的声明式事务管理,基于Spring的AOP,不再需要写commit,rollback,(但Spring仍然没有放弃编程式的事务管理策略)。
Spring的编程式事务管理,为我们提供了一个TransactionTemplate,使用回调机制,将应用代码从样板式的资源获取和释放代码中解放出来,不再有大量的try/catch/finally/try/catch代码块。

事务的四大特性:

1、原子性— 事务执行要不都成功,要不就都失败 
 2、一致性— 事务在执行前后要保持数据库的一致性状态 
 3、隔离性—一个事务的执行不受其他事务的干扰,并发执行的各个事务之间互不干扰
 4、持久性— 事务一旦提交,对数据库中数据的改变就是永久性的

事务的传播特性:

1、Propagation.REQUIRED
 最常用的一个传播特性,这个方法必须是在事务的环境下执行,
 如果当前环境没有开启事务就开启,如果是有别的方法开启的事务就不开启 
 2、Propagation.REQUIRES_NEW 
 无论何时自身都会开启事务 
 3、Propagation.SUPPORTS
 自身不会开启事务,在事务范围内则使用相同事务,否则不使用事务 
 4、Propagation.NOT_SUPPORTED
 自身不会开启事务,在事务范围内使用挂起事务,运行完毕恢复事务 
 5、Propagation.MANDATORY
 自身不开启事务,必须在事务环境使用否则报错 
 6、Propagation.NEVER 
 自身不会开启事务,在事务范围使用抛出异常 
 7、Propagation.NESTED 
 如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务,
 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。

具体事务的配置:

spring开启logger TRACE spring开启新事物_AOP


spring开启logger TRACE spring开启新事物_目标对象_02


spring开启logger TRACE spring开启新事物_AOP_03


spring开启logger TRACE spring开启新事物_目标对象_04