Spring 和Spring MVC 问题汇总

1. 列表内容为什么使用Spring?

  • 方便解耦,简化开发;通过Spring提供的Ioc容器,可以将对象之间的依赖关系交由Spring进
    行控制,避免硬编码所造成的过度程序解耦。
  • AOP的支持;通过Spring提供的AOP功能。方便进行面向切面的编程,如性能监测、事物管理、日志记录等。
  • 声明式事务的支持
  • 方便集成各种优秀的框架、
  • 降低Java EE API的使用难度;如JDBC,JavaMail,远程调用等提供了简便封装

2. 什么式IOC,为什么使用IOC

  • IOC全称为Iversion of Controller ,控制反转
  • 在对象的创建时,你不需要创建对象,而只需描述他如何被创建,不需在代码中直接组装你的组件和服务,只需要在配置文件中描述那些组件需要服务,之后交由IOC容器把他们创建出来。
  • 能帮助我们设计出松耦合、更优良的程序。

3. 什么是AOP,为什么使用AOP?

  • AOP 全称,Aspect-Oriented Programming ,面向切面编程
  • AOP ,面向切面编程,就是把可重用的功能提取出来,然后将这些通用的功能再合适的时候植入程序中,比如事物管理、权限控制、日志记录、性能优化
  • AOP并没有帮助我们解决任何新的问题,它只是提供·了一种更好的办法,能够用更少的工作量来解决鲜有的一些问题,使得系统更加健壮,可维护性更好

4. 什么是Spring的事物管理

  • 事物就是对一系列的数据库操作进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间一条出现异常,那么回滚之前所有的操作,这样可以防止出现脏数据等问题。
  • 开发中为了避免这种情况一般都会进行事务管理。Spring的声明式事务通常是指在配置文件中对事务进行配置声明,其中包括了很多声明属性,它是通过Spring Proxy创建代理对象,自己不用写多余的代码,只要在Spring的配置文件中声明即可;通常用在数据库的操作里面
  • 编程式事务就是指通过硬编码的方式做事务处理,这种处理方式需要写代码,事务中的逻辑可以自己控制;
  • Spring 中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring注入来完成此功能。

5. Spring 框架支持以下5中bean的作用域?

  • singleton:默认值,bean在每个Spring IOC容器中只有一个实例
  • prototype:一个bean的定义可以有多个实例。
  • request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情型下有效。
  • session:在一个HTTP Session中,一个bean定义对应一个实例,该作用域仅在基于web的Spring ApplicationContext情型下有效。
  • global-session: 在一个全局的HTTP Sesssion中,一个bean定义对应一个实例,该作用域仅在基于web的Spring ApplicationContext情型下有效。

6. 什么是SpringMVC框架

  • Spring 配备构建WEB 应用的全功能MVC框架,Spring可以很便捷地和其他MVC框架集成,如Struts,Spring的MVC框架用控制反转把业务对象和控制逻辑清晰的隔离,也允许以声明的方式把请求参数和业务对象绑定。

7. 如何启用注解

<context:annotation-config/>
    如果使用<context:component-scan base-package="com.tgb.web.controller.annotation"> context:component-scan>
      则上面内容可以省略 

8. Spring MVC的请求流程

  • 第一步:发起请求到前端控制器(DispatcherServlet)
  • 第二步:前端控制器请求HanderMapping查找Handler可以根据xml配置、注解进行查找
  • 第三步:处理器映射HandlerMapping向前端控制器返回Handler
  • 第四步:前端控制器调用处理适配器去执行Handler
  • 第五步:处理器执行Handler
  • 第六步:Handler执行完成后,给适配器返回一个ModuleAndView
  • 第七步:处理器适配器向前端控制器返回ModelAndView
  • 第八步:前端控制器请求视图解析器去经行视图解析,根据逻辑视图名解析成真正的视图
  • 第九步:视图解析器向前端控制器返回view
  • 第十步:前端控制器进行视图的渲染,视图渲染将模型数据填充到request中
    -第十一步:前端控制器向用户响应结果

