Java面試題_第三階段(Spring、MVC、IOC、AOP、DI、MyBatis、SSM、struts2)

1.1 何爲Spring Bean容器?Spring Bean容器與Spring IOC 容器有什麼不一樣嗎?

答:1)用於建立bean對象,管理bean對象的那個容器。前端

2)Spring IOC 容器本質上指的的就是Spring Bean容器,Spring Bean容器中最核心一個機制是IOC機制(控制反轉),java

因此有時候又將springbean容器稱之爲Spring IOC 容器.程序員

1.2 Spring IOC 如何理解?

答:IOC 是Spring中提供一種控制反起色制,目的是將咱們項目中對象的依賴管理交給Spring實現,web

這樣能夠更好實現對象關係的解耦,提升程序的可擴展性.面試

1.3 Spring DI 如何理解?

答:DI 是Spring中的依賴注入機制,IOC的實現須要藉助這種機制.咱們一般會這樣理解,spring

Spring Bean容器中的IOC思想一種目標,DI是實現這種思想的目標的手段.sql

1.4 Spring 基於註解如何配置對象做用域?以及如何配置延遲加載機制?

答:@Scope(「singleton」)數據庫

@Scope(「prototype」)編程

@Lazy(value=true)json

1.5 Spring 工廠底層構建Bean對象藉助什麼機制?當對象不使用了要釋放資源,目的是什麼?何爲內存泄漏?

答:藉助反射機制,防止內存泄漏,對象已經不使用了但佔用着內存,這種現 象稱之爲內存泄漏,內存泄漏不是內存溢出,可是它是內存溢出的一個導火索. 內存溢出直接就致使系統崩潰了.

1.6 描述Spring MVC處理流程及應用優點

答:

一、客戶端發出一個http請求給web服務器,web服務器對http請求進 行 解析,若是匹配前端控制器(或分發器/DispatcherServlet)的請求映射路徑, web容器將請求轉交給DispatcherServlet.

二、DipatcherServlet接收到這個請求以後將根據請求的信息以及處理器映射 (HandlerMapping)的配置找處處理請求的處理器(Handler)。

三、由具體的處理器適配器(HandlerAdapter)對Handler進行具體的調用。

四、Handler對數據處理完成之後將返回一個ModelAndView()對象DispatcherServlet

五、DispatcherSevlet經過視圖解析器(ViewResolver)將ModelAndView()轉 化爲真正的視圖View。

六、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 BeanFactoryApplicationContext有什麼區別?

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)InitializingBeanDisposableBean回調接口
         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 SpringMVCStruts2的區別

 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 使用MyBatismapper接口調用時有哪些要求?

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能執行一對1、一對多的關聯查詢嗎?都有哪些實現方式,以及它們之間的區別?

答:能,Mybatis不只能夠執行一對1、一對多的關聯查詢,還能夠執行多對一,多對多的關聯查詢,多對一查詢,其實就是一對一查詢,只須要把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,簡單介紹下springMVCstruts2的區別有哪些?

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 什麼是基於JavaSpring註解配置? 給一些註解的例子。

基於Java的配置,容許你在少許的Java註解的幫助下,進行你的大部分Spring配置而非經過XML文件。

@Configuration 註解爲例,它用來標記類能夠當作一個bean的定義,被Spring IOC容器使用。另外一個例子是@Bean註解,它表示此方法將要返回一個對象,做爲一個bean註冊進Spring應用上下文。

1.55 使用Spring經過什麼方式訪問Hibernate?

Spring中有兩種方式訪問Hibernate:

控制反轉 Hibernate Template和 Callback。

繼承 HibernateDAOSupport提供一個AOP 攔截器。

1.56 如何經過HibernateDaoSupportSpringHibernate結合起來?

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 SpringAutoWired,Resource之間區別是什麼

AutoWried:按照類型進行匹配—spring框架自帶的,查看當前Spring容器中那個bean類型和引用類型一致,就進行注入,若是有多個匹配類型就會報錯.

Resource:默認按照名稱進行注入,若是找不到對應的名稱按照bean類型進行注入 。

答:MyBatis裏面的動態Sql通常是經過if節點來實現,經過OGNL語法來實現,可是若是要寫的完整,必須配合where、trim節點,where節點是判斷包含節點有內容就插入where,不然不插入,trim節點是用來判斷若是動態語句是以and 或or開始,那麼會自動把這個and或者or取掉 。

 

ending...

相關文章
相關標籤/搜索