自己理解SSM框架可能问到的面试问题

  

  一、需要知道的SSM基础知识

     1.什么是Spring?

          Spring 是一款轻量级的 IOC (依赖反转) 和  APO (面向切面) 容器框架。(个人理解: 就是一个Bean对象容器,不用我们new 对象了,将对象的创建交给容器系统来管理了)

          常见的配置方式有三种 :

              1.基于 xml 的配置方式              2.基于注解的配置方式              3.基于Java的配置方式 (虽然这种我没怎么用过吧,但是确实是存在)

        

     2.Spring Bean对象的作用范围

          1 ) .  singleton :这种bean的范围是默认的,不管来了多少请求返回的都是这个对象,单例模式 ,正是这个原因(全局共享一个变量) 可能会造成线程不安全,但是只有 有状态Bean的时候才可能会出现  

              prototype : 原形范围与单例范围相反,为每一个请求都创建一个对象

              request :   在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

              session :与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。

              global-session :global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。(这个是直接复制粘贴的,并没有直接理解)

    3.Spring 用到的设计模式

         答:   简单工厂模式、工厂模式、代理模式、单例模式、模板模式......(暂时没有理解到的,还有好多)

       4.Spring 基于xml 注入bean的几种方法:

        答:

           1.set方法

           2.构造器方法    (两个参数同类型:可以使用index中)

          3.静态工厂方法

          4.实例工厂方法

    5.使用Spring的优点

          1.可以解耦合

          2.通过使用AOP可以方便的进行事务管理  、权限控制、日志管理

          3.Spring 对主流框架进行了支持如 Struts2  和 Hibernate等

    6.Spring事务管理的两种方式:

          1.编程式事务:在代码中使用编程来完成事务管理 ,硬编码不推荐使用 (这个我还真的没有具体使用过,等使用过在来发表评论)

          2.声明式事务: 在配置文件中进行声明配置,也可以使用注解进行配置   (推荐使用)

              申声明式事务也分为两种:

               1.基于注解的声明式事务

               2.基于xml的声明式事务

    7.Spring中的核心类有哪些?各有什么作用

          好吧,我坦言 在Spring中我知道的类没有几个,一个手都能数过来,希望以后能好好的读一下Spring 的底层源码,但是我知道的有以下两个

          BeanFactory : 对象的工厂,里面有对 对象的基本操作,比如说getBean,可以产生一个新的对象。

          ApplicationContext: 继承了BeanFactory 功能比  BeanFactory更多

           ..........

           未完。待续

    8.DI 和 IOC的理解

       

        一、IOC介绍

          IOC是控制反转。

          创建对象实例的控制权从代码控制剥离到IOC容器控制(之前的写法,由程序代码直接操控使用new关键字),实际就是你在xml文件控制,控制权的转移是所谓反转,侧重于原理。

        二、DI介绍

          DI是依赖注入

          创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现。

        三、区别

          1.它们是spring核心思想的不同方面的描述。

          2.依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。

              依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;

                   而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。

     9.什么是SpringMVC:

          SpringMVC是一款基于Java实现的MCV设计模式的一款轻量级web框架,他实现了web内容的解耦合。

       10.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响应用户

     11.SpringMVC 如何解决中文POST 和 GET请求乱码问题

            1.get请求 可以使用手动转换    String name = new String(xx.getBytes(“iso-8859-1”),”utf-8”);

                 如果不起作用的话可以修改  server.xml 和工程的编码都为 utf-8

            2.post 请求中文乱码问题解决方式

                在web.xml 文件中配置Spring中的  CharacterEncoding Filter

     12.SpringMVC如何响应JSON数据给Ajax使用

          1.使用Jaskon jar包

          2.配置ResponseBody  

          3.在配置文件中配置   <mvc:annotation-driven />

       13.什么是Mybatis?

            1. mybatis 是一款半ORM框架(他内部封装了JDBC的操作 是开发者专注于sql的编写,并不用关心驱动的加载,连接对象的创建、创建statement对象等复杂的操作过程)灵活性高。

            2.mybatis可以使用xml 或者注解来进行对Entity对象于数据库表中的字段进行对应,避免了JDBC返回结果集的设置

            3.通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。                        (这个是我抄的。。。。。)

      14.Mybatis的优点

            1.可以灵活的编写sql语句

            2.对各种数据库有很好的兼容

            3.与JDBC相比 减少了50%的代码,减少了大量的冗余代码,不用手动 创建和关闭连接  

            4.能够与Spring进行很好的集成

      15.Mybatis的缺点

             1.如果涉及的业务逻辑比较负责,涉及到多表关联,对程序开发人员的sql语句功底掌握要求较高

              2. 可移植性差   sql语句与具体使用的数据库有很大关系,如果更换数据库,sql语句可能需要重新编写。

      16.  ${} 和 #{}的区别

              # 是预编译处理

              $ 是字符串替换

            Mybatis  在处理 #{}  会将sql 中的#{} 替换成 ? 并调用  PreparedStatement的set方法来设置值

            Mybatis 在处理${}   会直接将sql 中的${} 直接替换成字符串  ,存在sql 注入问题

      

      17. 当实体类中的属性和表中的字段名称不一致该怎么解决?

            解决方案1: 在查询的sql 语句中定义字段的别名,让别名和类属性的名称一致

              

             <select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>
              select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};
          </select>

             

            解决方案2:   通过<resultMap>来映射字段名和实体类属性名的一一对应的关系。

              

           <select id="getOrder" parameterType="int" resultMap="orderresultmap">
          select * from orders where order_id=#{id}
         </select>          <resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
      <!–用id属性来映射主键字段–>
         <id property=”id” column=”order_id”>         <!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–>
        <result property = “orderno” column =”order_no”/>
        <result property=”price” column=”order_price” />
        </reslutMap>

  

    18.通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?

      Dao接口里的方法,参数不同时,方法能重载吗?

          Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法内的参数,就是传递给sql的参数。

Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MapperStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MapperStatement对象。

