Spring经典面试题
一 Spring框架的理解
Spring 是一个企业级的开源框架,在项目中充当容器的角色,可以整合第三方的框架如Mybatis,Struts2
-
两大重要的部分,IOC和AOP
IOC就是把对象的创建权反转给spring容器进行管理
AOP,面向切面编程,就是在不增加原有代码的基础上,去增加新的功能;比如过滤器,拦截器,声明式事务
二 Spring的优点
降低了层与层之间的耦合度
- 集成其他框架
- 低侵入式设计,代码污染级别
- Spring的DI机制降低了业务对象替换的复杂性,提高了软件之间的解耦
- Spring AOP支持将一些通用的任务进行集中式的管理,例如:安全,事务,日志等,从而使代码能更好的复用
三 什么是控制反转(IOC),什么是依赖注入(DI)
- IOC:就是对象之间的依赖关系由容器来创建,对象之间的关系本来是由我们开发者自己创建和维护的,在我们使用Spring框架后,对象之间的关系由容器来创建和维护,将开发者做的事让容器做,这就是控制反转BeanFactory接口是Spring Ioc容器的核心接口
- DI:我们在使用Spring容器的时候,容器通过调用set方法或者是构造器来建立对象之间的依赖关系
- 控制反转是目标,依赖注入是我们实现控制反转的一种手段
四 Java中实现依赖注入的三种方式
- 带参数的构造方法,构造器注入
- 属性的set方法
- 注解自动装配
- 接口注入
五 Spring容器中如何创建对象?
通过工厂创建对象
- 无参构造创建
- 静态工厂创建
- 实例工厂创建
六 Spring有几种配置方式
-
基于XML文件的配置 这种配置文件的格式常用开头,然后运用一系列的bean定义和专门的应用配置选项组成。 Spring XML配置方式是使用被Spring命名空间所支持的一些列XML的标签来实现的。
-
基于注解的配置 可以使用注解的方式来代替XML方式的bean元素的配置。这就是组件扫描,常用依赖注入的一些注解有:@Controller @Service @Autowired @RequestMapping @RequestParam @Resource @Required @Qualifier
组件扫描: 容器会扫描base-package指定的包及其子包下面的所有类,如果该类有一些特定的注解,则纳入容器进行管理。
-
在类前面添加的一些特定的注解: @Component 通用注解 @Repository 持久层注解 @Service 业务层注解、 @Controller 控制层注解
七 Spring Bean的生命周期
指Spring中bean元素被实例化和被销毁的过程
- 通过init-method属性指定初始化方法; 通过destroy-method方法指定销毁方法。
注意:只有作用域为Singleton的时候才会有效
八 解释什么叫延迟加载
先从单表查询,如果有别的需求,再从关联表中进行关联查询,提高数据库的检索性能
- 默认情况下,容器启动之后会将所有作用域为单例的bean创建好;但是有的业务场景我们并不需要它提前都创建好;此时,我们可以在bean中设置lzayLoadingEnable=“true”,这样,当容器启动之后,作用域为单例的bean,就不在创建
九 解释什么是自动装配
根据属性的类型,spring会自动的创建实例对象
-
自动装配就是把ioc容器中已经有的对象,通过@Autowired注解对需要对象进行自动装配**。**
就是将一个Bean注入到其它的Bean的Property中,默认情况下,容器不会自动装配,需要我们手动设定。Spring 可以通过向Bean Factory中注入的方式来搞定bean之间的依赖关系,达到自动装配的目的
十 Spring bean元素的作用域
当通过Spring容器创建一个Bean实例的时候,不仅可以完成bean实例的实例化(),还可以为bean指定作
用域。
Spring bean元素的常用作用域:
- Singleton:单例模式,在整个spring IOC容器中,使用singleton定义的bean将只有一个实例。
- Prototype:多例模式,每次通过容器中的getBean方法获取prototype定义的beans时,都会产生一个新的bean的实例。
- Request:对于每次Http请求,使用request定义的bean都会产生一个新的实例,只有在web应用时候,该作用域才会有效。
- Session:对于每次Http Session,使用session定义的Bean都将产生一个新的实例
十一 Spring中的bean是线程安全的么
Spring框架并没有对单例的bean进行多线程的封装处理,线程安全问题和并发问题,需要我们开发者自己考虑
十二 如何在Spring中注入一个Java Collection
Spring提供理论四种集合类的配置元素:
• http://www.cnblogs.com/shamo89/p/9916475.html
-
List: 该标签用来装配有重复值的list值
-
set: 该标签用来装配没有重复值的set值
-
map:该标签科以用来注入键值对
-
properties: 该标签用来支持注入键值对和字符串类型键值对
十三 Spring框架中都用了哪些设计模式
- 代理模式,在AOP中被使用最多
- 单例模式,在Spring配置文件中定义bean的时候默认的是单例模式
- 工厂模式,BeanFactory用来创建对象的实例
十四 Spring AOP(面向切面)编程的原理
AOP面向切面编程,它是一种思想。简单点说就是在不改变原有代码的基础上额外添加新功能的操作,比如spring对事物的统一管理,可以采用声明式事物配置方式来实现AOP切面编程
十五 解释一下代理模式(Proxy)
代理模式就是本该我做的事,我不做,我交给代理人去完成。就比如,我生产了一些产品,我自己不卖,我委托代理商帮我卖,让代理商和顾客打交道,我自己负责主要产品的生产就可以了
代理模式的使用,需要有本类,和代理类,本类和代理类共同实现统一的接口。然后在main中调用就可以了。本类中的业务逻辑一般是不会变动的,在我们需要的时候可以不断的添加代理对象,或者修改代理类来实现业务的变更
代理模式可以分为:
-
静态代理
优点:可以做到在不修改目标对象功能的前提下,对目标功能扩展
缺点:因为本来和代理类要实现统一的接口,所以会产生很多的代理类,类太多,一旦接口增加方法,目标对象和代理对象都要维护
-
动态代理(JDK代理/接口代理) 代理对象,不需要实现接口,代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象,需要我们指定代理对象/目标对象实现的接口的类型
-
Cglib代理 特点: 在内存中构建一个子类对象,从而实现对目标对象功能的扩展
十六 什么是Spring MVC
基于模型视图控制层的mvc设计模式
-
Spring MVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一部分,它和Struts2一样都属于表现层的框架
-
MVC(Model模型 View 视图 Controller 控制器):这是一种软件架构思想,是一种开发模式,将软件划分为三种不同类型的模块,分别是模型,视图,和控制器
模型:用于封装业务逻辑处理(java类);
视图:用于数据展现和操作界面(Servlet);
控制器:用于协调视图和模型(jsp);
-
处理流程:视图将请求发送给控制器,由控制器选择对应的模型来处理;模型将处理结果交给控制器,控制器选择合适的视图来展现处理结果;
十七 Spring MVC的五大组键
- 前端控制器 //什么都不干,只是转发。
- 处理器映射器 //处理前端发送的url
- 处理器适配器 //找真正干活的处理器
- 处理器 //处理业务
- 视图解析器 //解析视图
十八 Spring MVC的运行原理
- 客户端发送请求,提交给前端控制器
- 前端控制器根据url找到处理器映射器
- 处理器映射器找处理器适配器,执行相应的controller
- 根据controller返回的结果执行视图解析器
- 视图解析器实现页面的渲染和显示
十九 SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?
默认是单例模式
所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能
解决方案是在控制器里面不能写成员变量
二十 SpringMVC怎样设定重定向和转发
- 在返回值的前面加”forword”,就可以实现让结果转发
- 转发是服务器行为
- 转发的地址栏不变,只做了一次请求
- 可以共享request里的数据
- 在返回值的前面加上”redirect”,就可以让返回值重定向
- 重定向是客户端行为
- 地址栏发生改变,做了最少两次请求
- 不可以共享request里的数据
二十一 Spring MVC的优点
-
简单好用,便于维护
-
一:完全基于接口编程,真正实现了视图无关。
二:Spring MVC框架以DispatchServlet为核心控制器,该控制器负责拦截用户的所有请求
三:具有强大的灵活性、非侵入性和可配置型。
四:分工明确,包括控制器、验证器、命令对象、模型对象、处理程序映射视图解析器,等等,每一个功能实现由一个专门的对象负责完成。
五:实现更加灵活的模型数据传输
二十二 ResquestBody,ResponseBody
-
RequestBody:把请求的值转换成json串
-
ResponseBody:把返回的结果转换成json串