9.web.xml的配置

Spring 和Spring MVC 问题汇总_第1张图片


10. 注解的处理器和适配器

一般使用mvc:annotation-driven 开启注解


11. spring 和mybatis的整合过程

  • 第一步:整合DAO层,mybatis和spring整合,通过spring管理mapper接口,使用mapper的扫描器自动扫描注册mapper接口在spring中进行注册
  • 整合service层,通过spring管理service接口,使用配置方式将service接口配置在spring的配置文件中,实现事务的控制
  • 整合springMVC 由于Spring MVC是spring的模块,因此可直接使用不需要整合

12.视图解析器配置前缀和后缀

Spring 和Spring MVC 问题汇总_第2张图片


13. mybatis的配置文件

Spring 和Spring MVC 问题汇总_第3张图片


14. 配置数据源

Spring 和Spring MVC 问题汇总_第4张图片


15. 事务控制

Spring 和Spring MVC 问题汇总_第5张图片


16. 静态资源的访问

 <resources mapping="/resources/**" location="/resources/" />
 <resources mapping="/images/**" location="/images/" />
 <resources mapping="/js/**" location="/js/" />

17. @RequestMapping的作用

  • url映射
  • 窄化请求映射
  • 限制http的请求方法

18.Controller方法的返回值

  • 返回MoudlerAndView,需要方法的结束时,组装一个MoudelAndView,将model和view分别经行设置
  • 返回String
    1. 表示返回的逻辑视图名,真正视图为前缀+逻辑视图名+后缀
    2. redirect重定向:返回字符串格式为:”redirect:xxxxxxx“;
    3. forward页面转发:返回字符串格式为:”forword:xxxxxxxx”;

  • 返回void
    1. 使用request来实现页面的跳转,如:request.getRequestDispatcher(“页面路径”).forward(request,response);
    2. 通过response的重定向来实现跳转:response.sendRedirect(“url);
    3. 也可以通过response指定响应结果,列如响应json数据:

        response.setCharacterEncoding("utf-8");
    
       response.setContentType("application/json;charset=utf-8");
    
       response.getWriter().write("json串"); 
    

19. 参数绑定

  • 默认支持类型,直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中如果遇到下边类型可直接绑定。

    1. HttpServletRequest: 通过request对象获取请求信息
    2. HttpServletResponse: 通过response处理响应信息
    3. HttpSession: 通过session对象得到session中存放的对象
    4. Model/ModuleMap: model是一个接口,modelMap是一个接口的实现,作用:将model中的数据填充到request域中
  • 简单类型
    通过@RequestParam对简单类型的参数进行绑定,如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功;通过required属性指定参数是否必须传入,如果设置为true,没有参数将报错

  • POJO的绑定
    页面中表单中的name属性值必须与对应POJO形参中的属性名称一致,将页面中数据绑定到POJO

  • 自定义参数绑定实现日期类型绑定
    对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定,将请求日期数据串转换成日期类型,要转换的日期类型和pojo中日期类型保持一致


20. SpringMVC 与Struts2的对比

  • Struts是类级别的拦截器,一个类对应一个request上下文,SpringMVC 是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url
  • 由上边的原因,SpringMVC的方法之间基本上是独立的,独享request response 数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2虽然方法之间也是独立的,但其所有的Action的变量是共享的,这个不会影响程序运行,却给我们编码,读程序时带来麻烦,每次接受一个请求就创建一个新的Action,一个Action对应一个request上下文
  • 由于Struts2需要对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个map,供给每个Action使用,并保证线程安全,所以在原则上,是比较消耗内存的。
  • SpringMVC 集成了AJAX,使用非常方便,只需要一个注解@ResponseBoay就可以实现,然后直接返回响应文本即可,而Struts2在Action中处理时,一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便
  • springmvc面向方法开发的,更接近service接口的开发方式,struts2面向类开发
  • springmvc 可以单列开发,struts2只能时多列开发

