2020-09-09

请解释 Spring Bean 的生命周期?
(1)实例化 Bean: 对于 BeanFactory 容器,当客户向容器请求一个尚未初始化的 bean 时,或初始化 bean 的时候需要注入另一个尚未初始化的依赖时,容器就会调用 createBean 进行实例化。 对于 ApplicationContext 容器,当容器启动结束后,通过获取 BeanDefinition 对象中的 信息,实例化所有的 bean。
(2)设置对象属性(依赖注入): 实例化后的对象被封装在 BeanWrapper 对象中,紧接着,Spring 根据 BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成依赖注入。
(3)处理 Aware 接口: 接着,Spring 会检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实 例注入给 Bean: ①如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的 setBeanName(String beanId)方法,此处传递的就是 Spring 配置文件中 Bean 的 id 值; ②如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory()方法,传递的是 Spring 工厂自身。 ③如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用 setApplicationContext(ApplicationContext)方法,传入 Spring 上下文;
(4)BeanPostProcessor: 如果想对 Bean 进行一些自定义的处理,那么可以让 Bean 实现了 BeanPostProcessor 接口,那将会调用 postProcessBeforeInitialization(Object obj, String s)方法。由于这个方法是在 Bean 初始化结束时调用的,所以可以被应用于内存或缓 存技术;
(5)InitializingBean 与 init-method: 如果 Bean 在 Spring 配置文件中配置了 init-method 属性,则会自动调用其配置 的初始化方法。
(6)如果这个 Bean 实现了 BeanPostProcessor 接口,将会调用 postProcessAfterInitialization(Object obj, String s)方法; 以上几个步骤完成后,Bean 就已经被正确创建了,之后就可以使用这个 Bean 了。
(7)DisposableBean: 当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个 接口,会调用其实现的 destroy()方法;
(8)destroy-method: 最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调 用其配置的销毁方法。
解释 Spring 支持的几种 bean 的作用域。
Spring容器的bean可以分为5个范围
Singleton,prototype,request,session,global-session
Spring 框架中的单例 Beans 是线程安全的么?
在某种程度上说 Spring 的单例 bean 是线 程安全的。如果你的 bean 有多种状态的话(比如 View Model 对象),就需要自行保证 线程安全
Spring 如何处理线程并发问题?
采用 ThreadLocal 进行处理,解决线程安全问题。
Spring 基于 xml 注入 bean 的几种方式:
(1)Set 方法注入;
(2)构造器注入:①通过 index 设置参数的位置;②通过 type 设置参数类型;
(3)静态工厂注入;
(4)实例工厂
Spring 的自动装配:
,使用 autowire 来配置自动装载模式。
@Autowired 和@Resource 之间的区别
(1) @Autowired 默认是按照类型装配注入的,默认情况下它要求依赖对象必须存 在(可以设置它 required 属性为 false)。
(2) @Resource 默认是按照名称来装配注入的,只有当找不到与名称匹配的 bean 才会按照类型来装配注入。
Spring 框架中都用到了哪些设计模式?
工厂模式:单例模式:代理模式:模板方法:观察者模式
Spring 事务的实现方式和实现原理:
Spring 事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring 是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过 binlog 或者 redo log 实现的。
(1) Spring 事务的种类:
spring 支持编程式事务管理和声明式事务管理两种方式:①编程式事务管理,②声明式事务管理
(2) spring 的事务传播行为:
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当 前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事 务,如果当前不存在事务,就以非事务执行。‘
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入 该事务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都 创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在 事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当 前没有事务,则按 REQUIRED 属性执行
(3) Spring 中的隔离级别:
① ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级 别,使用数据库默认的事务隔离级别。
② ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到 这个事务未提交的数据。
③ ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后 才能被另一事务读取,而且能看到该事务对已有记录的更新。
④ ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后 才能被另一事务读取,但是不能看到该事务对已有记录的更新。
⑤ ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对 数据库所做的更新。
Spring 框架中有哪些不同类型的事件?
Spring 提供了以下 5 种标准的事件:
(1)上下文更新事件(ContextRefreshedEvent):在调用 ConfigurableApplicationContext 接口中的 refresh()方法时被触发。
(2)上下文开始事件(ContextStartedEvent):当容器调用 ConfigurableApplicationContext 的 Start()方法开始/重新开始容器时触发该事件。
(3)上下文停止事件(ContextStoppedEvent):当容器调用 ConfigurableApplicationContext 的 Stop()方法停止容器时触发该事件。
(4)上下文关闭事件(ContextClosedEvent):当 ApplicationContext 被关闭 时触发该事件。容器被关闭时,其管理的所有单例 Bean 都被销毁。
(5)请求处理事件(RequestHandledEvent):在 Web 应用中,当一个 http 请 求(request)结束触发该事件。 如果一个 bean 实现了 ApplicationListener 接口,当一个 ApplicationEvent 被发 布以后,bean 会自动被通知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值