好程序员Java学习路线分享Spring常见面试题

本章面试题内容由好程序员Java教程为你们整理分享,但愿对你们有所帮助。前端

  问:SpringIOC原理阐述java

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

  问:SpringAOP原理web

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

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

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

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

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

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

  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高。

相关文章
相关标签/搜索