《Java 面試問題 一 Spring 、SpringMVC 、Mybatis》


  自己理解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執行結果返回。

 

 

 

 

 

 

    ————————————————————————還有好多知識,但是日后在補充————————————————————————————————

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM