Java经典面试题十:Spring/Spring MVC

问题一:为什么使用Spring?

Spring是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的容器框架,使用基本的JavaBean代替EJB(企业Java Beans),并提供了很多的企业应用功能,解决了企业应用开发的复杂性。

主要优点:

  1. 轻量:
    spring框架的大小可以在只有1M多的JAR文件里发布,而且所需开销也很小。spring是非侵入式的,spring应用中的对象不依赖于spring的特点定类。资源占用少、部署简单。
  2. 控制反转:
    IOC技术,松耦合。一个对象依赖的其他对象会通过被动的方式传递进来,而不是对象本身自己创建或查找依赖对象。可以认为IOC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时主动将依赖传递给它。
    注:JNDI,Java命名和目录接口,是sun公司提供的一套标准的Java命名系统接口,是用于从Java应用程序中访问命名服务和目录服务的一组API。命名服务即将名称与对象关联,以便能通过相应的名称访问这些对象,而目录服务即其对象具有属性及名称的命名服务。
  3. 面向切面:
    允许通过分离应用的业务逻辑与系统级服务(事务管理等)进行内聚性开发。应用对象只负责完成业务逻辑,不负责其他系统级关注点,如日志或事务支持。
  4. 容器:
    Spring包含并管理应用对象的配置和生命周期,可以当作一个容器,可以配置每个bean如何被创建——基于一个可配置原型prototype,bean可以创建一个单独实例或每次生成一个新的实例——以及他们如何相互关联。

Spring可以将简单的组件配置、组合称为复杂的应用。在Spring中,应用对象被声明式地组合,典型的是在一个xml文件里。spring还提供了很多基础功能,事务管理、持久化框架集成、MVCJNDI、JDBC层抽象。

问题二:什么是aop?

面向切面编程,可以说是oop的补充与完善。oop引入封装、继承、多态的概念建立一个对象层次结构,用来模拟公告行为的一个集合。当我们需要为分散的对象引入公告行为时,oop就有点力不从心。oop适合从上到下的关系,不适合从左到右的关系。如日志功能,日志通常水平散布在所有对象层次中,而且与其对象的核心功能无关。类似的还有安全性、异常处理等。这种散布在各处无关的代码称为横切代码。

AOP技术将那些影响多个类的公告行为封装到一个可重用模块,并命名为aspect。简单来说,aspect就是将那些与业务无关,却被业务模块共用的代码封装起来,减少系统重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

AOP将软件系统分为两个部分:核心关注点和横切关注点。业务主要负责处理核心关注点,而横切关注点,如权限认证、事务、日志,经常发生在核心关注点多处,且基本相似。AOP的作用就是分离核心关注点和横切关注点。

问题三:什么是IOC?

Inversion of Controller,控制反转。
对于面向对象设计及编程的基本思想,简单来说就是把复杂系统分解成相互合作的对象,这些对象进行封装后,内部实现对外部是透明的,从而降低解决问题的复杂度,而且可以灵活的被重用和扩展。

IOC理论提出的观点:借助于第三方实现具有依赖关系的对象之间的解耦。
在这里插入图片描述
由于第三方的关系,也就是IOC,A、B、C、D四个对象没有了耦合关系,全部对象的控制权都交给了第三方,IOC也就成了整个系统的关键核心,IOC也就类似粘合剂的作用。

在没有引入IOC容器之前,对象A依赖与对象B,如果A在初始化或运行到某一步时,就必须去主动创建对象B。而引入IOC之后,A和B就失去了联系,所以当A再需要B时,IOC容器会主动创建一个对象B注入A。
可以看出,对象A获得依赖对象B的过程由主动变成被动,控制权反转了。

问题四:Spring有哪些模块?

Java经典面试题十:Spring/Spring MVC_第1张图片
Spring已经集成了20多个模块,主要分为:核心容器、数据访问/集成、web、AOP、工具、消息和测试

  1. Spring Core
    框架的最基础部分,提供 IoC 容器,对 bean 进行管理。

2.Spring Context
基于 bean,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。

3.Spring DAO
提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码,还提供了声明性事务管理方法。

4.Spring ORM
提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate、MyBatis 等。

5.Spring AOP
提供了符合AOP Alliance规范的面向方面的编程实现。

