《Java EE互联网轻量级框架整合开发》Spring基础笔记

Spring IOC容器的初始化和依赖注入

Spring IOC容器初始化有两个步骤,先定义,然后初始化和依赖注入
Bean的定义分为3步:
1.Resource定位,这步是IOC容器根据开发者的配置,进行资源定位,定位有通过XML和注解两种方式。
2.BeanDefinition的载入,将Resource定义到的信息封装到BeanDefinition中,此时并没有创建Bean实例
3.BeanDefinition的注册,将BeanDefinition的信息发布到IOC容器中,此时仍然没有创建Bean实例
完成了Bean的定义后,Bean在IOC容器中还未初始化以及依赖注入,Spring有一个配置选项-lazy-init,用来设置Bean的初始化时间,如果为true,则会在调用getBean方法时进行初始化,默认为false,即初始化IOC容器后默认会初始化全部Bean。

Spring Bean的生命周期

1.Spring对bean进行实例化
2.Spring将值和bean的引用注入到bean对应的属性中
3.如果bean实现了BeanNameAware接口,Spring和bean的ID传递给setBeanName()方法
4.如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
5.如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来
6.如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeIntialization()方法
7.如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法
8.然后会调用自定义的初始化方法,如果bean使用了init-method声明了初始化方法,该方法也会被调用
9.如果bean实现了beanPostProcessor接口,Spring将调用它们的PostProcessAfterInitialization()方法
10.此时bean已经准备就绪,已经被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁。
11.如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样如果bean使用destroy-method声明了销毁方法,该方法也会被调用

Spring数据库事务管理

在Spring中数据库事务是通过PlatformTransactionManager进行管理的,Spring中支持事务的是org.springframework.transaction.support.TransactionTemplate模板,它是Spring所提供的事务管理器模板,里面配置了事务操作的模板。
如果使用的是MyBatis框架,用的最多的事务管理器是DataSourceTransactionManager,如果使用的是Hibernate,那么就要用到HibernateTransactionManager,配置有XML配置和Java配置两种方式。

编程式事务

编程式事务以代码的方式管理事务,需要使用TransactionDefinition的默认实现类DefaultTransactionDefinition定义事务。

声明式事务

声明式事务是一种约定性的事务,声明式事务使用XML或者注解@Transactional进行配置。
使用声明式事务需要配置注解驱动,需要在Spring配置文件中加入如下配置,transactional-manager为事务对应bean的id
<tx:annotation-driven transaction-manager=“transactionManager”/>

声明式事务的流程

在Spring IOC容器初始化时,Spring会读入这个注解或者XML配置的事务信息,然后保存到事务定义类里面(TransactionDefinition的实现类中),当运行时会让Spring(AOP技术)拦截注解标注的某一个方法或者类的所有方法。
具体流程为首先Spring会通过事务管理器(PlatformTransactionManager的子类)创建事务,与此同时会把事务定义中的隔离级别、超时时间等属性根据配置内容往事务上设置。并且根据传播行为配置采取一种特定的策略,然后会启动开发者提供的业务代码,并进行后续流程。

Spring隔离级别和传播行为

隔离级别

决定隔离级别的是性能和数据一致性。
数据库常见隔离级别有四种:读未提交、读已提交、重复读、序列化。
从读未提交到序列化性能逐渐下降,但是数据一致性能够得到更好的保证。序列化会严重压制并发,由于等待锁会导致大量线程等待,从而降低性能,所以一般在高并发场景下不选择通过序列化保证数据一致性,大部分场景下会选择读已提交的方式设置事务,这样一定程度上提高了并发,也解决了脏读问题,数据一致性的问题可以用其他方式去解决,比如使用@Transactional方法进行配置。
对于一些并发量不大的场景可以考虑使用序列化隔离级别。

传播行为

传播行为是指方法之间的调用事务策略的问题。由于有些场景希望事务能够全部成功或者全部失败,也有些场景希望失败的不影响成功的操作(比如银行还款,失败的操作如果影响了成功的还款操作就会出现问题),所以Spring的传播行为就是为了解决这类问题而出现的。
在Spring中传播行为的类型,是通过一个枚举类型定义的,共定义了7种传播行为。

猜你喜欢

转载自blog.csdn.net/bathe123/article/details/82807767