spring
七大模塊:
Spring的ioc、aop(核心):
IOC:
沒有Ioc之前所有類像鍾表齒輪一樣耦合在一起,環環相扣。Ioc作為第三方容器很好的解決了這個問題,但是容器生成對象是通過反射的方式,在運行效率上有一定的損耗,再就是配置比較繁瑣。
Inversion of Control 控制反轉。 我們以前開發,在一個類中使用其他類對象的時候都是采用new的方式直接獲取,或者高級一點是通過反射的方式的得到需要的對象實例。這就造成了程序的耦合度非常高,一個類的運行,嚴重依賴於其他的類。並且還會出現程序中硬編碼的情況。 而spring中的IoC很好的解決了該問題,我們在一個類中使用其他類對象時,只需要定義一個接口類型的類成員變量,由使用者在使用時為我們注入具體的實現類對象,從而降低了程序的耦合度。
實現IoC的思想就只有兩種:依賴注入(Dependency Injection,簡稱DI)和依賴查找(Dependency Lookup)。
而依賴注入使用的更廣泛一些。例如:構造函數注入,set方法注入等等。
AOP:
Aspect Oriented Programming 面向切面編程。
我們之前學習的java語言,號稱是面向對象編程,它有自己的優勢。但是也存在着一些弊端。 舉例說明,在實際開發中,我們都會有一根業務主線,即客戶(甲方)的需求。而程序員要做的就是圍繞業務主線上的需求,實現功能(實現功能的方法我們叫做業務核心方法)。但是不可避免的,會有一些功能與業務主線沒有關系,卻又不能不做,比如權限的控制,事務的控制,日志的記錄等等,這些功能絕大多數時候和業務主線沒有關系,但是卻和很多業務核心方法交織在一起,使我們的開發變得麻煩,並且冗余代碼增多。 而spring的提供了一種思想,把這些和業務主線沒有關系的功能剝離出來,而在需要使用這些公共方法時,適時適地的把它加到我們的代碼中去,使程序員在開發時,把更多的精力放在理解需求,實現業務核心功能上,並且讓我們的代碼變得簡潔。這種思想就是面向切面編程。
Spring實現面向切面編程使用的是動態代理技術,並且會根據實際情況來選擇使用基於子類的還是基於接口的動態代理。
簡單介紹控制反轉:
簡單介紹依賴注入:
spring管理事務的兩種方式:
1、編程式事務,在代碼中硬編碼。(不推薦使用)
2、聲明式事務,在配置文件中配置(推薦使用)
聲明式事務又分為兩種:
a、基於XML的聲明式事務
b、基於注解的聲明式事務
spring5種作用域:
1、singleton:單例模式,在整個Spring IoC容器中,使用singleton定義的Bean將只有一個實例
2、prototype:原型模式,每次通過容器的getBean方法獲取prototype定義的Bean時,都將產生一個新的Bean實例
3、request:對於每次HTTP請求,使用request定義的Bean都將產生一個新實例,即每次HTTP請求將會產生不同的Bean實例。
4、session:對於每次HTTP Session,使用session定義的Bean豆漿產生一個新實例。
5、globalsession:每個全局的HTTP Session,使用session定義的Bean都將產生一個新實例。
springMVC
對springMVC的理解:
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

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響應用戶
springMVC和struts2的區別有哪些:
1. springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。
2.springmvc是基於方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計為單例或多例(建議單例),struts2是基於類開發,傳遞參數是通過類的屬性,只能設計為多例。
3.Struts采用值棧存儲請求和響應的數據,通過OGNL存取數據,springmvc通過參數解析器是將request請求內容解析,並給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最后又將ModelAndView中的模型數據通過reques域傳輸到頁面。Jsp視圖解析器默認使用jstl。
mybatis
對mybatis的理解:
1. 對mybatis配置
2. SqlMapConfig.xml,此文件作為mybatis的全局配置文件,配置了mybatis的運行環境等信息。
3. mapper.xml文件即sql映射文件,文件中配置了操作數據庫的sql語句。此文件需要在SqlMapConfig.xml中加載。
4. 通過mybatis環境等配置信息構造SqlSessionFactory即會話工廠
5. 由會話工廠創建sqlSession即會話,操作數據庫需要通過sqlSession進行。
6. mybatis底層自定義了Executor執行器接口操作數據庫,Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器。
7. Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個Mapped Statement對象,sql的id即是Mapped statement的id。
8. Mapped Statement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql前將輸入的java對象映射至sql中,輸入參數映射就是jdbc編程中對preparedStatement設置參數。
9. Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql后將輸出結果映射至java對象中,輸出結果映射過程相當於jdbc編程中對結果的解析處理過程。
MyBatis編程步驟:
MyBatis的一級緩存和二級緩存:
JDBC編程有哪些不足之處,MyBatis是如何解決這些問題的:
SqlMapConfig.xml中配置的內容和順序如下:
使用MyBatis的mapper接口調用時有哪些要求:
----------------------------------------------------- 總 結 ----------------------------------------------------------------------
1.Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程序員自己編寫Sql語句,不過mybatis可以通過XML或注解方式靈活配置要運行的sql語句,並將java對象和sql語句映射生成最終執行的sql,最后將sql執行的結果再映射生成java對象。
2.Mybatis學習門檻低,簡單易學,程序員直接編寫原生態sql,可嚴格控制sql執行性能,靈活度高,非常適合對關系數據模型要求不高的軟件開發,例如互聯網軟件、企業運營類軟件等,因為這類軟件需求變化頻繁,一但需求變化要求成果輸出迅速。但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件則需要自定義多套sql映射文件,工作量大。
3.Hibernate對象/關系映射能力強,數據庫無關性好,對於關系模型要求高的軟件(例如需求固定的定制化軟件)如果用hibernate開發可以節省很多代碼,提高效率。但是Hibernate的學習門檻高,要精通門檻更高,而且怎么設計O/R映射,在性能和對象模型之間如何權衡,以及怎樣用好Hibernate需要具有很強的經驗和能力才行。
4. 總之,按照用戶的需求在有限的資源環境下只要能做出維護性、擴展性良好的軟件架構都是好架構,所以框架只有適合才是最好。