SSM最新面试题

SSM_3大框架面试题集

  1. 何为Spring Bean容器?Spring Bean容器与Spring IOC容器有什么不同吗?★★★

答:用于创建Bean对象,管理Bean对象的容器,Spring IOC容器本质上指的就是Spring Bean容器,Spring Bean容器中最核心的机制是IOC机制(控制反转),所以有时候又将Spring Bean容器称之为Spring IOC容器。

  1. Spring IOC如何理解?★★★

答:IOC是Spring中提供一种控制反转机制,目的是将我们项目中对象的依赖管理交给Spring实现,这样可以更好实现对象关系的解耦,提高程序的可扩展性。

  1. Spring DI如何理解?★★★

答:DI是Spring中的依赖注入机制,IOC的实现需要借助这种机制,我们通常会这样理解,Spring Bean容器中的IOC思想是一种目标,而DI是实现这种思想目标的手段。

  1. Spring中基于注解如何配置对象的作用域?以及如何配置延迟加载机制?★

答:@Scope(“singleton”)

@Scope(“prototype”)

@Lazy(value=true)

  1. Spring工厂底层构建Bean对象借助什么机制?当对象不使用时要释放资源,目的是什么?何为内存泄漏?★★★★

答:借助反射机制,目的是防止内存泄漏;对象已经不使用了但还占用着内存,这种现象称之为内存泄漏,内存泄漏不是内存溢出,但是它是内存溢出的一个导火索,内存溢出可直接导致系统崩溃。

  1. 描述Spring MVC处理流程以及应用优势。★★★★
    1. 客户端发出一个HTTP请求给WEB服务器,WEB服务器对HTTP请求进行解析,如果匹配前端控制器(Dispatcher Servlet)的请求映射路径,WEB容器将请求转交给Dispatcher Servlet。
    2. Dispatcher Servlet接收到这个请求之后将根据请求的信息以及处理器映射器(Handler Mapping)的配置找到处理请求的处理器(Handler)。
    3. 由具体的处理器适配器(Handler Adapter)对Handler进行具体的调用。
    4. Handler对数据处理完成后将返回一个ModelAndView对象给Dispatcher Servlet。
    5. Dispatcher Servlet通过视图解析器(ViewResolver)将ModelAndView转化为真正的视图View。
    6. Dispatcher Servlet通过Model解析出ModelAndView中的参数进行解析,最终展现出完整的View并返回给客户端。

  1. Spring中的事务处理方式以及优缺点。★★★★

答:优点在于:

1:能够实现全局事务的控制,通过EJB、CMT进行事物的管理。

2:能够保证项目模块在系统中完成的功能是可控制的操作(AOP)。

缺点在于:

1:Spring中的事物声明有编程式事物和申明是事物。

  1. MyBatis应用中#与$有什么异同点?★★

相同点:都是通过get来获取值。

不同点:$传进去的字符串不带引号,#号带引号。

  1. MyBatis应用动态SQL解决了什么问题?★★★

答:有时候固定的SQL语句不能满足我们的应用需求,这个时候需要在此基础上建立动态的查询语句。

MyBatis提供了多种注解,可以提供动态查询语言。

比如说在开发的时候,遇到这样的场景:界面提供了多种查询,但是都是非必填写,在选择查询条件时可以选中任意几种组合作为查询条件,如果在使用JDBC的时候,需要判断参数为空,自己组装SQL,但MyBatis提供动态SQL机制,避免了此类问题。

  1. Shiro框架权限管理时的认证和授权流程描述。★★★

答:Shiro权限控制流程:

应用代码→调用Subject(Shiro的Subject代表当前登录的用户)控制权限→Subject在Shiro框架内部调用SecurityManager安全管理器→安全管理器调用Realm(程序和安全数据连接器)。

Subject要进行任何操作,都必须要调用安全管理器(对我们来说是自动的),而安全管理器会调用指定的Realms对象,来连接安全数据。

Realms用来编写安全代码逻辑和访问安全数据,是连接程序和安全数据的桥梁。

  1. BeanFactory和ApplicationContext有什么区别?★★

答:BeanFactory可以理解为含有Bean集合的工厂类,BeanFactory包含了Bean的定义信息,以便在接收到客户端请求时将对应的Bean实例化。

BeanFactory还能在实例化对象的时候生成协作类之间的关系,此举将Bean自身与Bean客户端的配置中解放出来,BeanFactory还包含了Bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。

从表面上看,ApplicationContext如同BeanFactory一样具有Bean定义、Bean关联关系的设置,根据请求分发Bean的功能,但ApplicationContext在此基础上还提供了其他的功能。

  1. 请解释Spring Bean的生命周期。★★★

答:SpringBean的生命周期简单易懂,在一个Bean实例被初始化时,需要执行一系列的初始化操作,以达到可用状态。同样的,当一个Bean不在被调用时需要进行相关的解析操作,并从Bean容器中移除。

Spring Bean Factory负责管理在Spring容器中被创建的Bean的生命周期,Bean的生命周期由两组回调(Call back)方法组成。

初始化之后调用的回调方法和销毁之前调用的回调方法。

Spring框架提供了以下四种方式来管理Bean的生命周期:

InitializingBean和DisposableBean回调接口
针对特殊行为的其他Aware接口

Bean配置文件中的Custom init()方法和destroy()方法

@PostConstruct和@PreDestroy注解方式

//使用customInit()和 customDestroy()方法管理bean生命周期的代码样例如下

       init-method="customInit" destroy-method="customDestroy">

  1. Spring Bean的作用域之间有什么区别?★★

答:Spring容器中的Bean可以分为5个范围,所有范围的名称都是有说明的,但是为了避免混淆,还是让我们来解释一下。

singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。

prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。

request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。

global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。

全局作用域与Servlet中的session作用域效果相同。

  1. 在Spring AOP中,关注点和横切关注的区别是什么?★★

答:关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用;比如日志,安全和数据传输,几乎应用的每个模块都需要的功能,因此这些都属于横切关注点。

  1. 使用Spring框架的好处是什么?★★★★

答:轻量:Spring是轻量的,基本的版本约2MB。

控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。

面向切面编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。

容器:Spring包含并管理应用中对象的生命周期和配置。

MVC框架:Spring的WEB框架是一个精心设计的框架,是WEB框架的一个很好的替代品。

事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。

异常处理:Spring提供方便的API把具体技术相关的异常(比如JDBC,Hibernate or JDO抛出的)转化为一致的unchecked异常。

  1. Spring中用到了哪些设计模式?★★★★★

答:Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的:

代理模式:在AOP和remoting中被用的比较多。

单例模式:在Spring配置文件中定义的Bean默认为单例模式。

模板方法:用来解决代码重复的问题,比如:RestTemplate、JmsTemplate、JpaTemplate。

工厂模式:BeanFactory用来创建对象的实例。

适配器:Spring AOP。

装饰器:Spring Data hashmapper。

观察者:Spring时间驱动模型。

回调:Spring ResourceLoaderAware回调接口。

  1. Spring如何保证Controller并发安全问题?★★

Spring多线程请求过来调用的Controller对象都是一个,而不是一个请求过来就创建一个Controller对象。

并发安全?原因就在于Controller对象是单例的,那么如果不小心在类中定义了类变量,那么这个类变量是被所有请求共享的,这可能会造成多个请求修改该变量的值,出现与预期结果不符合的异常。

那有没有办法让Controller不以单例而以每次请求都重新创建的形式存在呢

答案是当然可以,只需要在类上添加注解@Scope(“prototype”)即可,这样每次请求调用的类都是重新生成的(每次生成会影响效率)。

虽然这样可以解决问题,但增加了时间成本,总让人不爽,还有其他方法吗?答案是肯定的!

使用ThreadLocal来保存类变量,将类变量保存在线程的变量域中,让不同的请求隔离开来。

  1. 使用Spring框架的好处是什么?★★★★(重复)

答:轻量:Spring是轻量的,基本的版本约2MB。

控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。

面向切面编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。

容器:Spring包含并管理应用中对象的生命周期和配置。

MVC框架:Spring的WEB框架是一个精心设计的框架,是WEB框架的一个很好的替代品。

事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。

异常处理:Spring提供方便的API把具体技术相关的异常(比如JDBC,Hibernate or JDO抛出的)转化为一致的unchecked异常。

  1. 在Spring中如何注入一个Java集合?★★

