SSH面试题及答案(23道常见必考题解析)

SSH面试题及答案(23道常见必考题解析)-mikechen

SSH面试题是Java面试经常涉及的部分,今天给大家总结了一份SSH面试题及答案@mikechen

Spring体系结构

Spring框架至今已集成了20多个模块,这些模块分布在以下模块中:

  • 核心容器(Core Container)
  • 数据访问/集成(Data Access/Integration)层
  • Web层
  • AOP(Aspect Oriented Programming)模块
  • 植入(Instrumentation)模块
  • 消息传输(Messaging)
  • 测试(Test)模块

Spring体系结构如下图:

SSH面试题及答案(23道常见必考题解析)-mikechen

 

Spring框架的好处是什么?

  •  轻量:Spring是轻量的,基本的版本大约2MB。
  •  控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
  •  面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
  •  容器:Spring包含并管理应用中对象的生命周期和配置。
  •  MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
  •  事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
  •  异常处理:Spring提供方便的API把具体技术相关的异常(比如由JDBC,HibernateorJDO抛出的)转化为一致的unchecked异常。

 

Spring七大功能模块

Spring有七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Context。

 

怎么理解IOC?

IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。

IOC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。

传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试,有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,如下图所示:
SSH面试题及答案(23道常见必考题解析)-mikechen

上图引入了IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器。

所以,IOC借助于“第三方”实现具有依赖关系的对象之间的解耦,使程序更优良。

 

IOC的实现原理

IOC容器其实就是一个大工厂,它用来管理我们所有的对象以及依赖关系。

  • 原理就是通过 Java 的反射技术来实现的,通过反射我们可以获取类的所有信息(成员变量、类名等等等);
  • 再通过配置文件(xml)或者注解来描述类与类之间的关系。

这样我们就可以通过这些配置信息和反射技术来构建出对应的对象和依赖关系了,如下图所示:

SSH面试题及答案(23道常见必考题解析)-mikechen

 

SpringBean的生命周期?

Spring中每个Bean的生命周期如下,主要分为以下8大步骤:

SSH面试题及答案(23道常见必考题解析)-mikechen

  •   Spring容器从XML文件中读取bean的定义,并实例化bean。
  •  Spring根据bean的定义填充所有的属性。
  •  如果bean实现了BeanNameAware接口,Spring传递bean的ID到setBeanName方法。
  •  如果Bean实现了BeanFactoryAware接口,Spring传递beanfactory给setBeanFactory方法。
  •  如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。
  •  如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。
  •  如果有BeanPostProcessors和bean关联,这些bean的postProcessAfterInitialization()方法将被调用。
  •  如果bean实现了DisposableBean,它将调用destroy()方法。

 

怎么理解AOP?

AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。

面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术,如下图所示:
SSH面试题及答案(23道常见必考题解析)-mikechen
AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。

 

Spring AOP的实现原理

Spring的AOP实现原理其实很简单,就是通过动态代理实现的。

Spring AOP 采用了两种混合的实现方式:JDK 动态代理和 CGLib 动态代理。

  • JDK动态代理:Spring AOP的首选方法。 每当目标对象实现一个接口时,就会使用JDK动态代理。目标对象必须实现接口
  • CGLIB代理:如果目标对象没有实现接口,则可以使用CGLIB代理。

 

AOP的应用场景

比如典型的AOP的应用场景:
SSH面试题及答案(23道常见必考题解析)-mikechen

  • 日志记录
  • 事务管理
  • 权限验证
  • 性能监测

AOP可以拦截指定的方法,并且对方法增强,比如:事务、日志、权限、性能监测等增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离。

 

Spring支持的事务管理类型

Spring支持两种类型的事务管理:

  • 编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
  • 声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。

 

Spring事务支持的隔离级别

Spring 事务上提供以下的隔离级别:

  •  ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别
  •  ISOLATION_READ_UNCOMMITTED : 允许读取未提交的数据变更,可能会导致脏读,幻读或不可重复读
  •   ISOLATION_READ_COMMITTD : 允许读取为提交数据,可以阻止脏读,当时幻读或不可重复读仍可能发生
  •   ISOLATION_REPEATABLE_READ: 对统一字段多次读取结果是一致的,除非数据是被本事务自己修改.可以阻止脏读,不可重复读,但幻读可能发生
  •  ISOLATION_SERIALIZABLE : 完全服从ACID

Struts的工作原理?

谈到Struts就不得不提到MVC设计模式,MVC即Model-View-Controller的缩写,它是web应用当中的常用的设计模式。

具体如下图所示:

SSH面试题及答案(23道常见必考题解析)-mikechen

MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化,Struts是MVC的一种实现。

1)控制(Controller)

在Struts中ActionServlet起着一个控制器(Controller)的作用,这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点,它截取和分发这些请求到相应的动作类,这些动作类都是Action类的子类。

另外控制组件也负责用相应的请求参数填充 Action Form,通常称之为FromBean,并传给动作类:通常称之为ActionBean。

动作类实现核心商业逻辑,所有这些控制逻辑利用Struts-config.xml文件来配置。

 

2)视图(JSP)

