Spring经典面试题

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”,就可以实现让结果转发
    1. 转发是服务器行为
    2. 转发的地址栏不变,只做了一次请求
    3. 可以共享request里的数据
  • 在返回值的前面加上”redirect”,就可以让返回值重定向
    1. 重定向是客户端行为
    2. 地址栏发生改变,做了最少两次请求
    3. 不可以共享request里的数据

二十一 Spring MVC的优点

  • 简单好用,便于维护

  • 一:完全基于接口编程,真正实现了视图无关。

    二:Spring MVC框架以DispatchServlet为核心控制器,该控制器负责拦截用户的所有请求

    三:具有强大的灵活性、非侵入性和可配置型。

    四:分工明确,包括控制器、验证器、命令对象、模型对象、处理程序映射视图解析器,等等,每一个功能实现由一个专门的对象负责完成。

    五:实现更加灵活的模型数据传输

二十二 ResquestBody,ResponseBody

  • RequestBody:把请求的值转换成json串

  • ResponseBody:把返回的结果转换成json串

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值