自己理解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. Python笔记_第四篇_高阶编程_魔法(术)方法详解(重载的再详解)

    1. 魔法方法是什么? 魔法方法(Magic Method)是Python比较独特的应用,它可以给你的类增加特殊的方法,如果你的对象实现了(重载),这些方法中的某一个,就会被Python所调用.正如装 ...

  2. LaunchPad(思维)

    链接:https://ac.nowcoder.com/acm/contest/3665/D来源:牛客网 题目描述 Hery is a boy with strong practical abiliti ...

  3. electron-builder打包跳过publish

    默认情况下执行 npm run release使用build命令打包时自动将打包好的安装程序发布到仓库,有时候不需要每次打包都上传到仓库,这时我们只需要在build命令后面加上参数-p never 即 ...

  4. springmvc中那些易被忽略的小知识点

    1.springmvc会为没有view的modelandview指定默认view 知道这个的时候我都惊呆了. 我从来都是手动指定view名字,今天看到别人写的代码竟然直接返回了个mav,貌似是在dis ...

  5. 吴裕雄--天生自然 PYTHON3开发学习:函数

    def 函数名(参数列表): 函数体 # 计算面积函数 def area(width, height): return width * height def print_welcome(name): ...

  6. 在拖放文件的同时检测shift键的状态

    老板要给原来文件拖放的功能加个扩展分类,于是想在文件拖放时判断shift键的状态来区分. 一般通过keydown和keyup来判断按下与否,但这都是需要控件事件触发,而在拖放的时候是没法触发key事件 ...

  7. Codeforces Round #556(Div.1)

    A 容易发现i,i+1至少有一个数出现,于是可以让尽量多的2和奇数出现 #include<bits/stdc++.h> using namespace std; int n,s1,s2; ...

  8. selenium登录网银,密码控件输入

    尝试登录农行网银,发现带控件的密码输入框怎么都无法输入啊 最后用虚拟键盘实现的  , DD模拟键盘 http://www.ddxoft.com/ 图形验证码识别没过,有时间再继续 需要安装  Tess ...

  9. c/c++[001]:start

    作为一个学校课程跳过c语言的萌新,这次重新学习c/c++从源头上明白这两种不同的输入输出还是很有必要 scanf()是C语言中的一个输入函数.与printf函数一样,都被声明在头文件stdio.h里, ...

  10. 记一次线上“no such file or directory”问题处理

    事件背景描述:项目是基于docker部署,在使用xxl-job的过程中,需要使用XxlJobLogger.log记录日志(非必须),项目定义日志其日志存储位置/home/logs.任务运行后包找不到文 ...