21. 乱码处理

  • post乱码,在web.xml添加post乱码的filter:CharacterEncodingFilter
  • 对于get亲求中文参数出现乱码解决方法有两个
    1. 修改tomcat配置文件添加编码与工程编码一致,如下:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
  1. 对参数进行重新编码:
String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码

22. 集合类型绑定

  • 数组绑定:controller方法参数使用:(Integer[] itrmId)页面统一使用:itemId作为name
  • list绑定:pojo属性为: itemList,页面:itemList[index].属性名
  • map绑定:pojo属性名为:Map

24. spring校验

  • 项目中,通知使用较多时前端的校验,比如页面中js校验,对于安全要求较高点建议在服务端进行校验
  • springmvc 使用hiberbate的校验框架validation(和bibernate没有任何关系)
  • 校验思路:页面提交请求的参数,请求到controller方法,使用validation进行校验,如果检验出错,将错误信息展示到页面

25. 数据回显

  • @ModelAttribute还可以将方法的返回值传到页面:在方法上加注解@ModuleAttribute
  • 最简单方法使用model,可以不使用@ModelAttribute:model.addAttribute(“id”,id)
  • springmvc 默认对pojo数据进行回显,pojo数据传入controller方法后,springmvc自动将pojo数据放到request域中,key等于pojo类型(首字母小写)
  • public String testParam(PrintWriter out,@RequestParam(“username”) String name)

26. 异常处理

  • springmvc提供全局处理器(一个系统只有一个异常处理器)进行异常处理
  • 系统出现异常,在程序中手动抛出,dao抛出geiservice、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器

这里写图片描述


27. 上传图片

  • 在页面from提交enctype = ”multipart/form-data“的数据时,需要springmc对multipart类型的数据进行解析
  • 在springmvc.xml中配置multipart类型的解析器
    Spring 和Spring MVC 问题汇总_第6张图片

  • 方法中使用:MultipartFile attach (单个文件上传)或者MultipartFile[] attachs(多个文件上传)


28. JSON的处理

  • 加载json转换的jar包,springmvc 中使用jackson的包进行json转换(@RequestBody和@ResponseBody使用下面的包经行json转换)
  • 配置json转换器,在注解适配器RequestMappingHandlerAdapter中加入messageConverts,如果使用了则会自动加入
  • ajax
    Spring 和Spring MVC 问题汇总_第7张图片
  • Controller(ResponseBody、RequestBody)

Spring 和Spring MVC 问题汇总_第8张图片

  • 注意ajax中contentType如果不设置为json类型,则传的参数为key/value类型,上面设置后。传的是json类型

29 拦截器

  • 定义拦截器,实现HandlerInterceptor接口,接口中提供的方法

    1. preHandle:进入Handler方法之前执行,用于身份验证、身份授权
    2. postHandle:进入Handler方法之后,返回modelAndView之前执行,应用场景从modelAndView出发;将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一视图
    3. afterCompletion:执行Handler完成执行此方法,应用场景:统一异常处理,统一日志处理
  • 拦截器配置

    1. 针对HandlerMapping配置(不推荐):springmvc拦截器针对HandlerMapping经行拦截设置,如果在某个HandlerMapper中配置拦截,经过该HandlerMapping映射成功的handler最终使用该拦截器
    2. 类似全局拦截器:springmvc配置类似全局的拦截器,springmvc框架将配置的类似的全局的拦截器注入到HadlerMapping中
      Spring 和Spring MVC 问题汇总_第9张图片

