Spring面试知识点总结(一)

Spring面试知识点总结(一)


一、Spring MVC架构原理讲解

处理请求流程:

1. 客户端请求提交到DispatcherServlet
2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
3. DispatcherServlet将请求提交到Controller
4. Controller调用业务逻辑处理后,返回ModelAndView
5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
6. 视图负责将结果显示到客户端



具体执行步骤如下:
1、首先用户发送请求————>前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行
处理并把请求委托给它,即以前的控制器的控制逻辑部分;图2-1中的1、2 步骤;
2、页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring Web MVC
中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个ModelAndView(模
型数据和逻辑视图名);图2-1中的3、4、5步骤;
3、前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;
图2-1中的步骤6、7;
4、前端控制器再次收回控制权,将响应返回给用户,图2-1中的步骤8;至此整个结束。

Spring Web MVC核心架构图:




核心架构的具体流程步骤如下:

  • 1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行
  • 处理,作为统一访问点,进行全局的流程控制;
  • 2、DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一
  • 个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新
  • 的映射策略;
  • 3、DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,
  • 即适配器设计模式的应用,从而很容易支持很多类型的处理器;
  • 4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处
  • 理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
  • 5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策
  • 略模式,很容易更换其他视图技术;
  • 6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此
  • 很容易支持其他视图技术;
  • 7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
  • 此处我们只是讲了核心流程,没有考虑拦截器、本地解析、文件上传解析等,后边再细述。

到此,再来看我们前边提出的问题:

  1. 请求如何给前端控制器?这个应该在web.xml 中进行部署描述,在HelloWorld中详细讲解。
  2. 前端控制器如何根据请求信息选择页面控制器进行功能处理? 我们需要配置HandlerMapping进行映射
  3. 3、如何支持多种页面控制器呢?配置HandlerAdapter 从而支持多种类型的页面控制器
  4. 4、如何页面控制器如何使用业务对象?可以预料到,肯定利用Spring IoC容器的依赖注入功能
  5. 5、页面控制器如何返回模型数据?使用ModelAndView 返回
  6. 6、前端控制器如何根据页面控制器返回的逻辑视图名选择具体的视图进行渲染? 使用ViewResolver 进行解析
  7. 7、不同的视图技术如何使用相应的模型数据? 因为Model是一个Map数据结构,很容易支持其他视图技术

在此我们可以看出具体的核心开发步骤:

  1. DispatcherServlet在web.xml 中的部署描述,从而拦截请求到Spring Web MVC
  2. HandlerMapping的配置,从而将请求映射到处理器
  3. HandlerAdapter 的配置,从而支持多种类型的处理器
  4. ViewResolver 的配置,从而将逻辑视图名解析为具体视图技术
  5. 处理器(页面控制器)的配置,从而进行功能处理


二、Spring Web MVC优势

1、清晰的角色划分:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器
(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器( Validator)、命令对象
(Command 请求参数绑定到的对象就叫命令对象)、表单对象(Form Object 提供给表单展示和提交到的对象就叫表
单对象)。
2、分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要;
3、由于命令对象就是一个POJO,无需继承框架特定API,可以使用命令对象直接作为业务对象;
4、和Spring 其他框架无缝集成,是其它Web 框架所不具备的;
5、可适配,通过HandlerAdapter 可以支持任意的类作为处理器;
6、可定制性,HandlerMapping、ViewResolver 等能够非常简单的定制;
7、功能强大的数据验证、格式化、绑定机制;
8、利用Spring提供的Mock对象能够非常简单的进行Web 层单元测试;
9、本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。
10、强大的JSP标签库,使JSP编写更容易。
………………还有比如RESTful 风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配置
支持等等。


三、什么是Spring,为什么要用Spring

  • 什么是spring:开源的,控制反转(Inversion of Control)和面向切面的容器框架

Spring核心:

  1. IOC(控制反转): inversion of control  -- 面向接口编程,控制整个接口不是实现,真正注入进来的才是实现,创建对象并且组装对象之间的关系。

                                            a) 应用程序本身不负责依赖对象的创建和维护,依赖对象的创建和维护是由外部容器负责的。这样控制权就由应用程序转移到了外部容器。控制权的转移就是所谓的反转。 原来程序控制的是具体的实现,现在控制的是接口编程,面向接口编程(面向抽象编程),注入进来的才是实现。(可扩展可灵活性)

                                            b) 白话来说,原来是有自己本身控制,现在由Spring容器管理控制,动态装配(在配置文件里,一个bean装配另一个bean)不需要自己来new,更好的灵活装配。

         2. DI(依赖注入):Dependency Injection:在运行时由外部容器将依赖对象注入到组件中。ioc的另一种说法,意思一样。

         3.AOP (面向切面编程) :Aspect-Oriented-Programming  是对面向对象的思维方式的有力补充。(面向对象编程之后伟大的思想),例如:权限检查,日志,事物,异常的管理(增删方便)

                                                   i)优点:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码

                                                   ii) JDK动态代理实现:所以当你有一件事情要在多个方法上面加相同逻辑处理操作时,就用动态代理去实现。

                                                    术语解释 :                                                     

                                                                 a) JoinPoint  释意:切面与原方法交接点 即 切入点

                                                                 b) PointCut  释意:切入点集合

                                                                 c) Aspect(切面)释意:可理解为代理类前说明

                                                                 d) Advice 释意:可理解为代理方法前说明 例如@Before

                                                                 e) Target  释意:被代理对象 被织入对象

                                                                 f) Weave  释意:织入

                   


  • 为什么要用spring

            Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。Spring既是一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。


