Spring 中的bean是否线程单例安全的?
默认的bean实例时单例的,所以如果单例里面有一个变量,多线程去修改的时候会有并发安全的问题。
Spring 启动流程。
在查看spring 的启动流程的时候跟进去发现有个refash()方法,里面有几步是比较重要的,像那个创建beanFactory 的一个方法,他会创建所有的beandefinition 对象嘛,然后会执行注册一些后置处理器的一些方法。最后有一个步骤,创建所有的bean对象,像那个getBean() 然后doGetBean()方法,然后调用一些createBean() doCreateBean()的方法来走bean的生命周期。
Spring 框架的重要部分
- IOC
- AOP
- DI
- spring事务
IOC
IOC 全程控制反转,就是把创建对象的权力从程序员的手里放到了容器的手里。
其次他帮我们管理了对象依赖关系,也就是DI,极大的减少了Java开发的难度。
DI
依赖关系,自动帮我们注入所需要的类。
AOP
面向切面编程,可以帮我们处理一些通用的逻辑,比如权限校验,过滤,拦截器这种与业务无关的逻辑代码。方便统一管理。
spring事务
本质是通过AOP来管理事务,无需手动编程操作事务。还有想事务传播机制,两种比较常用的,REQUIRED跟REQUIRED_NEW ,作为一个整体的事务,跟每次都起一个新的子事务。
事务传播机制
精品好文 https://www.cnblogs.com/chanshuyi/p/head-first-of-spring-transaction.html
内容总结:
针对事务传播机制,我们要弄明白的是4个点:
- 子事务与父事务的关系,是否会启动一个新的事务?
- 子事务异常,父事务是否会回滚?
- 子事务异常时,子事务是否会回滚?
- 父事务捕获异常后,父事务是否还会回滚?
REQUIRED :子方法不启动一个新事务,共用一个事务,只要发生异常回滚,整个事务都回滚。
REQUIRED_NEW : 无论当前方法是否存在事务,子方法都新建一个事务。此时父子方法的事务是独立的,它们都不会互相影响。但父方法需要注意子方法抛出的异常,避免因子方法抛出异常,而导致父方法回滚。
NESTED : 当前方法存在事务时,子方法嵌套事务执行,父方法回滚时,子事务跟着回滚。子方法发生回滚时,父方法根据是否捕获异常判断是否发生回滚。
spring事务失效
当一个没有Transactional注解的方法调用另一个有Transactional的方法,事务会失效,因为事务是基于动态代理的。
循环依赖
spring如何解决循环依赖的, 他是用了一个三级缓冲来解决的,其主要的思想就是要把需要的对象提前暴露出来给别的对象进行引用。
springboot的自动装配
其自动装配是用了一种SPI的思想,每个starter 都可以自定义装配的对象。
其核心的自动装配模块会去读取spring.factories 文件下的类,根据条件注解加载对应的类。