面试题和答案Spring
事务5大隔离级别
- ISOLATION_DEFAULT 默认和数据库隔离级别一样
- ISOLATION_READ_UNCOMMITTED 允许脏读取
- ISOLATION_READ_COMMITTED 读取提交后数据,这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
- ISOLATION_REPEATABLE_READ 可重复读,可能出现幻读。
- ISOLATION_SERIALIZABLE 最可靠的事务隔离级别
事务7大传播级别
PROPAGATION_REQUIRED ,默认的spring事务传播级别。如果上下文中已经存在事务,那么就加入到事务中执行,如果不存在事务则新建。A或者B失败,都会全部回滚。
PROPAGATION_REQUIRES_NEW ,每次都会新建一个事务,并且同时将上下文中的事务挂起,执行当前新建事务完成以后,上下文事务恢复再执行。B成功,直接提交;B失败,Invoker A仍然成功,两个独立的事务。
PROPAGATION_NESTED 嵌套级别事务。该传播级别特征是,如果上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。涉及到 savepoint概念,B成功A不成功,都不提交,B失败,A会把事务回滚到调用B的savepoint之前,A成功的话,会单独提交A事务中的数据,而不提交B事务的数据。
PROPAGATION_SUPPORTS ,从字面意思就知道,supports,支持,该传播级别的特点是,如果上下文存在事务,则支持事务加入事务,如果没有事务,则使用非事务的方式执行。
PROPAGATION_NOT_SUPPORTED ,这个也可以从字面得知,not supported ,不支持,当前级别的特点就是上下文中存在事务,则挂起事务,执行当前逻辑,结束后恢复上下文的事务。
这个级别有什么好处?可以帮助你将事务极可能的缩小。我们知道一个事务越大,它存在的风险也就越多。所以在处理事务的过程中,要保证尽可能的缩小范围。比如一段代码,是每次逻辑操作都必须调用的,比如循环1000次的某个非核心业务逻辑操作。这样的代码如果包在事务中,势必造成事务太大,导致出现一些难以考虑周全的异常情况。所以这个事务这个级别的传播级别就派上用场了。用当前级别的事务模板抱起来就可以了。PROPAGATION_MANDATORY , 该级别的事务要求上下文中必须要存在事务,否则就会抛出异常!配置该方式的传播级别是有效的控制上下文调用代码遗漏添加事务控制的保证手段。比如一段代码不能单独被调用执行,但是一旦被调用,就必须有事务包含的情况,就可以使用这个传播级别。
PROPAGATION_NEVER ,该事务更严格,上面一个事务传播级别只是不支持而已,有事务就挂起,而PROPAGATION_NEVER传播级别要求上下文中不能存在事务,一旦有事务,就抛出runtime异常,强制停止执行
Spring IOC原理
核心原理:
- 解耦,类之间的依赖关系摆脱了传统的new的方式,而是通过xml配置、注解、Config注入等方式注册在Spring容器当中,类与类不直接联系,通过Spring容器来获取
- 缓存类,Spring容器会把创建过的单例的类缓存起来,方便复用
- 利用反射,通过全限定名来创建类对象
- BeanFactory是顶层接口,Spring默认的懒加载机制,而在tomcat容器当中使用,是初始化全部加载,缓存的形式
SpringBoot习惯优于配置原理
- 启动类有@SpringBootApplication注解(ComponentScan、AutoConfiguration、@EnableAutoConfiguration)组成
- 其中@EnableAutoConfiguration由@import注解组成
- 会加载spring-boot-autoConfig.jar包里面的spring.factories文件,系统会根据配置去根据里面的全限定名通过反射生成常用的Bean,并且这些Bean都有默认的配置属性
Spring AOP原理
- JDK动态代理原理:接口类+反射+接口类的Handler实现类的invoke方法,实现接口类的接口方法的代理。(通过反射获取接口类的构造器,然后向构造器里面注入Handler,再利用注入后的构造器newInstance代理类,当调用接口类的接口方法时,会触发Handler的invoke()方法)
- CGLib代理原理: 通过类的集成,获取target的所有方法,然后对代理类所有的方法做一个拦截加工。
Spring MVC原理
- DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。
- HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
- HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。
- ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。