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的配置
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.视图解析器配置前缀和后缀
13. mybatis的配置文件
14. 配置数据源
15. 事务控制
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方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中如果遇到下边类型可直接绑定。
- HttpServletRequest: 通过request对象获取请求信息
- HttpServletResponse: 通过response处理响应信息
- HttpSession: 通过session对象得到session中存放的对象
- 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亲求中文参数出现乱码解决方法有两个
- 修改tomcat配置文件添加编码与工程编码一致,如下:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
- 对参数进行重新编码:
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类型的解析器
方法中使用:MultipartFile attach (单个文件上传)或者MultipartFile[] attachs(多个文件上传)
28. JSON的处理
- 加载json转换的jar包,springmvc 中使用jackson的包进行json转换(@RequestBody和@ResponseBody使用下面的包经行json转换)
- 配置json转换器,在注解适配器RequestMappingHandlerAdapter中加入messageConverts,如果使用了则会自动加入
- ajax
- Controller(ResponseBody、RequestBody)
- 注意ajax中contentType如果不设置为json类型,则传的参数为key/value类型,上面设置后。传的是json类型
29 拦截器
定义拦截器,实现HandlerInterceptor接口,接口中提供的方法
- preHandle:进入Handler方法之前执行,用于身份验证、身份授权
- postHandle:进入Handler方法之后,返回modelAndView之前执行,应用场景从modelAndView出发;将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一视图
- afterCompletion:执行Handler完成执行此方法,应用场景:统一异常处理,统一日志处理
拦截器配置
- 针对HandlerMapping配置(不推荐):springmvc拦截器针对HandlerMapping经行拦截设置,如果在某个HandlerMapper中配置拦截,经过该HandlerMapping映射成功的handler最终使用该拦截器
- 类似全局拦截器:springmvc配置类似全局的拦截器,springmvc框架将配置的类似的全局的拦截器注入到HadlerMapping中
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的动态代理好。