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機制(控制反轉),

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

答:能,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,簡單介紹下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...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM