ITPub博客

首页 > > > Java学习路线分享Spring常见面试题

Java学习路线分享Spring常见面试题

作者:coyan 时间:2019-10-16 14:24:18 0 删除 编辑

本章面试题内容由好程序员Java 教程 为大家整理分享,希望对大家有所帮助。

  问:SpringIOC原理阐述

  答:把对象的创建、初始化、销毁等工作交给Spring容器来完成。我们可以把IOC 容器的工作模式看做是工厂模式的升华,可以把IOC 容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言的的反射编程,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC 是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。

  问:SpringAOP原理

  答:1)面向对象的设计没有办法解决重复代码的问题

  2)SpringAOP使用动态代理技术在运行期植入增强的代码,aspectj 是在编译器织入横切代码的形式来实现代理技术的

  3)SpringAOP使用了两种代理机制, 一种是基于JDK 的动态代理, 一种是基于CGLib 的动态代理

  4)JDK1.3以后java 提供了动态代理的技术, 运行开发者在运行期创建接口的代理实例

  5)jdk的动态代理主要涉及java.lang.reflect 包中的两个类ProxyInvcoationHandler

  6)InvcoationHandler是一个接口, 通过实行该接口可以订阅横切逻辑, 并通过反射机制调用目标类的代码, 动态讲横切逻辑和业务逻辑编织在一起

  7)Proxy利用InvocationHandler 动态创建一个符号某一接口的实例, 生成目标类的代理对象

  8)cglib采用非常底层的字节码技术, 可以为一个类创建子类, 并在子类中采用方法拦截技术拦截所有的父类方法的调用, 并顺势织入横切逻辑

  问:AOP中的概念解释

  答:切面:Aspect,连接点:Joinpoint, 增强:Advice, 切入点:Pointcut, 目标对象:Target, 代理:Proxy, 其中增强包括: 前置增强, 后置增强, 返回会增强, 环绕增强, 抛出异常后增强

  问:使用SpringAOP可以基于两种方式

  答:一种是比较方便和强大的注解方式,使用注解配置SpringAOP 总体分为两步, 第一步是在xml 文件中声明激活自动扫描组件功能, 同时激活自动代理功能, 一种则是中规中矩的xml 配置方式

  问:Spring的事务传播机制

  答:1)REQUIRED(默认) :支持使用当前事务, 如果当前事务不存在, 创建一个新事务。

  2)SUPPORTS:支持使用当前事务, 如果当前事务不存在, 则不使用事务。

  3)MANDATORY:中文翻译为强制, 支持使用当前事务, 如果当前事务不存在, 则抛出Exception 。

  4)REQUIRES_NEW:创建一个新事务, 如果当前事务存在, 把当前事务挂起。

  5)NOT_SUPPORTED:无事务执行, 如果当前事务存在, 把当前事务挂起。

  6)NEVER:无事务执行, 如果当前有事务则抛出Exception 。

  7)NESTED:嵌套事务, 如果当前事务存在, 那么在嵌套的事务中执行。如果当前事务不存在, 则表现跟REQUIRED 一样。

  问:Spring的事务实现方式

  答:1)编程式事务管理对基于POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction() 、commit() 、rollback() 等事务管理相关的方法, 这就是编程式事务管理。

  2)基于TransactionProxyFactoryBean 的声明式事务管理

  3)基于@Transactional 的声明式事务管理

  4)基于AspectjAOP 配置事务

  问:Spring通过单实例化Bean 简化多线程问题

  答:由于Spring的事务管理器是通过线程相关的ThreadLocal 来保存数据访问基础设施( 也即Connection 实例) ,web 容器本身就是多线程的,web 容器为一个http 请求创建一个独立的线程( 实际大多数采用线程池) ,所以bean 也是运行在多线程的环境下,在大多数情况下,Spring 的bean 都是单例的,单例的好处就是线程无关性,不存在多线程并发问题,Spring 是通过ThreadLocal 将有状态的变量本地线程化,达到另一个层面上的线程无关。

  问:SpringMVC工作原理

  答:SpringMVC框架围绕dispactcherServlet 这个核心展开,dispatcherServlet 是SpringMVC 的总导演,总策划,他负责拦截请求并将器分派给响应的处理器处理。SpringMVC 框架包括注解驱动控制器,请求及响应的信息处理,表单标签绑定,视图解析,本地化解析,上传文件解析,异常处理。

  SpringMVC通过一个前端servlet 接收所有的请求,并将具体工作委托给其他组件进行处理

  1)整个过程开始于客户端发送一个HTTP 请求,如果匹配web.xml 的映射路径,则进行处理

  2)DispatcherServlet根据HandlerMapping 找到对应的Handler, 将处理权交给Handler

  3)HandlerAdapter这个适配器对各种Hander 方法进行调用

  4)处理完了之后返回一个ModelAndView 给DispatcherServelt

  5)Handler返回的ModelAndView() 只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet 通过ViewResolver 将逻辑视图转化为真正的视图View

  6)根据ModelAndView 对模型数据进行视图渲染

  7)最终客户端得到相应消息,可能是一个普通的HTML 页面,也可能是一个XML 或者JSON 串

  问:SpringMVC和Struts2 的区别

  答:1)拦截机制的不同

  Struts2是类级别的拦截,每次请求就会创建一个Action ,和Spring 整合时Struts2 的ActionBean 注入作用域是原型模式prototype ,然后通过setter ,getter 吧request 数据注入到属性。Struts2 中,一个Action 对应一个request ,response 上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。Struts2 中Action 的一个方法可以对应一个url ,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计为多例。

  SpringMVC是方法级别的拦截,一个方法对应一个Request 上下文,所以方法直接基本上是独立的,独享request ,response 数据。而每个方法同时又何一个url 对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap 返回给框架。在Spring 整合时,SpringMVC 的ControllerBean 默认单例模式Singleton ,所以默认对所有的请求,只会创建一个Controller ,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope 注解修改。

  Struts2有自己的拦截Interceptor 机制,SpringMVC 这是用的是独立的AOP 方式,这样导致Struts2 的配置文件量还是比SpringMVC 大。

  2)底层框架的不同

  Struts2采用Filter(StrutsPrepareAndExecuteFilter) 实现,SpringMVC(DispatcherServlet) 则采用Servlet 实现。Filter 在容器启动之后即初始化; 服务停止以后坠毁,晚于Servlet 。Servlet 在是在调用时初始化,先于Filter 调用,服务停止后销毁。

  3)性能方面

  Struts2是类级别的拦截,每次请求对应实例一个新的Action ,需要加载所有的属性值注入,SpringMVC 实现了零配置,由于SpringMVC 基于方法的拦截,有加载一次单例模式bean 注入。所以,SpringMVC 开发效率和性能高于Struts2 。

  4)配置方面

SpringMVC 和Spring 是无缝的。从这个项目的管理和安全上也比Struts2 高。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2236/viewspace-3165243/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: java中常用jar包
请登录后发表评论 登录
全部评论

注册时间:2019-07-11

  • 博文量
    271
  • 访问量
    16163