自己理解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執行結果返回。
————————————————————————還有好多知識,但是日后在補充————————————————————————————————