21-撩课-Java面试宝典-第二十一篇

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声明式事务处理的设计体系。

猜你喜欢

转载自blog.csdn.net/lkitlike/article/details/85111864