2018 java面试题(四) spring、springMVC 不念不忘少年蓝@ 2021-09-26 19:04 266阅读 0赞 14.springMVC的流程? 答:1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器 5.执行处理器(Controller,也叫后端控制器)。 6.Controller执行完成返回ModelAndView 7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet 8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器 9.ViewReslover解析后返回具体View 10.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。 11.DispatcherServlet响应用户 15.Springmvc的优点 答:1.它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件.并且和Spring提供的其他基础结构紧密集成. 2.不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的) 3. 可以任意使用各种视图技术,而不仅仅局限于JSP 4 . 支持各种请求资源的映射策略 5 .它应是易于扩展的 13.spring有两种代理方式: 答: 若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。 优点:因为有接口,所以使系统更加松耦合 缺点:为每一个目标类创建接口 若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。 优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。 缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好 10.spring中的核心类有那些,各有什么作用? 答:BeanFactory:产生一个新的实例,可以实现单例模式 BeanWrapper:提供统一的get及set方法 ApplicationContext:提供框架的实现,包括BeanFactory的所有功能 spring中自动装配的方式有哪些? 答:1、 No:即不启用自动装配。 2、 byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入。比如说类Computer有个属性printer,指定其autowire属性为byName后,Spring IoC容器会在配置文件中查找id/name属性为printer的bean,然后使用Seter方法为其注入。 3、 byType:通过属性的类型查找JavaBean依赖的对象并为其注入。比如类Computer有个属性printer,类型为Printer,那么,指定其autowire属性为byType后,Spring IoC容器会查找Class属性为Printer的bean,使用Seter方法为其注入。 4、 constructor:通byType一样,也是通过类型查找依赖对象。与byType的区别在于它不是使用Seter方法注入,而是使用构造子注入。 5、 autodetect:在byType和constructor之间自动的选择注入方式。 6、 default:由上级标签<beans>的default-autowire属性确定。 1.Spring中AOP的应用场景、Aop原理、好处? 答:AOP--Aspect Oriented Programming面向切面编程;用来封装横切关注点,具体可以在下面的场景中使用: Authentication 权限、Caching 缓存、Context passing 内容传递、Error handling 错误处理Lazy loading懒加载、Debugging调试、logging, tracing, profiling and monitoring 记录跟踪优化 校准、Performance optimization 性能优化、Persistence 持久化、Resource pooling 资源池、Synchronization 同步、Transactions 事务 原理:AOP是面向切面编程,是通过动态代理的方式为程序添加统一功能,集中解决一些公共问题。 优点:1.各个步骤之间的良好隔离性耦合性大大降低 2.源代码无关性,再扩展功能的同时不对源码进行修改操作 2.Spring中IOC的作用与原理?对象创建的过程。 答:IOC--Inversion of Control控制反转。当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例对象。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者 直接使用。 3.介绍spring框架 它是一个一站式(full-stack全栈式)框架,提供了从表现层\-springMVC到业务层\-spring再到持久层\-springdata的一套完整的解决方案。我们在项目中可以只使用spring一个框架,它就可以提供表现层的mvc框架,持久层的Dao框架。它的两大核心IoC和AOP更是为我们程序解耦和代码简洁易维护提供了支持。 5.Spring中用到的设计模式 答:简单工厂、工厂方法、单例模式、适配器、包装器、代理、观察者、策略、模板方法 详细介绍:请参考本微博的:开发常用设计模式 6.Spring的优点? 答:1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入式设计,代码的污染极低 8.独立于各种应用服务器 9.spring的DI机制降低了业务对象替换的复杂性 10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring 的部分或全部 **7.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作用域效果相同。 8.Spring管理事务有几种方式? 答:有两种方式: 1、编程式事务,在代码中硬编码。(不推荐使用) 2、声明式事务,在配置文件中配置(推荐使用) 声明式事务又分为两种: a、基于XML的声明式事务 b、基于注解的声明式事务 **9.spring中自动装配的方式有哪些?** 答:1、 No:即不启用自动装配。 2、 byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入。比如说类Computer有个属性printer,指定其autowire属性为byName后,Spring IoC容器会在配置文件中查找id/name属性为printer的bean,然后使用Seter方法为其注入。 3、 byType:通过属性的类型查找JavaBean依赖的对象并为其注入。比如类Computer有个属性printer,类型为Printer,那么,指定其autowire属性为byType后,Spring IoC容器会查找Class属性为Printer的bean,使用Seter方法为其注入。 4、 constructor:通byType一样,也是通过类型查找依赖对象。与byType的区别在于它不是使用Seter方法注入,而是使用构造子注入。 5、 autodetect:在byType和constructor之间自动的选择注入方式。 6、 default:由上级标签<beans>的default-autowire属性确定。 **10.spring中的核心类有那些,各有什么作用?** 答:BeanFactory:产生一个新的实例,可以实现单例模式 BeanWrapper:提供统一的get及set方法 ApplicationContext:提供框架的实现,包括BeanFactory的所有功能 **12.什么是IOC,什么又是DI,他们有什么区别?** **一、IOC介绍** IOC是控制反转。 创建对象实例的控制权从代码控制剥离到IOC容器控制(之前的写法,由程序代码直接操控使用new关键字),实际就是你在xml文件控制,控制权的转移是所谓反转,侧重于原理。 **二、DI介绍** DI是依赖注入 创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现。 **三、区别** 1.它们是spring核心思想的不同方面的描述。 2.依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。 依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源; 而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。 **十九、请介绍一下Spring框架中Bean的生命周期 ** 一、Bean的定义 Spring通常通过配置文件定义Bean。如: 这个配置文件就定义了一个标识为 HelloWorld 的Bean。在一个配置文档中可以定义多个Bean。 二、Bean的初始化 有两种方式初始化Bean。 1、在配置文档中通过指定init-method 属性来完成 2、实现 org.springframwork.beans.factory.InitializingBean接口 那么,当这个Bean的所有属性被Spring的BeanFactory设置完后,会自动调用afterPropertiesSet()方法对Bean进行初始化,于是,配置文件就不用指定 init-method属性了。 三、Bean的调用 有三种方式可以得到Bean并进行调用: 1、使用BeanWrapper 2、使用BeanFactory 3、使用ApplicationConttext 四、Bean的销毁 1、使用配置文件中的 destory-method 属性 2、实现 org.springframwork.bean.factory.DisposebleBean接口 # [SpringMVC和Struts2区别比较 ][SpringMVC_Struts2_] # 1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从[架构][Link 1]本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。 4、 拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。 6、SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。 springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。 10、SpringMVC开发效率和性能高于Struts2。 11、SpringMVC可以认为已经100%零配置。 **Spring的拦截器和Struts的过滤器(Filter)有什么差别?** ① 拦截器是基于Java反射机制的,而过滤器是基于函数回调 。 ② 过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器 。 ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 。 ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能 。 ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 。 **springmvc 拦截器概念** Java 里的拦截器是动态拦截 action 调用的对象。它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个 action 执行前阻止其执行,同时也提供了一种可以提取 action 中可重用部分的方式。在AOP(Aspect-Oriented Programming,面向切面编程)中拦截器用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作。 ## 2.2 原理 ## 拦截器 Interceptor 的拦截功能是基于 Java 的动态代理来实现的,具体可以参考博文“ [用 Java 实现拦截器 Interceptor 的拦截功能][Java _ Interceptor] ”,也可以通过阅读 Spring 源代码来了解更为权威的实现细节。 # 3 实现方法 # 在 Spring 框架之中,咱们要想实现拦截器的功能,主要通过两种途径,第一种是实现`HandlerInterceptor`接口,第二种是实现`WebRequestInterceptor`接口。接下来,咱们分别详细的介绍两者的实现方法。 **应用场景** `1、日志记录:``记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。` `2、权限检查:``如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;` `3、性能监控:``有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);` `4、通用行为:``读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。` `5、OpenSessionInView:``如Hibernate,在进入处理器打开Session,在完成后关闭Session。` `…………本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现。` **实现方法** **preHandle:**预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现); ` ` 返回值:true表示继续流程(如调用下一个拦截器或处理器); false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应; **postHandle:**后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。 **afterCompletion:**整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中**preHandle返回true的拦截器的afterCompletion**。 **MVC设计模式** MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式: \[1\] Model(模型)表示应用程序核心(比如数据库记录列表)。 View(视图)显示数据(数据库记录)。 Controller(控制器)处理输入(写入数据库记录)。 MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。 Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。 View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。 Controller(控制器)是应用程序中处理用户交互的部分。 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。 MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。 ![70][] **框架与设计模式的区别** 框架:软件框架是项目软件开发过程中提取特定领域软件的共性部分形成的体系结构,不同领域的软件项目有着不同的框架类型。框架不是现成可用的应用系 统。而是一个半成品,提供了诸多服务,开发人员进行二次开发,实现具体功能的应用系统。 设计模式:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,它强调的是一个设计问题的解决方法。 [SpringMVC_Struts2_]: https://www.cnblogs.com/huajiezh/p/6415444.html [Link 1]: http://lib.csdn.net/base/16 [Java _ Interceptor]: http://blog.csdn.net/qq_35246620/article/details/68484407 [70]: /images/20210923/64917241b1bb4510b9ac4689f6918286.png
还没有评论,来说两句吧...