6.Spring Web
提供了基础的 Web 开发的上下文信息,可与其他 web 进行集成。

7.Spring Web MVC
提供了 Web 应用的 Model-View-Controller 全功能实现。

问题五:Spring常用的注入方式有哪些?

Spring通过依赖注入实现控制反转

  1. 构造方法注入
  2. setter注入
  3. 注解注入

问题六:Spring中的bean是线程安全的吗?

Spring本身并不提供bean的线程安全策略,可以说Spring中的bean不具备线程安全的特性,但具体情况还要结合scope分析。

Spring 的 bean 作用域(scope)类型
  1、singleton:单例,默认作用域。

2、prototype:原型,每次创建一个新对象。

3、request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。

4、session:会话,同一个会话共享一个实例,不同会话使用不用的实例。

5、global-session:全局会话,所有会话共享一个实例。
线程安全问题,就要从单例和原型bean说明
原型bean不会有线程安全问题,单例如果是无状态bean,也不会有。

问题七:Spring支持几种bean的作用域?

  • singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
  • prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
  • request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
  • session:对于每次HTTP Session,使用session定义的Bean都将产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
  • globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。

问题八:Spring自动装配bena有哪些方式?

spring中bean装配有两种方式:
1.隐式的bean发现机制和自动装配
2.在java代码或者XML中进行显示配置

在xml进行显示配置,用bean标签;
在Java中进行显示配置,通过@Configuration@Bean;

隐式配置分为两步,组件扫描(ComponentScan)和自动装配(Autowired)
@ComponentScan作用是扫描带有@Component注解的类,并为其创建bean。默认是扫描同一包下的类,当然也可以加入参数,指定包名。

如@ComponentScan(basePackages={“com.zcs”})或者@ComponentScan(basePackageClasses={CDPlayer.class,DVDPlayer.class})(即这些类所在的包)

@Autowired满足自动依赖装配,可以作用在任何方法上面。

问题九:Spring实现事务的方式?

  • 编程式事务,在代码中调用beginTransaction()、commit()、rollback()方法
  • 基于 TransactionProxyFactoryBean 的声明式事务管理,在spring配置文件,添加事务管理器 DataSourceTransactionManager 和事务代理类 TransactionProxyFactoryBean
  • 基于注解 @Transactional 的声明式事务管理,在方法添加注解 @Transactional(rollbackFor=RuntimeException.class) 出现 RuntimeException 回滚,修改 spring 配置文件,开启 spring 的事务注解能力
  • 基于 Aspectj AOP 配置(注解)事务,修改 spring 配置文件,织入切面。

问题十:说一下Spring的事务隔离?

事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度,当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,就可能发生以下问题
什么是事务:
事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败.

事务特性(4种):
原子性 (atomicity):强调事务的不可分割.
一致性 (consistency):事务的执行的前后数据的完整性保持一致.
隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
持久性(durability) :事务一旦结束,数据就持久到数据库

如果不考虑隔离性引发安全性问题:
脏读 :一个事务读到了另一个事务的未提交的数据
不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致.
虚幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.

解决读问题: 设置事务隔离级别(5种)
DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生
已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
串行化的 (serializable) :避免以上所有读问题.
Mysql 默认:可重复读
Oracle 默认:读已提交

问题十一:spring mvc运行流程?

Java经典面试题十:Spring/Spring MVC_第2张图片

  • 用户向服务器发送请求,请求被Spring前端控制器ServletDispatcherServlet捕获;

  • DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

  • DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter;(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)

  • 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
    HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

    数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

    数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

    数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

  • Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

  • 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

  • ViewResolver 结合Model和View,来渲染视图;将渲染结果返回给客户端。

问题十二:spring mvc有哪些组件?

  • DispatcherServlet:中央控制器,把请求给转发到具体的控制类
  • Controller:具体处理请求的控制器
  • HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略
  • ModelAndView:服务层返回的数据和视图层的封装类
  • ViewResolver:视图解析器,解析具体的视图
  • Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作

问题十三:@RequestMapping的作用是什么?

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径

问题十四:@Autowired的作用是什么?

@Autowired是用在JavaBean中的注解,通过byType形式,用来给指定的字段或方法注入所需的外部资源。
Java经典面试题十:Spring/Spring MVC_第3张图片

你可能感兴趣的:(面试,spring,编程语言,java,数据库)