日期:2022年8月17日
Spring的两大核心是什么?谈一谈你对IOC的理解? 谈一谈你对DI的理解? 谈一谈你对 AOP 的理解?(必会)
Spring 的生命周期?(高薪常问)
1.实例化一个 Bean,也就是我们通常说的 new
2.按照 Spring 上下文对实例化的 Bean 进行配置,也就是 IOC 注入
3.如果这个 Bean 实现 dao 了 BeanNameAware 接口,会调用它实现的 setBeanName(String beanId)方法,此处传递的是 Spring 配置文件中 Bean 的 ID
4.如果这个 Bean 实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory(), 传递的是 Spring 工厂本身(可以用这个方法获取到其他 Bean)
5.如果这个 Bean 实现了 ApplicationContextAware 接口,会调用 setApplicationContext(ApplicationContext)方法,传入 Spring 上下文,该方式同样可以实现步骤 4,但比 4 更好,以为 ApplicationContext 是 BeanFactory 的子接口,有更多 的实现方法
6.如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用 postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor 经常被 用作是 Bean 内容的更改,并且由于这个是在 Bean 初始化结束时调用 After 方法,也可用于内存或缓存技术
7.如果这个 Bean在 Spring 配置文件中配置了 init-method 属性会自动调用其配置的初始化方法
8.如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用 postAfterInitialization(Object obj, String s)方法 注意:以上工作完成以后就可以用这个 Bean 了,那这个 Bean 是一个 single 的,所以 一般情况下我们调用同一个 ID 的 Bean 会是在内容地址相同的实例。
9.当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 接口,会 调用其实现的 destroy 方法
10.最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其 配置的销毁方法
Spring 支持 bean 的作用域有几种吗? 每种作用域是什么样的?(必会)
Spring 支持如下 5 种作用域:
(1)singleton:默认作用域,单例 bean,每个容器中只有一个 bean 的实例。
(2)prototype:每次请求都会为 bean 创建实例。
(3)request:为每一个 request 请求创建一个实例,在请求完成以后,bean 会失效 并被垃圾回收器回收。
(4)session:与 request 范围类似,同一个 session 会话共享一个实例,不同会话 使用不同的实例。
(5)global-session:全局作用域,所有会话共享一个实例。如果想要声明让所有会 话共享的存储变量的话,那么这全局变量需要存储在 global-session 中。
BeanFactory 和 ApplicationContext 有什么区别(了解)
BeanFactory:
Spring 最顶层的接口,实现了 Spring 容器的最基础的一些功能, 调用起来比较麻烦, 一般面向 Spring 自身使用 , BeanFactory 在启动的时候不会去实例化 Bean,从容器中拿 Bean 的时候才会去实例化
ApplicationContext:
是 BeanFactory 的子接口,扩展了其功能, 一般面向程序员身使用 ApplicationContext 在启动的时候就把所有的 Bean 全部实例化了
Spring 框架中都用到了哪些设计模式?(必会)
Spring 事务的实现方式和实现原理(必会)
Spring 事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring 是 无法提供事务功能的。真正的数据库层的事务提交和回滚是通过 binlog 或者 redo log 实现的。
spring 事务实现主要有两种方法
1、编程式,beginTransaction()、commit()、rollback()等事务管理相关的方法
2、声明式,利用注解 Transactional 或者 aop 配置
你知道的 Spring 的通知类型有哪些,分别在什么时候执行?(了解)
Spring 的通知类型有四种,分别为:
Spring 的对象默认是单例的还是多例的? 单例 bean 存不存在线程安全问题呢?(必会)
@Resource 和@Autowired 依赖注入的区别是什么? @Qualifier 使用场 景是什么?(了解)
@Resource
只能放在属性上,表示先按照属性名匹配 IOC 容器中对象 id 给属性注入值若没有成功,会继续根据当前属性的类型匹配 IOC 容器中同类型对象来注入值 。
若指定了 name 属性@Resource(name = “对象 id”),则只能按照对象 id 注入值。
@Autowird
放在属性上:表示先按照类型给属性注入值如果 IOC 容器中存在多个与属性同类型的对象,则会按照属性名注入值也可以配合@Qualifier(“IOC 容器中对象 id”)注解直接按照名称注入值。
放在方法上:表示自动执行当前方法,如果方法有参数,会自动从 IOC 容器中寻 找同类型的对象给参数传值也可以在参数上添加@Qualifier(“IOC 容器中对象 id”)注解按照名称寻找对象给 参数传值。
@Qualifier
使用场景: @Qualifier(“IOC 容器中对象 id”)可以配合@Autowird 一起使用, 表示根据指定 的 id 在 Spring 容器中匹配对象
Spring 的常用注解(必会)
Spring 的事务传播行为(高薪常问)
spring 事务的传播行为说的是,当多个事务同时存在的时候,spring 如何处理这些事务的行为。
备注(方便记忆): propagation 传播
require 必须的/suppor 支持/mandatory 强制托管/requires-new 需要新建/ not -supported 不支持/never 从不/nested 嵌套的
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务, 如果当前不存在事务,就以非事务执行。
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事 务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建 新事务。⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务, 就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前 没有事务,则按 REQUIRED 属性执行。
Spring 中的隔离级别 (高薪常问)
ISOLATION 隔离的意思
① ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别, 使用数据库默认的事务隔离级别。
② ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个 事务未提交的数据。
③ ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才 能被另一事务读取,而且能看到该事务对已有记录的更新。解决脏读问题
④ ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才 能被另一事务读取,但是不能看到该事务对已有记录的更新。行锁
⑤ ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据 库所做的更新。表锁