Spring相关面试题

问题1:Spring Bean的生命周期

实例化 Bean 对象
设置Bean对象Setter
如果通过各种Aware接口声明了依赖关系,则会注入Bean对容器基础设施层面的依赖(Aware接口具体包括BeanNameWare、BeanFactoryAware、ApplicationContextAware,分别注入Bean、ID、Bean Factory或者ApplicationContext)
如果实现了BeanPostProcesser,调用 BeanPostProcesser的前置初始化方法postProcessorBeforeInitiaization
如果实现了InitializingBean接口,则会调用afterPropertiesSet方法
调用自身定义的init方法
调用BeanPostProcessor的后置方法postProcessAfterInitialization
创建完毕
销毁
DisposableBean的destroy方法和Bean自身的destroy方法

问题2:Spring Bean的作用域

Spring Bean有5个作用域,最基础的有两个:

singleton,这是Spring的默认作用域,每个IOC容器创建唯一的一个Bean
prototype,针对每个getBean请求,容器都会单独创建一个Bean实例

在Web容器中还有三种作用域:

request,针对每个Http请求都会创建单独的Bean实例
session,同一个session范围内使用一个Bean
GlobalSession,用于Protlet容器中,提供了一个全局的Http session

问题3: Spring AOP

Spring项目中事务、安全、日志等功能都可以使用AOP技术
AOP Proxy底层基于JDK动态代理或者cglib字节码操作技术,运行时动态生成被调用类型的子类,并实例化代理对象
实际的方法会被代理给响应的代理对象

   核心概念:
Aspect 切面:它横跨多个类,Spring框架创建Advisor来指代它,内部包括切入时机(Pointcut)和切入动作(Advice)
Joint Point,在Spring中只有方法可以作为切入点
Advice,定义切面中采取的动作,指明要做什么,通过Before/After/Around指明什么时候做
Pointcut,具体定义Aspect中使用那些Joint Point

问题4:Spring中的设计模式:

BeanFactory和ApplicationContext应用了工厂模式
在Bean的创建中,Spring提供了单例和原型等模式
AOP领域使用的是代理模式,装饰器模式,适配器模式
事件监听器使用的是观察者模式
类似JdbcTemplate等模板对象,使用的是模板等模式

问题5:谈谈你对SpringMVC的理解

核心组件

DispatcherServlet:作为前端控制器,整个流程的控制中心,控制其他组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性
Handler:(Controller)后端控制器,负责处理请求的控制逻辑
HandlerMapping:映射器对象,用于管理url与对应的controller的映射关系
HandlerAdapter:适配器,主要处理方法参数,相关注解,数据绑定,消息转换,返回值,调用视图解析等等
ViewResolver:视图解析器,解析对应的视图关系

执行流程

一个请求匹配前端控制器DispatcherServlet的请求映射路径
DispatcherServlet接收到请求后,将根据请求信息交给处理器映射器(HandlerMapping)
HandlerMapping 根据用户的url请求查找匹配该url的Handler,并返回一个执行链HandlerExcutionChain
DispatcherServlet 在请求处理器适配器(HandlerAdapter)调用相应的Handler进行处理并返回ModelAndView给DispatcherServlet
DispatcherServlet 将ModelAndView请求ViewReslover(视图解析器)解析,返回具体的View
DispatcherServlet 对View进行渲染视图(即将模型数据填充至视图中)
DispatcherServlet 将页面响应给用户

问题6:Spring事务

隔离级别:

DEFAULT:使用数据库默认的事务隔离级别
READ_UNCOMMITTED:最低级别,允许看到其他事务未提交的数据,会产生脏读、不可重复读、幻读
READ_COMMITTED:只能读取到已提交的数据,可以防止脏读,会产生不可重复读,幻读
REPEATABLE_READ:防止脏读,不可重复读,会产生幻读
SERIALIZABLE:最高级别,事务处理为串行,阻塞的,能避免所有的情况

传播机制:

REQUIRED(默认):支持使用当前事务,如果当前事务不存在,创建一个新事务
SUPPORTS:支持使用当前事务,如果当前事务不存在,则不使用事务
MANDATORY:中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception
REQUIRES_NEW:创建一个新的事务,如果当前事务存在,把当前事务挂起
NOT_SUPPORTED:无事务执行,如果当前事务存在,把当前事务挂起
NEVER:无事务执行,如果当前有事务则抛出Exception
NESTED:嵌套事务,如果当前事务存在,那么在嵌套的事务中执行。如果当前事务不存在,则表现的REQUIRED一样

问题7:SpringIOC

1. 简介:

IOC不是不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松藕性、更优良的程序。传统应用程序都是我们从类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试。有了IOC容器后,把创建对象和查找依赖对象的控制权交给了容器,有容器进行注入组合对象,所以对象和对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序整个体系变得很灵活。

2. 优点:

IOC或依赖注入把应用程序的代码降到最低。它使应用容易测试,单元测试不再需要单例和JDNI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的恶汉式初始化和懒加载

3. 注入方式:

  • 构造器依赖注入:构造器依赖注入通过触发一个类的构造器实现的,改类有一系例参数,每个参数代表一个对其他类的依赖
  • Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参数static工厂方法实例化bean后,调用bean的setter方法,即实现了基于setter的依赖注入