Java知识点学习(第12天)

Spring事务传播机制

多个事务方法相互调用,事务如何在这些方法中进行传播,方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有无事务以及方法B对事务的要求不同都会对方法A的事务具体的执行造成影响。

  1. REQUIRED:这是Spring默认的事务,如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务。
  2. SUPPORTS:当前存在事务,则加入事务,如果当前没有事务,就以非事务方法执行。
  3. MANDATORY:当前存在事务,则将入事务,如果没有事务,就抛出异常。
  4. REQUIRES_NEW:创建一个事务,如果当前存在事务,则挂起该事务。
  5. NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则挂起当前事务。
  6. NEVER:不使用事务,如果当前存在事务,则抛出异常。
  7. NESTED:如果当前事务存在,则在嵌套事务中执行,否则新建一个事务。

Spring事务什么时候会失效?

Spring事务的原理就是AOP,底层还是Spring事务产生的代理对象来实现对应的方法,失效的原因就是AOP不起作用了。

  1. 发生自调用,类里面使用this调用本类的方法,此时this对象不是代理类,而是UserService对象本身。
  2. 方法不是public修饰的,@Transactional只能用于public的方法上,否则事务不会生效,如果要使用在非public方法上,可以开启AspectJ代理模式。
  3. 数据库不支持事务。
  4. 没有被Spring代理。
  5. 异常被吃掉,事务不会进行回滚操作。

Spring的Bean是线程安全的吗?

Spring本身没有针对Bean做线程安全的处理。

  1. 如果Bean是无状态的,那么Bean就是线程安全的。
  2. 如果Bean是有状态的,那么Bean就是线程不安全的。

所谓的Bean有无状态,主要要看Bean里面的方法有没有操作Bean相关的属性,如果修改了就是有状态的,如果没有修改就是无状态的。另外,Bean是不是线程安全的,和Bean的作用域没有关系,Bean的作用域只是表示Bean的生命周期范围,对任何生命周期的Bean都是一个对象,这个对象是不是线程安全的,本身还得看Bean对象本身的代码、属性、方法到底是怎么写的。

Bean创建的生命周期有哪些步骤?

  1. 首先Spring要去选择使用当前类的哪个构造方法,也就是推断构造方法。
  2. Spring利用构造方法去实例化一个对象。
  3. Spring对对象进行属性的赋值,也就是依赖注入。
  4. 处理Aware回调接口。
  5. 初始化前,调用含有@PostConstruct注解的方法。
  6. 初始化,处理InitializingBean接口。
  7. 初始化后,进行AOP。

ApplicationContext和BeanFactory有什么区别?

BeanFactory是Spring中非常核心的组件,表示Bean工厂,可以生成Bean,维护Bean,而ApplicationContext继承了BeanFactory,所以说ApplicationContext拥有BeanFactory的所有特点,也是一个Bean工厂,但ApplicationContext除了BeanFactory之外,还继承了诸多如EnvironmentCapable、 MessageSource、 ApplicationEventPublisher等接口,从而ApplicationContext还可以获取系统环境变量、国际化、事件发布等功能,这是BeanFactory所不具备的。

你可能感兴趣的:(Java知识点,java)