答:Spring提供以下几种集合的配置元素:

类型用于注入一列值,允许有相同的值。

类型用于注入一组值,不允许有相同的值。

类型用于注入一组键值对,键和值都可以为任意类型。

类型用于注入一组键值对,键和值都只能为String类型。

  1. Spring支持的事务管理类型。★★★

答:Spring支持如下两种方式的事务管理

编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。

声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。

  1. Spring框架的事务管理有哪些优点?★★★

答:Spring为不同的事务API(如JTA、JDBC、Hibernate、JPA和JDO)提供了统一的编程模型。

Spring为编程式事务管理提供了一个简单的API而非一系列复杂的事务API(如JTA)。

Spring支持声明式事务管理。

Spring事务管理可以和多种数据访问技术很好的融合。

  1. Spring MVC的主要组件有哪些?★★★★★

答:前端控制器DispatcherServlet(不需要程序员开发)

作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet就减少了其他组件之间的耦合度。

处理器映射器HandlerMapping(不需要程序员开发)

作用:根据请求的URL来查找Handler。

处理器适配器HandlerAdapter

注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。

处理器Handler(需要程序员开发)

视图解析器ViewResolver(不需要程序员开发)

作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)

视图View(需要程序员开发jsp)

View是一个接口,它的实现类支持不同的视图类型(jsp、freemarker、pdf等)

  1. Spring MVC怎么和AJAX项目调用?★★★★

答:通过Jackson框架就可以把Java里面的对象直接转化成JS可以识别的Json对象,具体步骤如下:

加入Jackson.jar

在配置文件中配置Json的映射

在接受Ajax方法里面可以直接返回Object、List等,但方法前面要加上。

  1. MyBatis中#和$的区别?★(重复)

#{}是预编译处理,${}是字符串替换;

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

Mybatis在处理${}时,就是把${}替换成变量的值,相当于字符串拼接;

使用#{}可以有效的防止SQL注入,提高系统安全性。

  1. MyBatis的缓存机制,一级、二级分别解释一下。★★★★★

答:一级缓存:

默认开启;

SqlSession级别的缓存,实现在同一个会话中数据的共享;

一级缓存的生命周期和SqlSession一致;

当有多个SqlSession或者分布式环境下,数据库与操作会引起脏读。

二级缓存:

默认不开启,需要手动开启;

SqlSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量;

可自定义存储源,如Ehcache;

当开启缓存后,数据查询的执行流程是:二级缓存→一级缓存→数据库;

不同于一级缓存,二级缓存可设置是否允许刷新和刷新频率实现;

实体类实现序列化,在mapper文件中开启

在配置文件中设置cacheEnabled为true。

  1. Spring MVC与Struts2的区别?★★

答:SpringMVC的入口是一个Servlet,即前端控制器,而Struts2入口是一个Filter过滤器;

SpringMVC是基于方法开发,传递参数是通过方法形参,可以设计为单例或多例(建议单例),Struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

  1. MyBatis的基本工作流程。★★★★★

答:One:读取配置文件,配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径。

Two:有了这些信息就能创建SqlSessionFactory,SqlSessionFactory的生命周期是程序级,程序运行时建立,程序结束时消亡。

Three:SqlSessionFactory建立SqlSession,目的是执行SQL语句,SqlSession是过程级,一个方法中建立,方法结束应该关闭。

Four:当用户使用mapper.xml文件中配置的方法时,MyBatis首先会解析SQL动态标签为对应数据库SQL语句的形式,并将其封装进MapperStatement对象,然后通过Executor将SQL注入数据库执行,并返回结果。

Five:将返回的结果通过映射,包装成Java对象。

  1. 什么是MyBatis的接口绑定,有什么好处?★★★

答:接口映射就是在MyBatis中任意定义接口,然后把接口里的方法和SQL语句绑定,我们通过直接调用接口方法,例如:

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//这样比原来SqlSession提供的方法,例如:

List countryList = sqlSession.selectList(“selectAll”);

//我们可以有更加灵活的选择和设置

注意:One:Mapper.xml文件的namespace属性必须配置为接口的全限定名称,接口中方法与Mapper.xml中的