SpringFramework 7大模块组成:Spring AOP,Spring DAO,Spring ORM,Spring Web,Spring Context, Spring Web MVC,spring core。

1。核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
2。Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
3。Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
4。Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
5。Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
6。Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
7。Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。


借助于Spring AOP,Spring IoC能够很方便的使用到非常健壮、灵活的企业级服务,通过使用IoC能够降低组件之间的耦合度,最终,能够提高类的重用性,利于测试,而且更利于整个产品或系统集成和配置。

简单说一下,IOC就是其实就是依赖注入,即用接口编程,在程序中不出现new关键字,而是用接口来命名引用,然后通过某种方式把接口的某个实现类的实例注入到引用里,从而实现接口与具体实现类的松耦合。

Spring对很多ORM框架提供了很好支持,描述下在spring使用hibernate的方法?
在context中定义DataSource,创建SessionFactoy,设置参数;

DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行具体操作。

在spring中的applicationContext.xml中,jndi与dataSource的写法区别?

1、SpringJNDI数据源配置信息:
  <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
   <property name="jndiName">
    <value>java:comp/env/jcptDataSourceJNDI</value>
   </property>
  </bean>
  红色部分是tomcat或者其他应用服务器配置的JNDI.
2、关于JNDI的配置(tomcat):
  <span style="color:#FF6666;">修改tomcat目录conf/context.xml文件:
  <Resource name="jcptDataSourceJNDI" auth="Container" type="javax.sql.DataSource"
      maxActive="100" maxIdle="30" maxWait="10000"   username="tysp"
      password="12345678" driverClassName="oracle.jdbc.driver.OracleDriver"
      url="jdbc:oracle:thin:@192.168.1.105:1521:OA"/>  </span>
3、通过JNDI获取DataSource:
  Context context = new InitialContext();
  DataSource ds = (DataSource)context.lookup("java:comp/env/jcptDataSourceJNDI");

1、Spring能很好的与各大框架进行集成
2、创建对象时,如果我们不用spring需要用工厂模式来创建,这个spring相当于工厂模式已经帮我们做了创建对象的功能(IOC、依赖注入)。
3、在用Hibernate的时候,如果不用spring每次都要写事务的提交代码,有了spring可以通过AOP帮助我们管理事务 
4、面向切面编程(AOP)在要记录日志的时候添加一条记录后需要在数据里同时添加一条添加成功了或失败的记录,那么就可以用Spring的Aop来处理,虽然不用Aop也能做但是不用Spring的Aop就会写很多重复的代码。

四、介绍一下Spring的事务管理

  • 事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。
  • 开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。

五、什么是依赖注入,依赖注入的作用是什么?

IOC是一种思想,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IOC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

依赖注入的作用:减少类间耦合度,避免用new来创建对象

六、什么是AOP,AOP的作用是什么?

  1. AOP,面向切面编程,就是把可重用的功能提取出来,然后将这些通用功能在合适的时候织入到应用程序中,比如事务管理、权限控制、日志记录、性能统计等。

  2. AOP并没有帮助我们解决任何新的问题,它只是提供了一种更好的办法,能够用更少的工作量来解决现有的一些问题,使得系统更加健壮,可维护性更好。

七、Spring中的BeanFactory与ApplicationContext的作用有哪些?

1、BeanFactory负责读取bean的配置文件,管理bean的加载、实例化,维护bean之间的依赖关系,负责bean的生命周期。
2、ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:
a. 国际化支持
b. 资源访问
c. 事件传递


(待续。。。)































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值