136. 请解释 Spring Bean 的生命周期?
首先说一下 Servlet 的生命周期:
实例化,
初始 init,
接收请求 service,
销毁 destroy;
Spring 上下文中的 Bean 生命周期也类似,
如下:
1. 实例化一个 Bean
也就是我们常说的 new;
2. 按照 Spring 上下文
对实例化的 Bean 进行配置
也就是 IoC 注入;
3. 如果这个 Bean 已经实现了 BeanNameAware 接口,
会调用它实现的
setBeanName(String) 方法,
此处传递的就是 Spring 配置文件中 Bean 的 id 值;
4. 如果这个 Bean 已经实现了 BeanFactoryAware 接口,
会调用它实现的
setBeanFactory(setBeanFactory(BeanFactory)
传递的是 Spring 工厂自身
可以用这个方式来获取其它 Bean,
只需在 Spring 配置文件中
配置一个普通的 Bean 就可以;
5. 如果这个 Bean 已经实现了
ApplicationContextAware 接口,
会调用 setApplicationContext(ApplicationContext) 方法,
传入 Spring 上下文
同样这个方式也可以实现步骤 4 的内容,
但比 4 更好,
因为 ApplicationContext 是 BeanFactory 的子接口,
有更多的实现方法
6. 如果这个 Bean 关联了
BeanPostProcessor 接口,
将会调用
postProcessBeforeInitialization(Object obj, String s) 方法,
BeanPostProcessor
经常被用作是 Bean 内容的更改,
并且由于这个是在 Bean 初始化结束时
调用那个的方法,
也可以被应用于内存或缓存技术;
7. 如果 Bean 在 Spring 配置文件中
配置了 init-method 属性
会自动调用其配置的初始化方法.
8. 如果这个 Bean 关联了 BeanPostProcessor 接口,
将会调用
postProcessAfterInitialization(Object obj, String s) 方法,;
注: 以上工作完成以后就可以应用这个 Bean 了,
那这个 Bean 是一个 Singleton 的,
所以一般情况下
们调用同一个 id 的 Bean 会是
在内容地址相同的实例,
当然在 Spring 配置文件中
也可以配置非 Singleton.
9. 当 Bean 不再需要时,
会经过清理阶段,
如果 Bean 实现了 DisposableBean 这个接口,
会调用那个其实现的 destroy() 方法;
10. 最后,
如果这个 Bean 的 Spring 配置中
配置了 destroy-method 属性,
会自动调用其配置的销毁方法.
另外我们这里描述的是应用 Spring
上下文 Bean 的生命周期,
如果应用 Spring 的工厂
也就是 BeanFactory 的话去掉第 5 步就 Ok 了.
137. 介绍下 Spring 的主要模块?
Spring AOP:
Spring 的关键组件之一是 AOP 框架.
AOP 在 Spring 中使用:
提供声明性的企业服务,
特别是作为 EJB 声明式服务的替代品.
最重要的服务是声明式事务管理,
它建立在 Spring 的事务抽象之上.
允许用户实现自定义的切面,
补充他们使用 AOP 的 OOP 的使用.
Spring ORM:
ORM 包与数据库访问有关.
它为流行的对象关系映射 API 提供集成层,
包括 JDO,Hibernate 和 iBatis.
Spring web:
Web 应用程序开发堆栈,
其中包括 Spring MVC.
Spring DAO:
Spring 的 DAO(Data Access Object)
支持主要用于使用 JDBC,
Hibernate 或 JDO 等
技术标准化数据访问工作.
Spring Context:
此包构建在 bean 包之上,
以增加对消息源的支持和观察者的设计模式支持,
以及应用程序对象使用一致的
API 获得资源的能力.
Spring Web MVC:
这是为 Web 应用程序
提供 MVC 实现的模块.
Spring Core:
核心包是 Spring 框架中最重要的组件.
该组件提供依赖性注入特性.
BeanFactory 提供了一种工厂模式,
它将诸如初始化,
创造和访问对象
与实际程序逻辑的访问分离开来.
138.Spring 事务的种类和各自的区别?
spring 支持
编程式事务管理
声明式事务管理
两种方式:
1. 编程式事务管理使用 TransactionTemplate
或者直接使用底层的 PlatformTransactionManager.
对于编程式事务管理,
spring 推荐使用 TransactionTemplate.
2. 声明式事务管理建立在 AOP 之上的.
其本质是对方法前后进行拦截,
然后在目标方法开始之前创建或者加入一个事务,
在执行完目标方法之后
根据执行情况提交或者回滚事务.
声明式事务最大的优点
就是不需要通过编程的方式管理事务,
这样就不需要在业务逻辑代码中
掺杂事务管理的代码,
只需在配置文件中
做相关的事务规则声明
或通过基于 @Transactional 注解的方式
便可以将事务规则应用到业务逻辑中.
3. 显然声明式事务管理要优于编程式事务管理,
这正是 spring 倡导的非侵入式的开发方式.
声明式事务管理使业务代码不受污染,
一个普通的 POJO 对象,
只要加上注解就可以获得完全的事务支持.
和编程式事务相比,
声明式事务唯一不足地方是,
后者的最细粒度只能作用到方法级别,
无法做到像编程式事务
那样可以作用到代码块级别.
139. 说说 spring 的事务传播行为?
spring 事务的传播行为
说的是当一个方法调用另一个方法时,
事务该如何操作.
1.PROPAGATION_REQUIRED:
如果当前没有事务,
就创建一个新事务,
如果当前存在事务,
就加入该事务,
该设置是最常用的设置.
2.PROPAGATION_SUPPORTS:
支持当前事务,
如果当前存在事务,
就加入该事务,
如果当前不存在事务,
就以非事务执行.'
3.PROPAGATION_MANDATORY:
支持当前事务,
如果当前存在事务,
就加入该事务,
如果当前不存在事务,
就抛出异常.
4.PROPAGATION_REQUIRES_NEW:
创建新事务,
无论当前存不存在事务,
都创建新事务.
5.PROPAGATION_NOT_SUPPORTED:
以非事务方式执行操作,
如果当前存在事务,
就把当前事务挂起.
6.PROPAGATION_NEVER:
以非事务方式执行,
如果当前存在事务,
则抛出异常.
7.PROPAGATION_NESTED:
如果当前存在事务,
则在嵌套事务内执行.
如果当前没有事务,
则执行与 PROPAGATION_REQUIRED 类似的操作.
140.Spring 事务的实现方式和实现原理
1. 划分处理单元 --IoC:
由于 spring 解决的问题是
对单个数据库进行局部事务处理的,
具体的实现首相用 spring 中的 IoC
划分了事务处理单元.
并且将对事务的各种配置
放到了 IoC 容器中
设置事务管理器,
设置事务的传播特性及隔离机制.
2.AOP 拦截需要进行事务处理的类:
Spring 事务处理模块
是通过 AOP 功能来实现声明式事务处理的,
具体操作
比如事务实行的配置和读取,
事务对象的抽象,
用 TransactionProxyFactoryBean 接口
来使用 AOP 功能,
生成 proxy 代理对象,
通过 TransactionInterceptor 完成
对代理方法的拦截,
将事务处理的功能
编织到拦截的方法中.
读取 IoC 容器事务配置属性,
转化为 spring 事务处理
需要的内部数据结构
TransactionAttributeSourceAdvisor
转化为 TransactionAttribute 表示的数据对象.
3. 对事物处理实现
事务的生成, 提交, 回滚, 挂起:
spring 委托给具体的事务处理器实现.
实现了一个抽象和适配.
适配的具体事务处理器:
DataSource 数据源支持,
hibernate 数据源事务处理支持,
JDO 数据源事务处理支持,
JPA,JTA 数据源事务处理支持.
这些支持都是通过设计 PlatformTransactionManager,
AbstractPlatforTransaction
一系列事务处理的支持.
为常用数据源支持提供了
一系列的 TransactionManager.
结合:
PlatformTransactionManager 实现了
TransactionInterception 接口,
让其与 TransactionProxyFactoryBean 结合起来,
形成一个 Spring 声明式事务处理的设计体系.
来源: http://www.jianshu.com/p/0ac5bd653018