Spring 事务面试知识点

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能不能用来进行依赖注入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值