举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面 id 为 findStudentById 的 MapperStatement。

Mapper接口里的方法,是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略。Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql执行结果返回。

    ————————————————————————还有好多知识,但是日后在补充————————————————————————————————

 

  

《Java 面试问题 一 Spring 、SpringMVC 、Mybatis》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. uploadify ASP.net 使用笔记

    <script type="text/javascript" src="jquery.uploadify.min.js"></script & ...

  2. RAC,ReactiveSwift

    1.创建信号 // 1.通过信号发生器创建(冷信号) let producer = SignalProducer<String, NoError>.init { (observer, _) ...

  3. 等和的分隔子集(dp)

    晓萌希望将 1 到 N 的连续整数组成的集合划分成两个子集合,且保证每个集合的数字和是相等. 例如,对于 N = 3,对应的集合 1, 2, 3 能被划分成3和1,2两个子集合. 这两个子集合中元素分 ...

  4. 基于serverless快速部署前端项目到腾讯云

    腾讯云 COS 组件,可以快速部署静态网站页面到对象存储 COS 中,并生成域名供访问. 安装 首先要安装 serverless 组件 npm install -g serverless 在项目的根目 ...

  5. JavaSE--【转】网络安全之证书、密钥、密钥库等名词解释

    转载 http://www.cnblogs.com/alanfang/p/5600449.html 那些证书相关的名词解释(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等 ...

  6. 14 微服务电商【黑马乐优商城】:day02-springcloud(搭建Eureka注册中心)

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...

  7. 【ccf- csp201509-4】高速公路

    #include<iostream> using namespace std; void DFS(int**mat, int *mark,int *sp, int n, int p) { ...

  8. 1年6亿美元!Uber小费功能或引行业变革

    当一个行业由稚嫩走向成熟,必然要在大方向上面对两个选择--一是继续在行业内深挖,二是不断向外围扩张.就像电商行业原本只是纯粹的交易中介形态,现在既不断深挖垂直电商新模式,又继续拓展新业务试图玩转跨界. ...

  9. 许家印67亿买下FF恒大是要雪中送炭吗?

    从大环境来看,当下新能源汽车已经是备受投资者青睐的领域.据不完全统计,当下国内已经有300余家电动汽车企业.而蔚来.小鹏.威马等动辄都融资上百亿元,显现出火爆的发展趋势.甚至就连董明珠董大姐也有着自己 ...

  10. python中的变量引用小结

    python的变量都可以看成是内存中某个对象的引用.(变量指向该内存地址存储的值) 1.python中的可更改对象和不可更改对象 python中的对象可以分为可更改(mutable)对象与不可更改(i ...