主要是由Jsp来控制页面输出的。它接收到Action Form中的数据,利用html,taglib,bean,logic等显示数据。

 

3)模型(JavaBean)

在Struts中,主要存在三种bean,分别是:Action,ActionForm,EJB或者Java Bean。ActionForm用来封装客户请求信息,Action取得ActionForm中的数据,再由EJB或者Java Bean进行处理。

 

Struts有哪些优缺点?

优点:

1) 实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现;

2)struts提供了丰富的标签库,比如:jstl等,大大提高了开发的效率;

3) Struts2提供丰富的拦截器实现,Struts2 的拦截器是一个 Action 级别的 AOP, Struts2 中的 许多特性都是通过拦截器来实现的, 例如异常处理,文件上传,验证等。拦截器 是可配置与重用;

4)多种表现层技术. 如:JSP、FreeMarker、Velocity 等;

5)Struts能很好的与 hibernate、spring整合。

 

缺点:

1) 传参麻烦,要经过默认的拦截器,参数过多就会臃肿,而且参数校验繁琐;

2) 安全性有待提高,被爆漏洞多。

 

struts2框架的核心控制器是什么?作用?

1)Struts2框架的核心控制器是:StrutsPrepareAndExecuteFilter:
2)作用:负责拦截由

<url-pattern>/*</url-pattern>

指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。

 

Struts2 的工作流程?

SSH面试题及答案(23道常见必考题解析)-mikechen

1)客户端初始化一个指向Servlet容器的请求,比如:浏览器发送请求,该请求经过过滤器Filter后指向核心控制器FilterDispatcher;
2)核心控制器,根据请求询问ActionMapper,需要调用哪个Action;
3)ActionMapper把决定告诉核心控制器,核心控制器再把请求的处理交给ActionProxy;
4)ActionProxy,通过Configuration Manager询问框架的配置文件,找到需要调用的Action类,创建一个ActionInvocation的实例;
5)ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器Intercepter的调用;
6)一旦Action执行完毕ActionInvocation负责根据struts.xml中的配置找到对应的返回结果;
7)响应的返回是通过我们在web.xml中配置的过滤器;
8)如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal ActionContext,如果ActionContextCleanUp不使用则将会去清理sreadlocals。

 

Struts2是如何启动的?

struts2框架是通过Filter启动的,即StrutsPrepareAndExecuteFilter,此过滤器为struts2的核心过滤器;

StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作;

struts2读取到struts.xml的内容后是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件。

 

Struts2 拦截器 和 过滤器 的区别?

①、过滤器依赖于 Servlet 容器,而拦截器不依赖于 Servlet 容器。

②、Struts2 拦截器只能对 Action 请求起作用,而过滤器则可以对几乎所 有请求起作用。

③、拦截器可以访问 Action 上下文(ActionContext)、值栈里的对象 (ValueStack),而过滤器不能.

④、在 Action 的生命周期中,拦截器可以多次调用,而过滤器只能在容器 初始化时被调用一次。

 

拦截器的生命周期与工作过程?

1)每个拦截器都是实现了Interceptor接口的 Java 类;

2)init(): 该方法将在拦截器被创建后立即被调用,它在拦截器的生命周期内只被调用一次,可以在该方法中对相关资源进行必要的初始化;

3)intercept(ActionInvocation invocation):每拦截一个动作请求,该方法就会被调用一次;

4)destroy:该方法将在拦截器被销毁之前被调用,它在拦截器的生命周期内也只被调用一次;

5)struts2中有内置了18个拦截器。

 

什么是 ORM 框架?

ORM(Object Relation Mapping),即对象关系映射,即通过类与数据库表的映射关系将对象持久化到数据库中。

ORM框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。

当前ORM框架主要有五种:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink,JFinal。

 

Hibernate工作原理?

1.读取并解析配置文件;

2.读取并解析映射信息,创建SessionFactory;

3.打开Sesssion;

4.创建事务Transation;

5.持久化操作;

6.提交事务;

7.关闭Session;

8.关闭SesstionFactory。

 

为什么要使用 Hibernate?

1)对JDBC做了轻量级的封装,简化了数据访问层编码;

2)Hibernate是一个ORM框架,开发者可以使用面向对象的思想操作数据库,使用更加方便;

3) hibernate映射很灵活,支持各种关系数据库,从一对一到多对多的各种复杂关系。

Hibernate 有几种查询方式?

Hibernate有4种查询方法:

  • HQL 通过Hibernate提供的查询语言进行查询;
  • EJBQL(JPQL 1.0) 是EJB提供的查询语言;
  • QBC(query by cretira)通过Cretira接口进行查询;
  • QBE(query by Example) 通过Example编程接口进行查询。

 

 Hibernate 的缓存机制?

1)一级缓存(Session缓存)

它可以在session范围内减少数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效

只要是持久化对象状态的,都受Session管理,也就是说,都会在Session缓存中

Session的缓存由hibernate维护, 如果想操作缓存内容,可以通过close/clear/evict清空缓存

 

2) 二级缓存(SessionFactory缓存)

二级缓存所有的Session都可以使用,可以在hibernate的配置文件hibernate.cfg.xml自行配置是否开启

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法