答:1)用於建立bean對象,管理bean對象的那個容器。前端
2)Spring IOC 容器本質上指的的就是Spring Bean容器,Spring Bean容器中最核心一個機制是IOC機制(控制反轉),java
因此有時候又將springbean容器稱之爲Spring IOC 容器.程序員
答:IOC 是Spring中提供一種控制反起色制,目的是將咱們項目中對象的依賴管理交給Spring實現,web
這樣能夠更好實現對象關係的解耦,提升程序的可擴展性.面試
答:DI 是Spring中的依賴注入機制,IOC的實現須要藉助這種機制.咱們一般會這樣理解,spring
Spring Bean容器中的IOC思想一種目標,DI是實現這種思想的目標的手段.sql
答:@Scope(「singleton」)數據庫
@Scope(「prototype」)編程
@Lazy(value=true)json
答:藉助反射機制,防止內存泄漏,對象已經不使用了但佔用着內存,這種現 象稱之爲內存泄漏,內存泄漏不是內存溢出,可是它是內存溢出的一個導火索. 內存溢出直接就致使系統崩潰了.
答:
一、客戶端發出一個http請求給web服務器,web服務器對http請求進 行 解析,若是匹配前端控制器(或分發器/DispatcherServlet)的請求映射路徑, web容器將請求轉交給DispatcherServlet.
二、DipatcherServlet接收到這個請求以後將根據請求的信息以及處理器映射 器(HandlerMapping)的配置找處處理請求的處理器(Handler)。
三、由具體的處理器適配器(HandlerAdapter)對Handler進行具體的調用。
四、Handler對數據處理完成之後將返回一個ModelAndView()對象給 DispatcherServlet。
五、DispatcherSevlet經過視圖解析器(ViewResolver)將ModelAndView()轉 化爲真正的視圖View。
六、Dispatcher經過model解析出ModelAndView()中的參數進行解析最終展 現出完整的view並返回給客戶端。
答:優勢在於:
1:可以實現全局事務的控制,經過EJB CMT進行事物的管理。
2:可以保證項目模塊在系統中完成的功能是可可控制的的操做(AOP)
缺點在於:
1:Spring中的事物聲明有編程式事物和申明是事物
相同點:都是經過get來獲取值的
不一樣點:$傳進去的字符串不帶引號 #號帶引號
答:有時候,固定的sql語句不可以知足咱們的應用需求。這個時候須要在 標準的基礎上創建動態的查詢語句。
Mybatis提供了多種註解,能夠提供動態查詢語言。
好比說在開發的時候,遇到這樣的場景,界面提供了多種查詢,可是都是非 必填寫,在選擇查詢條件時能夠選中任意幾種組合做爲查詢條件,若是在使 用jdbc的時候,須要判斷參數爲空,本身組裝sql,
可是mybatis提供動態sql機制,依靠標籤。
答:Shiro權限控制流程的原理:
應用代碼 —- 調用Subject (shiro的Subject 就表明當前登錄用戶) 控制權限 —- Subject 在shiro框架內部 調用 Shiro SecurityManager 安全管理器 —– 安全管理器調用 Realm (程序和安全數據鏈接器 )。
Subject要進行任何操做,都必需要調用安全管理器(對咱們來講是自動的)。
而安全管理器會調用指定的Realms對象,來鏈接安全數據。
Realms用來編寫安全代碼邏輯和訪問安全數據,是鏈接程序和安全數據的橋樑。
BeanFactory 能夠理解爲含有bean集合的工廠類。BeanFactory 包含了種bean的定義,以便在接收到客戶端請求時將對應的bean實例化。
BeanFactory還能在實例化對象時生成協做類之間的關係。此舉將bean自身與bean客戶端的配置中解放出來。BeanFactory還包含了bean生命週期的控制,調用客戶端的初始化方法(initialization methods)和銷燬方法(destruction methods)。
從表面上看,application context如同bean factory同樣具備bean定義、bean關聯關係的設置,根據請求分發bean的功能。但application context在此基礎上還提供了其餘的功能。
Spring Bean的生命週期簡單易懂。在一個bean實例被初始化時,須要執行一系列的初始化操做以達到可用的狀態。一樣,當一個bean不在被調用時須要進行相關的析構操做,並從bean容器中移除。
Spring bean factory 負責管理在spring容器中被建立的bean的生命週期。Bean的生命週期由兩組回調(call back)方法組成。
初始化以後調用的回調方法。
銷燬以前調用的回調方法。
Spring框架提供瞭如下四種方式來管理bean的生命週期事件:
1)InitializingBean和DisposableBean回調接口
2)針對特殊行爲的其餘Aware接口
3)Bean配置文件中的Custom init()方法和destroy()方法
4)@PostConstruct和@PreDestroy註解方式
使用customInit()和 customDestroy()方法管理bean生命週期的代碼樣例以下:
<beans> <bean id="demoBean" class="com.howtodoinjava.task.DemoBean" init-method="customInit" destroy-method="customDestroy"></bean> </beans>
Spring容器中的bean能夠分爲5個範圍。全部範圍的名稱都是自說明的,可是爲了不混淆,仍是讓咱們來解釋一下:
1)singleton:這種bean範圍是默認的,這種範圍確保無論接受到多少個請求,每一個容器中只有一個bean的實例,單例的模式由bean factory自身來維護。
2)prototype:原形範圍與單例範圍相反,爲每個bean請求提供一個實例。
3)request:在請求bean範圍內會每個來自客戶端的網絡請求建立一個實例,在請求完成之後,bean會失效並被垃圾回收器回收。
4)Session:與請求範圍相似,確保每一個session中有一個bean的實例,在session過時後,bean會隨之失效。
5)global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中工做時,它包含不少portlet。若是你想要聲明讓全部的portlet共用全局的存儲變量的話,那麼這全局變量須要存儲在global-session中。
全局做用域與Servlet中的session做用域效果相同。
關注點是應用中一個模塊的行爲,一個關注點可能會被定義成一個咱們想實現的一個功能。
橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,好比日誌,安全和數據傳輸,幾乎應用的每一個模塊都須要的功能。所以這些都屬於橫切關注點。
Spring框架中使用到了大量的設計模式,下面列舉了比較有表明性的:
Spring 多線程請求過來調用的Controller對象都是一個,而不是一個請求過來就建立一個Controller對象。
併發的安全? 緣由就在於Controller對象是單例的,那麼若是不當心在類中定義了類變量,那麼這個類變量是被全部請求共享的,這可能會形成多個請求修改該變量的值,出現與預期結果不符合的異常
那有沒有辦法讓Controller不以單例而以每次請求都從新建立的形式存在呢?
答案是固然能夠,只須要在類上添加註解@Scope(「prototype」)便可,這樣每次請求調用的類都是從新生成的(每次生成會影響效率)
雖然這樣能夠解決問題,但增長了時間成本,總讓人不爽,還有其餘方法麼?答案是確定的!
使用ThreadLocal來保存類變量,將類變量保存在線程的變量域中,讓不一樣的請求隔離開來。
輕量:Spring 是輕量的,基本的版本大約2MB。
控制反轉:Spring經過控制反轉實現了鬆散耦合,對象們給出它們的依賴,而不是建立或查找依賴的對象們。
面向切面的編程(AOP):Spring支持面向切面的編程,而且把應用業務邏輯和系統服務分開。
容器:Spring 包含並管理應用中對象的生命週期和配置。
MVC框架:Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。
事務管理:Spring 提供一個持續的事務管理接口,能夠擴展到上至本地事務下至全局事務(JTA)。
異常處理:Spring 提供方便的API把具體技術相關的異常(好比由JDBC,Hibernate or JDO拋出的)轉化爲一致的unchecked 異常。
Spring提供如下幾種集合的配置元素:
Spring支持以下兩種方式的事務管理:
編程式事務管理:這意味着你能夠經過編程的方式管理事務,這種方式帶來了很大的靈活性,但很難維護。
聲明式事務管理:這種方式意味着你能夠將事務管理和業務代碼分離。你只須要經過註解或者XML配置管理事務。
1)它爲不一樣的事務API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了統一的編程模型。
2)它爲編程式事務管理提供了一個簡單的API而非一系列複雜的事務API(如JTA).
3)它支持聲明式事務管理。
4)它能夠和Spring 的多種數據訪問技術很好的融合。
(1)前端控制器 DispatcherServlet(不須要程序員開發)
做用:接收請求、響應結果,至關於轉發器,有了DispatcherServlet 就減小了其它組件之間的耦合度。
(2)處理器映射器HandlerMapping(不須要程序員開發)
做用:根據請求的URL來查找Handler
(3)處理器適配器HandlerAdapter
注意:在編寫Handler的時候要按照HandlerAdapter要求的規則去編寫,這樣適配器HandlerAdapter才能夠正確的去執行Handler。
(4)處理器Handler(須要程序員開發)
(5)視圖解析器 ViewResolver(不須要程序員開發)
做用:進行視圖的解析,根據視圖邏輯名解析成真正的視圖(view)
(6)視圖View(須要程序員開發jsp)
View是一個接口, 它的實現類支持不一樣的視圖類型(jsp,freemarker,pdf等等)
經過Jackson框架就能夠把Java裏面的對象直接轉化成Js能夠識別的Json對象。具體步驟以下 :
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法裏面能夠直接返回Object,List等,但方法前面要加上
1. #{}是預編譯處理,${}是字符串替換。
2. Mybatis在處理#{}時,會將sql中的#{}替換爲?號,調用PreparedStatement的set方法來賦值;
3. Mybatis在處理${}時,就是把${}替換成變量的值,至關於字符串拼接
4. 使用#{}能夠有效的防止SQL注入,提升系統安全性。
一級緩存
默認開啓
SqlSession級別的緩存,實如今同一個會話中數據的共享
一級緩存的生命週期和SqlSession一致
當有多個SqlSession或者分佈式環境下,數據庫寫操做會引發髒數據。
二級緩存
默認不開啓,需手動開啓
SqlSessionFactory級別的緩存,實現不一樣會話中數據的共享,是一個全局變量
可自定義存儲源,如Ehcache
當開啓緩存後,數據查詢的執行的流程是:二級緩存>一級緩存>數據庫
不一樣於一級緩存,二級緩存可設置是否容許刷新和刷新頻率實現
實體類實現序列化,在mapper文件中開啓<c
ache>
在配置文件中設置cacheEnabled爲true
Springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。
Springmvc是基於方法開發,傳遞參數是經過方法形參,能夠設計爲單例或多例(建議單例),struts2是基於類開發,傳遞參數是經過類的屬性,只能設計爲多例。
先來看一下MyBatis 的編程式使用的方法:
public void testMapper() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); try { BlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlogById(1); System.out.println(blog); } finally { session.close(); } }
1.讀取配置文件,配置文件包含數據庫鏈接信息和Mapper映射文件或者Mapper包路徑。
2.有了這些信息就能建立SqlSessionFactory,SqlSessionFactory的生命週期是程序級,程序運行的時候創建起來,程序結束的時候消亡
3.SqlSessionFactory創建SqlSession,目的執行sql語句,SqlSession是過程級,一個方法中創建,方法結束應該關閉
4.當用戶使用mapper.xml文件中配置的的方法時,mybatis首先會解析sql動態標籤爲對應數據庫sql語句的形式,並將其封裝進MapperStatement對象,而後經過executor將sql注入數據庫執行,並返回結果。
5.將返回的結果經過映射,包裝成java對象。
接口映射就是在IBatis中任意定義接口,而後把接口裏面的方法和SQL語句綁定,咱們經過直接調用接口方法 例如:
UserMapper userMapper=sqlSession.getMapper (UserMapper.class) 就能夠,這樣比起原來了SqlSession提供的方法,
例如List<Country> countryList = sqlSession.selectList("selectAll");咱們能夠有更加靈活的選擇和設置.。
注意:(1)Mapper .xml文件的namespace屬性必須配置爲接口的全限定名稱,接口方法名與Mapper.xml中的<select><insert>id值必須相同,且接口方法的返回值類型必須與Mapper.xml配置的resultType一致,這裏後者起到決定做用。
(2)select查詢經過在Mapper.xml中配置ResultMap標籤,將查詢結果的列名與字段名對應。
insert語句經過#{屬性名}從接口參數獲取值放到sql語句中。
(3)Mapper.xml接口綁定本質是動態代理。
1)建立SqlSessionFactory
2)經過SqlSessionFactory建立SqlSession
3)經過SqlSession執行數據庫操做
4)調用session.commit()提交事務
5)調用session.close()關閉事務
JDBC編程的不足之處
1)數據庫連接建立、釋放頻繁形成系統資源浪費從而影響系統性能,若是使用數據庫連接池可解決此問題。
2)Sql語句寫在代碼中形成代碼不易維護,實際應用sql變化的可能較大,sql變更須要改變java代碼。
3)向sql語句傳參數麻煩,由於sql語句的where條件不必定,可能多也可能少,佔位符須要和參數一一對應。
4)對結果集解析麻煩,sql變化致使解析代碼變化,且解析前須要遍歷,若是能將數據庫記錄封裝成pojo對象解析比較方便。
MyBatis的解決方案
1)在SqlMapConfig.xml中配置數據連接池,使用鏈接池管理數據庫連接。
2)將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。
3)Mybatis自動將java對象映射至sql語句。
4)Mybatis自動將sql執行結果映射至java對象。
優勢
1)易於上手和掌握
2)Sql寫在xml裏面,便於統一管理和優化
3)減小Sql與程序代碼的耦合
4)提供xml標籤,支持動態Sql編寫
缺點
1)Sql工做量大,尤爲是字段多,關聯表多時,更是如此
2)Sql依賴於數據庫,致使數據庫移植性差
3)因爲xml裏面標籤id必須惟一,致使DAO中方法不支持方法重載。因此dao層必須是接口
Mapper接口方法名和mapper.xml中定義的每一個sql的id相同
Mapper接口方法的輸入參數類型和mapper.xml中定義的每一個sql 的parameterType的類型相同
Mapper接口方法的輸出參數類型和mapper.xml中定義的每一個sql的resultType的類型相同
Mapper.xml文件中的namespace便是mapper接口的類路徑
1. 是一個基於MVC的web框架
2. SpringMVC是Spring的一個模塊,是Spring的子容器,子容器能夠拿父容器的東西,可是父容器不能拿子容器的東西
3. SpringMVC的前端控制器DispatcherServlet,用於分發請求,使開發變得簡單
4. SpringMVC流程(重點). SpringMVC三大組件
1)HandlerMapping:處理器映射器
用戶請求路徑到Controller方法的映射
2)HandlerAdapter:處理器適配器
根據handler(controlelr類)的開發方式(註解開發/其餘開發) 方式的不一樣去尋找不一樣的處理器適配器
3)ViewResolver:視圖解析器
能夠解析JSP/freemarkerr/pdf等
答:1)Mybatis僅能夠編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,Mybatis經過動態代理,爲須要攔截的接口生成代理對象以實現接口方法攔截功能,每當執行這4種接口對象的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,固然,只會攔截那些你指定須要攔截的方法。
2)實現Mybatis的Interceptor接口並複寫intercept()方法,而後在給插件編寫註解,指定要攔截哪個接口的哪些方法便可,記住,別忘了在配置文件中配置你編寫的插件。
答:1)Mybatis動態sql可讓咱們在Xml映射文件內,以標籤的形式編寫動態sql,完成邏輯判斷和動態拼接sql的功能。2)Mybatis提供了9種動態sql標籤:trim|where|set|foreach|if|choose|when|otherwise|bind。
3)其執行原理爲,使用OGNL從sql參數對象中計算表達式的值,根據表達式的值動態拼接sql,以此來完成動態sql的功能。
答:1)Mybatis僅支持association關聯對象和collection關聯集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置文件中,能夠配置是否啓用延遲加載lazyLoadingEnabled=true|false。
2)它的原理是,使用CGLIB建立目標對象的代理對象,當調用目標方法時,進入攔截器方法,好比調用a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那麼就會單獨發送事先保存好的查詢關聯B對象的sql,把B查詢上來,而後調用a.setB(b),因而a的對象b屬性就有值了,接着完成a.getB().getName()方法的調用。這就是延遲加載的基本原理。
答:能,Mybatis不只能夠執行一對1、一對多的關聯查詢,還能夠執行多對一,多對多的關聯查詢,多對一查詢,其實就是一對一查詢,只須要把selectOne()修改成selectList()便可;多對多查詢,其實就是一對多查詢,只須要把selectOne()修改成selectList()便可。
關聯對象查詢,有兩種實現方式,一種是單獨發送一個sql去查詢關聯對象,賦給主對象,而後返回主對象。另外一種是使用嵌套查詢,嵌套查詢的含義爲使用join查詢,一部分列是A對象的屬性值,另一部分列是關聯對象B的屬性值,好處是隻發一個sql查詢,就能夠把主對象和其關聯對象查出來。
答:第一種是使用<resultMap>標籤,逐必定義列名和對象屬性名之間的映射關係。
第二種是使用sql列的別名功能,將列別名書寫爲對象屬性名,好比T_NAME AS NAME,對象屬性名通常是name,小寫,可是列名不區分大小寫,Mybatis會忽略列名大小寫,智能找到與之對應對象屬性名,你甚至能夠寫成T_NAME AS NaMe,Mybatis同樣能夠正常工做。
答:雖然Mybatis解析Xml映射文件是按照順序解析的,可是,被引用的B標籤依然能夠定義在任何地方,Mybatis均可以正確識別。原理是,Mybatis解析A標籤,發現A標籤引用了B標籤,可是B標籤還沒有解析到,尚不存在,此時,Mybatis會將A標籤標記爲未解析狀態,而後繼續解析餘下的標籤,包含B標籤,待全部標籤解析完畢,Mybatis會從新解析那些被標記爲未解析的標籤,此時再解析A標籤時,B標籤已經存在,A標籤也就能夠正常解析完成了。
答:MyBatis裏面的動態Sql通常是經過if節點來實現,經過OGNL語法來實現,可是若是要寫的完整,必須配合where、trim節點,where節點是判斷包含節點有內容就插入where,不然不插入,trim節點是用來判斷若是動態語句是以and 或or開始,那麼會自動把這個and或者or取掉 。
SimpleExecutor:每執行一次update或select,就開啓一個Statement對象,用完馬上關閉Statement對象。
ReuseExecutor:執行update或select,以sql做爲key查找Statement對象,存在就使用,不存在就建立,用完後,不關閉Statement對象,而是放置於Map<String, Statement>內,供下一次使用。簡言之,就是重複使用Statement對象。
BatchExecutor:執行update(沒有select,JDBC批處理不支持select),將全部sql都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象,每一個Statement對象都是addBatch()完畢後,等待逐一執行executeBatch()批處理。與JDBC批處理相同。
做用範圍:Executor的這些特色,都嚴格限制在SqlSession生命週期範圍內。
答:Hibernate屬於全自動ORM映射工具,使用Hibernate查詢關聯對象或者關聯集合對象時,能夠根據對象關係模型直接獲取,因此它是全自動的。而Mybatis在查詢關聯對象或關聯集合對象時,須要手動編寫sql來完成,因此,稱之爲半自動ORM映射工具。
面試題看似都很簡單,可是想要能正確回答上來,一定是研究過源碼且深刻的人,而不是僅會使用的人或者用的很熟的人,以上全部面試題及其答案所涉及的內容,在個人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編程中對結果的解析處理過程。
事務就是對一系列的數據庫操做(好比插入多條數據)進行統一的提交或回滾操做,若是插入成功,那麼一塊兒成功,若是中間有一條出現異常,那麼回滾以前的全部操做。這樣能夠防止出現髒數據,防止數據庫數據出現問題。
開發中爲了不這種狀況通常都會進行事務管理。Spring中也有本身的事務管理機制,通常是使用TransactionMananger進行管 理,能夠經過Spring的注入來完成此功能。
Spring支持以下兩種方式的事務管理:
編程式事務管理:這意味着你能夠經過編程的方式管理事務,這種方式帶來了很大的靈活性,但很難維護。
聲明式事務管理:這種方式意味着你能夠將事務管理和業務代碼分離。你只須要經過註解或者XML配置管理事務。
通常選擇聲明式事務管理,由於這種方式和應用程序的關聯較少。
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. 總之,按照用戶的需求在有限的資源環境下只要能作出維護性、擴展性良好的軟件架構都是好架構,因此框架只有適合纔是最好。
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的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。
springmvc是基於方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,能夠設計爲單例或多例(建議單例),struts2是基於類開發,傳遞參數是經過類的屬性,只能設計爲多例。
Struts採用值棧存儲請求和響應的數據,經過OGNL存取數據, springmvc經過參數解析器是將request請求內容解析,並給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最後又將ModelAndView中的模型數據經過reques域傳輸到頁面。Jsp視圖解析器默認使用jstl。
答案1
系統啓動的時候根據配置文件建立spring的容器,首先是發送http請求到核心控制器DispatcherServlet,spring容器經過映射器去尋找業務控制器,使用適配器找到相應的業務類,在進業務類時進行數據封裝,在封裝前可能會涉及到類型轉換,執行完業務類後使用ModelAndView進行視圖轉發,數據放在model中,用map傳遞數據進行頁面顯示。
答案2
Application contexts提供一種方法處理文本消息,一個一般的作法是加載文件資源(好比鏡像),它們能夠向註冊爲監聽器的bean發佈事件。另外,在容器或容器內的對象上執行的那些不得不禁bean工廠以程序化方式處理的操做,能夠在Application contexts中以聲明的方式處理。Application contexts實現了MessageSource接口,該接口的實現以可插拔的方式提供獲取本地化消息的方法。
Spring框架支持如下五種bean的做用域:
singleton : bean在每一個Spring ioc 容器中只有一個實例。
prototype:一個bean的定義能夠有多個實例。
request:每次http請求都會建立一個bean,該做用域僅在基於web的Spring ApplicationContext情形下有效。
session:在一個HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於web的Spring ApplicationContext情形下有效。
global-session:在一個全局的HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於web的Spring ApplicationContext情形下有效。
缺省的Spring bean 的做用域是Singleton。
Spring 容器可以自動裝配相互合做的bean,這意味着容器不須要<constructor-arg>和<property>配置,能經過Bean工廠自動處理bean之間的協做。
基於Java的配置,容許你在少許的Java註解的幫助下,進行你的大部分Spring配置而非經過XML文件。
以@Configuration 註解爲例,它用來標記類能夠當作一個bean的定義,被Spring IOC容器使用。另外一個例子是@Bean註解,它表示此方法將要返回一個對象,做爲一個bean註冊進Spring應用上下文。
在Spring中有兩種方式訪問Hibernate:
控制反轉 Hibernate Template和 Callback。
繼承 HibernateDAOSupport提供一個AOP 攔截器。
用Spring的 SessionFactory 調用 LocalSessionFactory。集成過程分三步:
配置the Hibernate SessionFactory。
繼承HibernateDaoSupport實現一個DAO。
在AOP支持的事務中裝配。
它爲不一樣的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的編程模式。
它爲編程式事務管理提供了一套簡單的API而不是一些複雜的事務API如
它支持聲明式事務管理。
它和Spring各類數據訪問抽象層很好得集成。
關注點是應用中一個模塊的行爲,一個關注點可能會被定義成一個咱們想實現的一個功能。
橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,好比日誌,安全和數據傳輸,幾乎應用的每一個模塊都須要的功能。所以這些都屬於橫切關注點。
AOP:面向切面編程:將一個系統中共同的業務邏輯提取出來,進行單獨的封裝成一個組件(切面),而後以配置的方式做用於系統中,實現程序的可插拔性,提升代碼的複用性,提高系統的靈活性和性能
底層實現:JDK動態代理,只支持接口注入CGLIB:能夠支持普通類的注入
那些地方會用到:事物開啓,日誌記錄,安全驗證,權限驗證
切面:系統中共通的業務提取出來,在某個時刻或者某個階段共同調用
切入點:找到目標方法,給它追加共通的業務邏輯,在spring中提供了切入點表達式幫助咱們找到目標方法execution
通知:何時調用這個共通的業務邏輯,用於指定切面方法做用到系統中的時機.前置通知,後置通知,環繞通知,異常通知,最終通知。
AutoWried:按照類型進行匹配—spring框架自帶的,查看當前Spring容器中那個bean類型和引用類型一致,就進行注入,若是有多個匹配類型就會報錯.
Resource:默認按照名稱進行注入,若是找不到對應的名稱按照bean類型進行注入 。
答:MyBatis裏面的動態Sql通常是經過if節點來實現,經過OGNL語法來實現,可是若是要寫的完整,必須配合where、trim節點,where節點是判斷包含節點有內容就插入where,不然不插入,trim節點是用來判斷若是動態語句是以and 或or開始,那麼會自動把這個and或者or取掉 。
ending...