30. spring 中自动装配的方式

  • NO:即不开启自动配置
  • byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入,比如说类Conmputer有个属性printer,指定其autowire属性为byName后,Spring Ioc容器会在配置文件中查找id/name属性为printrer的bean,然后使用Seter方法为其注入
  • byType:通过属性类型查找JavaBean依赖的对象并为其注入,比如类Computer有个属性priter,类型为Printer,那么指定其autowire属性为byType后,Spring IOC容器会查找Class属性为Printer的bean,使用Seter方法为其注入
  • constructor: 与通过byType一样,也是通过类型查找依赖对象,与byType的区别在于它不是使用Seter方法注入,而是使用构造方法注入
  • autodetect: byType和constructor之间自动选择注入方式
  • default:由上级标签的 default-autowire属性确定

31. Spring 中AOP的应用场景、AOP的原理和好处

  • AOP–Aspect Oriented Programming面向切面编程
  • 主要在以下场景中使用:Authentication权限、Caching缓存、Context passing 内容传递,Error handling 错误处理Lazy loading 懒加载、Debugging调试、logging tracting、profiling and monitoring 记录跟踪优化 校准 、性能优化、Resoure pooling 资源池、Synchronization 同步、Transaction 事物
  • 原理:AOP 是面向切面编程,是通过动态代理的方式为程序添加统一功能,集中解决一些公共的问题

  • 优点: 各个步骤之间的良好隔离性耦合性大大降低;源代码无关性,再扩展功能的同不对源码进行修改操作


32. Spring 中的IOC的作用于原理?对象的创建过程

IOC—-Inversion of Control 控制反转,当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调试者来创建被调用者的实例对象。但在spring中创建的对象不再是由调用者来完成,因此称为控制反转。创建被调用者的工作由spring 来完成,然后注入,调用者直接使用


33. Spring 常见的创建对象的注解

  • @Component @Controller @Service @Repository

34. Spring 中使用的设计模式

  • 工厂模式 代理模式、单例模式、适配器、包装器、观察者、策略 、模板方法

35. Spring 的优点

  • 降低了组件之间的耦合性,实现了软件各层之间的解耦
  • 可以使用众多服务,事物管理、消息服务等
  • 容器提供单例模式支持
  • 容器提供了AOP技术,利用它很容易实现如权限拦截运行监控等功能
  • 容器提供了众多的辅助类,能加快应用的开发
  • spring对于主流的应用框架提供了集成支持,如JPA、 redis等
  • spring 输入低侵入式设计,代码的污染极低
  • 独立于各种应用服务器
  • spring的DI机制降低了业务对象替换的复杂性
  • Spring的高度开放性,并不强制应用完全依赖于spring,开发者可以自由选择spring的部分或全部

36. Spring管理事务有几种方式?

  • 编程式事务
  • 声明式事务(基于xml的声明式事务、基于注解的声明式事务)

37. spring 中核心类有哪些 各有什么作用

  • BeanFactory: 产生一个新的实例,可以实现单例模式
  • BeanWrapper: 提供统一的get和set方法
  • ApplicationContext:提供框架的实现,包括BeanFactory的所用功能

38. Bean 的调用方式?

有三种方式可以得到Bean并进行调用:
1、使用BeanWrapper
HelloWorld hw=new HelloWorld(); 
BeanWrapper bw=new BeanWrapperImpl(hw); 
bw.setPropertyvalue(”msg”,”HelloWorld”);
system.out.println(bw.getPropertyCalue(”msg”));
2、使用BeanFactory
InputStream is=new FileInputStream(”config.xml”);
XmlBeanFactory factory=new XmlBeanFactory(is);
HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);
system.out.println(hw.getMsg()); 
3、使用ApplicationConttext
ApplicationContext actx=new FleSystemXmlApplicationContext(”config.xml”);
HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);
System.out.println(hw.getMsg());

39. spring有两种代理方式

  • 若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
    优点:因为有接口,所以使系统更加松耦合
    缺点:为每一个目标类创建接口
  • 若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
    优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。
    缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。

你可能感兴趣的:(Spring)