Spring事务传播机制
多个事务方法相互调用时,事务如果在这些方法间传播,方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有无事务以及方法B对事务的要求不同都会对方法A的事务具体执行造成影响,同事方法A的事务对方法B的事务执行也有影响,这种影响具体是什么就由两个方法所定义的事务传播类型所决定。
1、REQUIRED:Spring默认的事务传播类型,如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务;
2、SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行;
3、MANDATORY:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常;
4、REQUIRES_NEW:创建一个新事物,如果存在当前事务,则挂起该事务;
5、NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则挂起当前事务;
6、NEVER:不使用事务,如果当前事务存在,则抛出异常;
7、NESTED:如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样,开启一个事务;
Spring中的事务是如何实现的?
1、Spring事务底层是基于数据库事务和AOP机制的
2、首先对于使用了@Transactional注解的Bean,Spring会创建一个代理对象作为Bean
3、当调用代理对象的方法时,会先判断该方法上是否加了@Transactional注解
4、如果加了,那么则利用事务管理器创建一个数据库连接
5、并且修改数据库连接的autocommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一步
6、然后执行当前方法,方法中会执行sql
7、执行完当前方法后,如果没有出现异常就直接提交事务
8、如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
9、Spring事务的隔离级别对应的就是数据库的隔离级别
10、Spring事务的传播机制是Spring事务自己实现的,也是Spring事务中最复杂的
11、Spring事务的传播机制是基于数据库连接来做的,一个数据库连接一个事务,如果传播机制配置为需要新开一个事务,那么实际上就是先建立一个数据库连接,在此新数据库连接上执行sql
Spring事务什么时候会失效?
Spring事务的原理是AOP,进行了切面增强,那么失效的根本原因是这个AOP不起作用了,常见情况有如下几种:
1、发生自调用,类里面使用this调用本类的方法(this通常省略),此时这个this对象不是代理类,而是UserService对象本身!解决方法很简单,让那个this变成UserService的代理类即可;
2、方法不是Public的,@Transactional只能用于Public的方法上,否则事务不会生效,如果要用在非Public方法上,可以开启AspectJ代理模式。
3、数据库不支持事务;
4、没有被Spring管理;
5、异常被吃掉,事务不会回滚(或者抛出的异常没有被定义,默认为RuntimeException)
Spring中的Bean创建的生命周期有哪些步骤?
Spring中一个Bean的创建大概分为一下几个步骤:
1、推断构造法
2、实例化
3、填充属性,也就是依赖注入
4、处理Aware回调
5、初始化前,处理@postConstruct注解
6、初始化,处理InitalizingBean接口
7、初始化后,进行AOP
Spring中的Bean是线程安全的吗?
Spring本身并没有针对Bean做线程安全的处理,所以
1、如果Bean是无状态的,那么Bean则是线程安全的
2、如果Bean是有状态的,那么Bean则不是线程安全的
另外,Bean是不是线程安全,跟Bean的作用域没有关系,Bean的作用域只是表示Bean的生命周期范围,对于任何生命周期的Bean都是一个对象,这个对象是不是线程安全的,还是得看这个Bean对象本身。
Spring中用到了哪些设计模式?
1、工厂模式: BeanFactory、FactoryBean、ProxyFactory
2、原型模式:原型Bean、PrototypeTargetSource、PrototypeAspectInstanceFactory
3、单例模式:单例Bean、SingletonTargetSource、DefaultBeanNameGenerator、SimpleAutowireCandidateResolver、AnnotationAwareOrderComparator
4、构建器模式:BeanDefinitionBuilder-----BeanDefinition构造器、BeanFactoryAspectJAdvisorsBuilder------解析并构造@AspectJ注解的Bean中所定义的Advisor、StringBuilder
5、适配器模式:ApplicationListenerMethodAdapter-----将@EventListener注解的方法适配成ApplicationListener、AdvisorAdapter ----把Advisor适配成MethodIntercepor
6、访问者模式:PropertyAccessor ----属性访问器,用来访问和设置某个对象的某个属性、MessageSourceAccessor ----国际化资源访问器
7、装饰器模式:BeanWrapper ----比单纯的Bean对象功能更加强大、HttpRequestWrapper
8、代理模式:方法生产了代理对象的地方就用到了代理模式,AOP、@Configuration、@Lazy
9、观察者模式:ApplicationListener ----事件监听机制、AdvisedSupportListener -----ProxyFactory可以提交此监听器,用来监听ProxyFactory创建代理对象完成事件,添加Advisor事件等
10、策略模式:InstantiationStrategy ----Spring需要根据BeanDefinition来实例化Bean,但是具体可以选择不同的策略来进行实例化、BeanNameGenerator ----beanName生成器
11、模板方法模式:AbstractApplicationContext ---postProcessBeanFactory() 子类可以继续处理BeanFactory、onRefresh() 子类可以做一些额外的初始化
12、责任链模式:DefaultAdvisorChainFactory ---负责构造一条AdvisorChain,代理对象执行某个方法时会依次经过AdvisorChain中的每个Advisor、QualifierAnnotationAutowireCandidateResolver ----判断某个Bean能不能用来进行依赖注入