1.1 何為Spring Bean容器?Spring Bean容器與Spring IOC 容器有什么不同嗎?
答:1)用於創建bean對象,管理bean對象的那個容器。
2)Spring IOC 容器本質上指的的就是Spring Bean容器,Spring Bean容器中最核心一個機制是IOC機制(控制反轉),
所以有時候又將springbean容器稱之為Spring IOC 容器.
1.2 Spring IOC 如何理解?
答:IOC 是Spring中提供一種控制反轉機制,目的是將我們項目中對象的依賴管理交給Spring實現,
這樣可以更好實現對象關系的解耦,提高程序的可擴展性.
1.3 Spring DI 如何理解?
答:DI 是Spring中的依賴注入機制,IOC的實現需要借助這種機制.我們通常會這樣理解,
Spring Bean容器中的IOC思想一種目標,DI是實現這種思想的目標的手段.
1.4 Spring 中基於注解如何配置對象作用域?以及如何配置延遲加載機制?
答:@Scope(“singleton”)
@Scope(“prototype”)
@Lazy(value=true)
1.5 Spring 工廠底層構建Bean對象借助什么機制?當對象不使用了要釋放資源,目的是什么?何為內存泄漏?
答:借助反射機制,防止內存泄漏,對象已經不使用了但占用着內存,這種現 象稱之為內存泄漏,內存泄漏不是內存溢出,但是它是內存溢出的一個導火索. 內存溢出直接就導致系統崩潰了.
1.6 描述Spring MVC處理流程及應用優勢
答:
1、客戶端發出一個http請求給web服務器,web服務器對http請求進 行 解析,如果匹配前端控制器(或分發器/DispatcherServlet)的請求映射路徑, web容器將請求轉交給DispatcherServlet.
2、DipatcherServlet接收到這個請求之后將根據請求的信息以及處理器映射 器(HandlerMapping)的配置找到處理請求的處理器(Handler)。
3、由具體的處理器適配器(HandlerAdapter)對Handler進行具體的調用。
4、Handler對數據處理完成以后將返回一個ModelAndView()對象給 DispatcherServlet。
5、DispatcherSevlet通過視圖解析器(ViewResolver)將ModelAndView()轉 化為真正的視圖View。
6、Dispatcher通過model解析出ModelAndView()中的參數進行解析最終展 現出完整的view並返回給客戶端。
1.7 Spring中的事務處理方式及優缺點
答:優點在於:
1:能夠實現全局事務的控制,通過EJB CMT進行事物的管理。
2:能夠保證項目模塊在系統中完成的功能是可可控制的的操作(AOP)
缺點在於:
1:Spring中的事物聲明有編程式事物和申明是事物
1.8 MyBatis應用中#與$有什么異同點
相同點:都是通過get來獲取值的
不同點:$傳進去的字符串不帶引號 #號帶引號
1.9 MyBatis應用動態SQL解決了什么問題
答:有時候,固定的sql語句不能夠滿足我們的應用需求。這個時候需要在 標准的基礎上建立動態的查詢語句。
Mybatis提供了多種注解,可以提供動態查詢語言。
比如說在開發的時候,遇到這樣的場景,界面提供了多種查詢,但是都是非 必填寫,在選擇查詢條件時可以選中任意幾種組合作為查詢條件,如果在使 用jdbc的時候,需要判斷參數為空,自己組裝sql,
但是mybatis提供動態sql機制,依靠標簽。
1.10 Shiro框架權限管理時的認證和授權流程描述.
答:Shiro權限控制流程的原理:
應用代碼 —- 調用Subject (shiro的Subject 就代表當前登陸用戶) 控制權限 —- Subject 在shiro框架內部 調用 Shiro SecurityManager 安全管理器 —– 安全管理器調用 Realm (程序和安全數據連接器 )。
Subject要進行任何操作,都必須要調用安全管理器(對我們來說是自動的)。
而安全管理器會調用指定的Realms對象,來連接安全數據。
Realms用來編寫安全代碼邏輯和訪問安全數據,是連接程序和安全數據的橋梁。
1.11 BeanFactory和ApplicationContext有什么區別?
BeanFactory 可以理解為含有bean集合的工廠類。BeanFactory 包含了種bean的定義,以便在接收到客戶端請求時將對應的bean實例化。
BeanFactory還能在實例化對象時生成協作類之間的關系。此舉將bean自身與bean客戶端的配置中解放出來。BeanFactory還包含了bean生命周期的控制,調用客戶端的初始化方法(initialization methods)和銷毀方法(destruction methods)。
從表面上看,application context如同bean factory一樣具有bean定義、bean關聯關系的設置,根據請求分發bean的功能。但application context在此基礎上還提供了其他的功能。
1.12 請解釋Spring Bean的生命周期?
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>
1.13 Spring Bean的作用域之間有什么區別?
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作用域效果相同。
1.14 在Spring AOP 中,關注點和橫切關注的區別是什么?
關注點是應用中一個模塊的行為,一個關注點可能會被定義成一個我們想實現的一個功能。
橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,比如日志,安全和數據傳輸,幾乎應用的每個模塊都需要的功能。因此這些都屬於橫切關注點。
1.15 使用Spring框架的好處是什么?
- 輕量:Spring 是輕量的,基本的版本大約2MB。
- 控制反轉:Spring通過控制反轉實現了松散耦合,對象們給出它們的依賴,而不是創建或查找依賴的對象們。
- 面向切面的編程(AOP):Spring支持面向切面的編程,並且把應用業務邏輯和系統服務分開。
- 容器:Spring 包含並管理應用中對象的生命周期和配置。
- MVC框架:Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。
- 事務管理:Spring 提供一個持續的事務管理接口,可以擴展到上至本地事務下至全局事務(JTA)。
- 異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC,Hibernate or JDO拋出的)轉化為一致的unchecked 異常。
1.16 Spring 中用到了那些設計模式?
Spring框架中使用到了大量的設計模式,下面列舉了比較有代表性的:
- 代理模式—在AOP和remoting中被用的比較多。
- 單例模式—在spring配置文件中定義的bean默認為單例模式。
- 模板方法—用來解決代碼重復的問題。比如. RestTemplate, JmsTemplate, JpaTemplate。
- 工廠模式—BeanFactory用來創建對象的實例。
- 適配器–spring aop
- 裝飾器–spring data hashmapper
- 觀察者– spring 時間驅動模型
- 回調–Spring ResourceLoaderAware回調接口
1.17 Spring 如何保證 Controller 並發的安全?
Spring 多線程請求過來調用的Controller對象都是一個,而不是一個請求過來就創建一個Controller對象。
並發的安全? 原因就在於Controller對象是單例的,那么如果不小心在類中定義了類變量,那么這個類變量是被所有請求共享的,這可能會造成多個請求修改該變量的值,出現與預期結果不符合的異常
那有沒有辦法讓Controller不以單例而以每次請求都重新創建的形式存在呢?
答案是當然可以,只需要在類上添加注解@Scope(“prototype”)即可,這樣每次請求調用的類都是重新生成的(每次生成會影響效率)
雖然這樣可以解決問題,但增加了時間成本,總讓人不爽,還有其他方法么?答案是肯定的!
使用ThreadLocal來保存類變量,將類變量保存在線程的變量域中,讓不同的請求隔離開來。
1.18 使用Spring框架的好處是什么?
輕量:Spring 是輕量的,基本的版本大約2MB。
控制反轉:Spring通過控制反轉實現了松散耦合,對象們給出它們的依賴,而不是創建或查找依賴的對象們。
面向切面的編程(AOP):Spring支持面向切面的編程,並且把應用業務邏輯和系統服務分開。
容器:Spring 包含並管理應用中對象的生命周期和配置。
MVC框架:Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。
事務管理:Spring 提供一個持續的事務管理接口,可以擴展到上至本地事務下至全局事務(JTA)。
異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC,Hibernate or JDO拋出的)轉化為一致的unchecked 異常。
1.19 在 Spring中如何注入一個java集合?
Spring提供以下幾種集合的配置元素:
- <list>類型用於注入一列值,允許有相同的值。
- <set> 類型用於注入一組值,不允許有相同的值。
- <map> 類型用於注入一組鍵值對,鍵和值都可以為任意類型。
- <props>類型用於注入一組鍵值對,鍵和值都只能為String類型
1.20 Spring支持的事務管理類型
Spring支持如下兩種方式的事務管理:
編程式事務管理:這意味着你可以通過編程的方式管理事務,這種方式帶來了很大的靈活性,但很難維護。
聲明式事務管理:這種方式意味着你可以將事務管理和業務代碼分離。你只需要通過注解或者XML配置管理事務。
1.21 Spring框架的事務管理有哪些優點?
1)它為不同的事務API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了統一的編程模型。
2)它為編程式事務管理提供了一個簡單的API而非一系列復雜的事務API(如JTA).
3)它支持聲明式事務管理。
4)它可以和Spring 的多種數據訪問技術很好的融合。
1.22 Spring MVC的主要組件?
(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等等)
1.23 SpringMvc怎么和AJAX相互調用的?
通過Jackson框架就可以把Java里面的對象直接轉化成Js可以識別的Json對象。具體步驟如下 :
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上
1.24 Mybatis 中#和$的區別?
1. #{}是預編譯處理,${}是字符串替換。
2. Mybatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值;
3. Mybatis在處理${}時,就是把${}替換成變量的值,相當於字符串拼接
4. 使用#{}可以有效的防止SQL注入,提高系統安全性。
1.25 mybatis的緩存機制,一級,二級介紹一下
一級緩存
默認開啟
SqlSession級別的緩存,實現在同一個會話中數據的共享
一級緩存的生命周期和SqlSession一致
當有多個SqlSession或者分布式環境下,數據庫寫操作會引起臟數據。
二級緩存
默認不開啟,需手動開啟
SqlSessionFactory級別的緩存,實現不同會話中數據的共享,是一個全局變量
可自定義存儲源,如Ehcache
當開啟緩存后,數據查詢的執行的流程是:二級緩存>一級緩存>數據庫
不同於一級緩存,二級緩存可設置是否允許刷新和刷新頻率實現
實體類實現序列化,在mapper文件中開啟<c
ache>
在配置文件中設置cacheEnabled為true
1.26 SpringMVC與Struts2的區別
Springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。
Springmvc是基於方法開發,傳遞參數是通過方法形參,可以設計為單例或多例(建議單例),struts2是基於類開發,傳遞參數是通過類的屬性,只能設計為多例。
1.27 mybatis的基本工作流程
先來看一下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對象。
1.28 什么是MyBatis的接口綁定,有什么好處
接口映射就是在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.29 MyBatis的編程步驟
1)創建SqlSessionFactory
2)通過SqlSessionFactory創建SqlSession
3)通過SqlSession執行數據庫操作
4)調用session.commit()提交事務
5)調用session.close()關閉事務
1.30 JDBC編程有哪些不足之處,MyBatis是如何解決這些問題的?
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.31 MyBatis的優缺點
優點
1)易於上手和掌握
2)Sql寫在xml里面,便於統一管理和優化
3)減少Sql與程序代碼的耦合
4)提供xml標簽,支持動態Sql編寫
缺點
1)Sql工作量大,尤其是字段多,關聯表多時,更是如此
2)Sql依賴於數據庫,導致數據庫移植性差
3)由於xml里面標簽id必須唯一,導致DAO中方法不支持方法重載。所以dao層必須是接口
1.32 使用MyBatis的mapper接口調用時有哪些要求?
Mapper接口方法名和mapper.xml中定義的每個sql的id相同
Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql 的parameterType的類型相同
Mapper接口方法的輸出參數類型和mapper.xml中定義的每個sql的resultType的類型相同
Mapper.xml文件中的namespace即是mapper接口的類路徑
1.33 談談你對SpringMVC的理解
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.34 簡述Mybatis的插件運行原理,以及如何編寫一個插件?
答:1)Mybatis僅可以編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,Mybatis通過動態代理,為需要攔截的接口生成代理對象以實現接口方法攔截功能,每當執行這4種接口對象的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法。
2)實現Mybatis的Interceptor接口並復寫intercept()方法,然后在給插件編寫注解,指定要攔截哪一個接口的哪些方法即可,記住,別忘了在配置文件中配置你編寫的插件。
1.35 Mybatis動態sql是做什么的?都有哪些動態sql?能簡述一下動態sql的執行原理不?
答: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.36 Mybatis是否支持延遲加載?如果支持,它的實現原理是什么?
答: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()方法的調用。這就是延遲加載的基本原理。
1.37 Mybatis能執行一對一、一對多的關聯查詢嗎?都有哪些實現方式,以及它們之間的區別?
答:能,Mybatis不僅可以執行一對一、一對多的關聯查詢,還可以執行多對一,多對多的關聯查詢,多對一查詢,其實就是一對一查詢,只需要把selectOne()修改為selectList()即可;多對多查詢,其實就是一對多查詢,只需要把selectOne()修改為selectList()即可。
關聯對象查詢,有兩種實現方式,一種是單獨發送一個sql去查詢關聯對象,賦給主對象,然后返回主對象。另一種是使用嵌套查詢,嵌套查詢的含義為使用join查詢,一部分列是A對象的屬性值,另外一部分列是關聯對象B的屬性值,好處是只發一個sql查詢,就可以把主對象和其關聯對象查出來。
1.38 Mybatis是如何將sql執行結果封裝為目標對象並返回的?都有哪些映射形式?
答:第一種是使用<resultMap>標簽,逐一定義列名和對象屬性名之間的映射關系。
第二種是使用sql列的別名功能,將列別名書寫為對象屬性名,比如T_NAME AS NAME,對象屬性名一般是name,小寫,但是列名不區分大小寫,Mybatis會忽略列名大小寫,智能找到與之對應對象屬性名,你甚至可以寫成T_NAME AS NaMe,Mybatis一樣可以正常工作。
1.39 Mybatis映射文件中,如果A標簽通過include引用了B標簽的內容,請問,B標簽能否定義在A標簽的后面,還是說必須定義在A標簽的前面?
答:雖然Mybatis解析Xml映射文件是按照順序解析的,但是,被引用的B標簽依然可以定義在任何地方,Mybatis都可以正確識別。原理是,Mybatis解析A標簽,發現A標簽引用了B標簽,但是B標簽尚未解析到,尚不存在,此時,Mybatis會將A標簽標記為未解析狀態,然后繼續解析余下的標簽,包含B標簽,待所有標簽解析完畢,Mybatis會重新解析那些被標記為未解析的標簽,此時再解析A標簽時,B標簽已經存在,A標簽也就可以正常解析完成了。
1.40 MyBatis里面的動態Sql是怎么設定的?用什么語法?
答:MyBatis里面的動態Sql一般是通過if節點來實現,通過OGNL語法來實現,但是如果要寫的完整,必須配合where、trim節點,where節點是判斷包含節點有內容就插入where,否則不插入,trim節點是用來判斷如果動態語句是以and 或or開始,那么會自動把這個and或者or取掉 。
1.41 Mybatis都有哪些Executor執行器?它們之間的區別是什么?
答:Mybatis有三種基本的Executor執行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
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生命周期范圍內。
1.42 為什么說Mybatis是半自動ORM映射工具?它與全自動的區別在哪里?
答:Hibernate屬於全自動ORM映射工具,使用Hibernate查詢關聯對象或者關聯集合對象時,可以根據對象關系模型直接獲取,所以它是全自動的。而Mybatis在查詢關聯對象或關聯集合對象時,需要手動編寫sql來完成,所以,稱之為半自動ORM映射工具。
面試題看似都很簡單,但是想要能正確回答上來,必定是研究過源碼且深入的人,而不是僅會使用的人或者用的很熟的人,以上所有面試題及其答案所涉及的內容,在我的Mybatis系列博客中都有詳細講解和原理分析。
1.43 簡單介紹下你對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編程中對結果的解析處理過程。
1.44 介紹一下Spring的事物管理
事務就是對一系列的數據庫操作(比如插入多條數據)進行統一的提交或回滾操作,如果插入成功,那么一起成功,如果中間有一條出現異常,那么回滾之前的所有操作。這樣可以防止出現臟數據,防止數據庫數據出現問題。
開發中為了避免這種情況一般都會進行事務管理。Spring中也有自己的事務管理機制,一般是使用TransactionMananger進行管 理,可以通過Spring的注入來完成此功能。
Spring支持如下兩種方式的事務管理:
編程式事務管理:這意味着你可以通過編程的方式管理事務,這種方式帶來了很大的靈活性,但很難維護。
聲明式事務管理:這種方式意味着你可以將事務管理和業務代碼分離。你只需要通過注解或者XML配置管理事務。
一般選擇聲明式事務管理,因為這種方式和應用程序的關聯較少。
1.45 SSM優缺點、使用場景?
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.46 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響應用戶
1.47 如果你也用過struts2,簡單介紹下springMVC和struts2的區別有哪些?
springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。
springmvc是基於方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計為單例或多例(建議單例),struts2是基於類開發,傳遞參數是通過類的屬性,只能設計為多例。
Struts采用值棧存儲請求和響應的數據,通過OGNL存取數據, springmvc通過參數解析器是將request請求內容解析,並給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最后又將ModelAndView中的模型數據通過reques域傳輸到頁面。Jsp視圖解析器默認使用jstl。
1.48 怎么樣把數據放入Session里面 ?
可以聲明一個request,或者session先拿到session,然后就可以放入數據,或者可以在類上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key
1.49 講下SpringMvc的執行流程 ?
答案1
系統啟動的時候根據配置文件創建spring的容器,首先是發送http請求到核心控制器DispatcherServlet,spring容器通過映射器去尋找業務控制器,使用適配器找到相應的業務類,在進業務類時進行數據封裝,在封裝前可能會涉及到類型轉換,執行完業務類后使用ModelAndView進行視圖轉發,數據放在model中,用map傳遞數據進行頁面顯示。
答案2
-
1)一個請求匹配前端控制器 DispatcherServlet 的請求映射路徑(在 web.xml中指定), WEB 容器將該請求轉交給 DispatcherServlet 處理
-
2)DispatcherServlet 接收到請求后, 將根據 請求信息 交給 處理器映射器 (HandlerMapping)
-
3)HandlerMapping 根據用戶的url請求 查找匹配該url的 Handler,並返回一個執行鏈
-
4)DispatcherServlet 再請求 處理器適配器(HandlerAdapter) 調用相應的 Handler 進行處理並返回 ModelAndView 給 DispatcherServlet
-
5)DispatcherServlet 將 ModelAndView 請求 ViewReslover(視圖解析器)解析,返回具體 View
-
6)DispatcherServlet 對 View 進行渲染視圖(即將模型數據填充至視圖中)
-
7)DispatcherServlet 將頁面響應給用戶
1.50 MyBatis(IBatis)的好處是什么?
ibatis把sql語句從Java源程序中獨立出來,放在單獨的XML文件中編寫,給程序的
維護帶來了很大便利。
ibatis封裝了底層JDBC API的調用細節,並能自動將結果集轉換成JavaBean對象,大大簡化了Java數據庫編程的重復工作。
因為Ibatis需要程序員自己去編寫sql語句,程序員可以結合數據庫自身的特點靈活控制sql語句,
因此能夠實現比hibernate等全自動orm框架更高的查詢效率,能夠完成復雜查詢。
1.51 Bean 工廠和 Application contexts 有什么區別?
Application contexts提供一種方法處理文本消息,一個通常的做法是加載文件資源(比如鏡像),它們可以向注冊為監聽器的bean發布事件。另外,在容器或容器內的對象上執行的那些不得不由bean工廠以程序化方式處理的操作,可以在Application contexts中以聲明的方式處理。Application contexts實現了MessageSource接口,該接口的實現以可插拔的方式提供獲取本地化消息的方法。
1.52 解釋Spring支持的幾種bean的作用域
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。
1.53 什么是bean的自動裝配?
Spring 容器能夠自動裝配相互合作的bean,這意味着容器不需要<constructor-arg>和<property>配置,能通過Bean工廠自動處理bean之間的協作。
1.54 什么是基於Java的Spring注解配置? 給一些注解的例子。
基於Java的配置,允許你在少量的Java注解的幫助下,進行你的大部分Spring配置而非通過XML文件。
以@Configuration 注解為例,它用來標記類可以當做一個bean的定義,被Spring IOC容器使用。另一個例子是@Bean注解,它表示此方法將要返回一個對象,作為一個bean注冊進Spring應用上下文。
1.55 使用Spring通過什么方式訪問Hibernate?
在Spring中有兩種方式訪問Hibernate:
控制反轉 Hibernate Template和 Callback。
繼承 HibernateDAOSupport提供一個AOP 攔截器。
1.56 如何通過HibernateDaoSupport將Spring和Hibernate結合起來?
用Spring的 SessionFactory 調用 LocalSessionFactory。集成過程分三步:
配置the Hibernate SessionFactory。
繼承HibernateDaoSupport實現一個DAO。
在AOP支持的事務中裝配。
1.57 Spring框架的事務管理有哪些優點?
它為不同的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的編程模式。
它為編程式事務管理提供了一套簡單的API而不是一些復雜的事務API如
它支持聲明式事務管理。
它和Spring各種數據訪問抽象層很好得集成。
1.58 在Spring AOP 中,關注點和橫切關注的區別是什么?
關注點是應用中一個模塊的行為,一個關注點可能會被定義成一個我們想實現的一個功能。
橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,比如日志,安全和數據傳輸,幾乎應用的每個模塊都需要的功能。因此這些都屬於橫切關注點。
1.59 AOP作用是什么,底層如何實現在哪些地方會用到,分別簡述切面,切入點和通知。
AOP:面向切面編程:將一個系統中共同的業務邏輯提取出來,進行單獨的封裝成一個組件(切面),然后以配置的方式作用於系統中,實現程序的可插拔性,提高代碼的復用性,提升系統的靈活性和性能
底層實現:JDK動態代理,只支持接口注入CGLIB:可以支持普通類的注入
那些地方會用到:事物開啟,日志記錄,安全驗證,權限驗證
切面:系統中共通的業務提取出來,在某個時刻或者某個階段共同調用
切入點:找到目標方法,給它追加共通的業務邏輯,在spring中提供了切入點表達式幫助我們找到目標方法execution
通知:什么時候調用這個共通的業務邏輯,用於指定切面方法作用到系統中的時機.前置通知,后置通知,環繞通知,異常通知,最終通知。
1.60 Spring中AutoWired和,Resource之間區別是什么
AutoWried:按照類型進行匹配—spring框架自帶的,查看當前Spring容器中那個bean類型和引用類型一致,就進行注入,如果有多個匹配類型就會報錯.
Resource:默認按照名稱進行注入,如果找不到對應的名稱按照bean類型進行注入 。
答:MyBatis里面的動態Sql一般是通過if節點來實現,通過OGNL語法來實現,但是如果要寫的完整,必須配合where、trim節點,where節點是判斷包含節點有內容就插入where,否則不插入,trim節點是用來判斷如果動態語句是以and 或or開始,那么會自動把這個and或者or取掉 。
ending...