1. 程式人生 > >spring mabatis springmvc 看過

spring mabatis springmvc 看過

全局變量 如果能 關閉 又是 man 釋放 只有一個 事務傳播 動態

.Spring中AOP的應用場景、Aop原理、好處?

答:AOP--Aspect Oriented Programming面向切面編程;用來封裝橫切關註點,具體可以在下面的場景中使用:

Authentication 權限、Caching 緩存、Context passing 內容傳遞、Error handling 錯誤處理Lazy loading懶加載、Debugging調試、logging, tracing, profiling and monitoring 記錄跟蹤優化 校準、Performance optimization 性能優化、Persistence 持久化、Resource pooling 資源池、Synchronization 同步、Transactions 事務

原理:AOP是面向切面編程,是通過動態代理的方式為程序添加統一功能,集中解決一些公共問題。

優點:1.各個步驟之間的良好隔離性耦合性大大降低
2.源代碼無關性,再擴展功能的同時不對源碼進行修改操作

2.Spring中IOC的作用與原理?對象創建的過程。

答:IOC--Inversion of Control控制反轉。當某個角色需要另外一個角色協助的時候,在傳統的程序設計過程中,通常由調用者來創建被調用者的實例對象。但在spring中創建被調用者的工作不再由調用者來完成,因此稱為控制反轉。創建被調用者的工作由spring來完成,然後註入調用者 直接使用。

3.介紹spring框架

它是一個一站式(full-stack全棧式)框架,提供了從表現層-springMVC到業務層-spring再到持久層-springdata的一套完整的解決方案。我們在項目中可以只使用spring一個框架,它就可以提供表現層的mvc框架,持久層的Dao框架。它的兩大核心IoC和AOP更是為我們程序解耦和代碼簡潔易維護提供了支持。

4.Spring常見創建對象的註解?

答:@Component@Controller@ Service@ Repository

5.Spring中用到的設計模式

答:簡單工廠、工廠方法、單例模式、適配器、包裝器、代理、觀察者、策略、模板方法

詳細介紹:請參考本微博的:開發常用設計模式

6.Spring的優點?

答:1.降低了組件之間的耦合性 ,實現了軟件各層之間的解耦
2.可以使用容易提供的眾多服務,如事務管理,消息服務等
3.容器提供單例模式支持
4.容器提供了AOP技術,利用它很容易實現如權限攔截,運行期監控等功能
5.容器提供了眾多的輔助類,能加快應用的開發
6.spring對於主流的應用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring屬於低侵入式設計,代碼的汙染極低
8.獨立於各種應用服務器
9.spring的DI機制降低了業務對象替換的復雜性
10.Spring的高度開放性,並不強制應用完全依賴於Spring,開發者可以自由選擇spring 的部分或全部

7.Spring Bean的作用域之間有什麽區別?

Spring容器中的bean可以分為5個範圍。所有範圍的名稱都是自說明的,但是為了避免混淆,還是讓我們來解釋一下:

singleton:這種bean範圍是默認的,這種範圍確保不管接受到多少個請求,每個容器中只有一個bean的實例,單例的模式由bean factory自身來維護。

prototype:原形範圍與單例範圍相反,為每一個bean請求提供一個實例。

request:在請求bean範圍內會每一個來自客戶端的網絡請求創建一個實例,在請求完成以後,bean會失效並被垃圾回收器回收。

Session:與請求範圍類似,確保每個session中有一個bean的實例,在session過期後,bean會隨之失效。

global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要聲明讓所有的portlet共用全局的存儲變量的話,那麽這全局變量需要存儲在global-session中。

全局作用域與Servlet中的session作用域效果相同。

8.Spring管理事務有幾種方式?

答:有兩種方式:

1、編程式事務,在代碼中硬編碼。(不推薦使用)

2、聲明式事務,在配置文件中配置(推薦使用)

聲明式事務又分為兩種:

a、基於XML的聲明式事務

b、基於註解的聲明式事務

9.spring中自動裝配的方式有哪些?

答:1、 No:即不啟用自動裝配。

2、 byName:通過屬性的名字的方式查找JavaBean依賴的對象並為其註入。比如說類Computer有個屬性printer,指定其autowire屬性為byName後,Spring IoC容器會在配置文件中查找id/name屬性為printer的bean,然後使用Seter方法為其註入。

3、 byType:通過屬性的類型查找JavaBean依賴的對象並為其註入。比如類Computer有個屬性printer,類型為Printer,那麽,指定其autowire屬性為byType後,Spring IoC容器會查找Class屬性為Printer的bean,使用Seter方法為其註入。

4、 constructor:通byType一樣,也是通過類型查找依賴對象。與byType的區別在於它不是使用Seter方法註入,而是使用構造子註入。

5、 autodetect:在byType和constructor之間自動的選擇註入方式。

6、 default:由上級標簽<beans>的default-autowire屬性確定。

10.spring中的核心類有那些,各有什麽作用?

答:BeanFactory:產生一個新的實例,可以實現單例模式

BeanWrapper:提供統一的get及set方法

ApplicationContext:提供框架的實現,包括BeanFactory的所有功能

11.Bean的調用方式有哪些?

答:有三種方式可以得到Bean並進行調用:
1、使用BeanWrapper
HelloWorld hw=new HelloWorld();
BeanWrapper bw=new BeanWrapperImpl(hw);
bw.setPropertyvalue(”msg”,”HelloWorld”);
system.out.println(bw.getPropertyCalue(”msg”));
2、使用BeanFactory
InputStream is=new FileInputStream(”config.xml”);
XmlBeanFactory factory=new XmlBeanFactory(is);
HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);
system.out.println(hw.getMsg());
3、使用ApplicationConttext
ApplicationContext actx=new FleSystemXmlApplicationContext(”config.xml”);
HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);
System.out.println(hw.getMsg());

12.什麽是IOC,什麽又是DI,他們有什麽區別?

答:依賴註入DI是一個程序設計模式和架構模型, 一些時候也稱作控制反轉,盡管在技術上來講,依賴註入是一個IOC的特殊實現,依賴註入是指一個對象應用另外一個對象來提供一個特殊的能力,例如:把一個 數據庫連接已參數的形式傳到一個對象的結構方法裏面而不是在那個對象內部自行創建一個連接。控制反轉和依賴註入的基本思想就是把類的依賴從類內部轉化到外 部以減少依賴

應用控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用,傳遞給它。也可以說,依賴被註入到對象中。所 以,控制反轉是,關於一個對象如何獲取他所依賴的對象的引用,這個責任的反轉。

13.spring有兩種代理方式:

答: 若目標對象實現了若幹接口,spring使用JDK的java.lang.reflect.Proxy類代理。

優點:因為有接口,所以使系統更加松耦合

缺點:為每一個目標類創建接口

若目標對象沒有實現任何接口,spring使用CGLIB庫生成目標對象的子類。

優點:因為代理類與目標類是繼承關系,所以不需要有接口的存在。

缺點:因為沒有使用接口,所以系統的耦合性沒有使用JDK的動態代理好。

14.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響應用戶

15.Springmvc的優點

答:1.它是基於組件技術的.全部的應用對象,無論控制器和視圖,還是業務對象之類的都是 java組件.並且和Spring提供的其他基礎結構緊密集成.

2.不依賴於Servlet API(目標雖是如此,但是在實現的時候確實是依賴於Servlet的)

3. 可以任意使用各種視圖技術,而不僅僅局限於JSP

4 . 支持各種請求資源的映射策略

5 .它應是易於擴展的

也用過struts2.簡單介紹下springMVC和struts2的區別有哪些?

springmvc的入口是一個servlet即前端控制器,而struts2入口是一個filter過慮器。

springmvc是基於方法開發(一個url對應一個方法),請求參數傳遞到方法的形參,可以設計為單例或多例(建議單例),struts2是基於類開發,傳遞參數是通過類的屬性,只能設計為多例。

Struts采用值棧存儲請求和響應的數據,通過OGNL存取數據, springmvc通過參數解析器是將request請求內容解析,並給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最後又將ModelAndView中的模型數據通過reques域傳輸到頁面。Jsp視圖解析器默認使用jstl.

2.Spring的事務是如何配置的?

先配置事務管理器TransactionManager,不同的框架有不同屬性。

再配置事務通知和屬性,通過tx:advice.

配置<aop:config>,設置那些方法或者類需要加入事務。

3.spring事務控制放在service層,在service方法中一個方法調用service中的另一個方法,默認開啟幾個事務?

spring的事務傳播方式默認是PROPAGATION_REQUIRED,判斷當前是否已開啟一個新事務,有則加入當前事務,否則新開一個事務(如果沒有就開啟一個新事務),所以答案是開啟了一個事務。

4.spring 什麽情況下進行事務回滾?

Spring、EJB的聲明式事務默認情況下都是在拋出unchecked exception後才會觸發事務的回滾

unchecked異常,即運行時異常runntimeException 回滾事務;

checked異常,即Exception可try{}捕獲的不會回滾。當然也可配置spring參數讓其回滾。

spring的事務邊界是在調用業務方法之前開始的,業務方法執行完畢之後來執行commit or rollback(Spring默認取決於是否拋出runtime異常)。

如果拋出runtime exception 並在你的業務方法中沒有catch到的話,事務會回滾。

一般不需要在業務方法中catch異常,如果非要catch,在做完你想做的工作後(比如關閉文件等)一定要拋出runtime exception,否則spring會將你的操作commit,這樣就會產生臟數據。所以你的catch代碼是畫蛇添足。

5.Spring支持的事務管理類型?

Spring支持兩種類型的事務管理:

編程式事務管理:這意味你通過編程的方式管理事務,給你帶來極大的靈活性,但是難維護。

聲明式事務管理:這意味著你可以將業務代碼和事務管理分離,你只需用註解和XML配置來管理事務。

6.Spring框架的事務管理有哪些優點?

它為不同的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的編程模式。

它為編程式事務管理提供了一套簡單的API而不是一些復雜的事務API如

它支持聲明式事務管理。

它和Spring各種數據訪問抽象層很好得集成。

7.講下Spring的七大事務傳播?

Spring中通過Propagation來設置事務的傳播屬性的,在這個屬性中提供了我們其中關於事務傳播的特性:

PROPAGATION_REQUIRED:支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。

PROPAGATION_SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY:支持當前事務,如果當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW:新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。

PROPAGATION_NESTED:支持當前事務,新增Savepoint點,與當前事務同步提交或回滾。

8.事務並發會引起什麽問題,怎麽解決?

事務並發會引起臟讀,幻讀,不可重復讀等問題,設定事務的隔離級別就可以解決。

9.事務的安全問題:鎖機制的實現原理及在項目中的使用?

鎖有悲觀鎖和樂觀鎖,悲觀鎖一般假設每個人都會修改數據,默認情況下把數據都鎖住,影響性能,但安全性高。

樂觀鎖是假設每個人都只讀下數據,不會修改數據,性能比較高,但是安全性較低,一般通過增加類似於版本控制裏面版本號來解決問題。

10.講下BeanFactory和ApplicationContext的區別?

BeanFactory是Spring容器頂級核心接口,比較早,但功能比較少,getBean就是BeanFactory定義的。

ApplicationContext是Spring裏面的另外一個容器頂級接口,它繼承於BeanFactory,但是提供的功能譬如校驗,國際化,監聽,對Bean的管理功能比較多,一般使用ApplicationContext.

11.簡單介紹下你對mybatis的理解?

mybatis配置

SqlMapConfig.xml,此文件作為mybatis的全局配置文件,配置了mybatis的運行環境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作數據庫的sql語句。此文件需要在SqlMapConfig.xml中加載。

通過mybatis環境等配置信息構造SqlSessionFactory即會話工廠

由會話工廠創建sqlSession即會話,操作數據庫需要通過sqlSession進行。

mybatis底層自定義了Executor執行器接口操作數據庫,Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器。

Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個Mapped Statement對象,sql的id即是Mapped statement的id.

Mapped Statement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql前將輸入的java對象映射至sql中,輸入參數映射就是jdbc編程中對preparedStatement設置參數。

Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過Mapped Statement在執行sql後將輸出結果映射至java對象中,輸出結果映射過程相當於jdbc編程中對結果的解析處理過程。

12.講下MyBatis和Hibernate的區別?

MyBatis是JDBC的輕量級封裝,把Sql和java代碼獨立出來,性能相對比較高,寫SQL語句相對於比較靈活,並且容易調試,一般用在大型項目中。

Hibernate是JDBC的重量級封裝,開發速度比較快,但是性能比較低,調試不方便,一般適合對進度要求的比較高的中小型項目。

13.mybatis中#{}和${}的區別是什麽?

${}是Properties文件中的變量占位符,它可以用於標簽屬性值和sql內部,屬於靜態文本替換,比如${driver}會被靜態替換為com.mysql.jdbc.Driver.

#{}是sql的參數占位符,Mybatis會將sql中的#{}替換為?號,在sql執行前會使用PreparedStatement的參數設置方法,按序給sql的?號占位符設置參數值,比如ps.setInt(0, parameterValue),#{item.name}的取值方式為使用反射從參數對象中獲取item對象的name屬性值,相當於param.getItem()。getName()。

14.mybatis中XML映射文件中,除了常見的select|insert|updae|delete標簽之外,還有哪些標簽?

<resultMap>、<parameterMap>、<sql>、<include>、<selectKey>,加上動態sql的9個標簽,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中<sql>為sql片段標簽,通過<include>標簽引入sql片段,<selectKey>為不支持自增的主鍵生成策略標簽。

15.MyBatis編程步驟是什麽樣的?

創建SqlSessionFactory

通過SqlSessionFactory創建SqlSession

通過sqlsession執行數據庫操作

調用session.commit()提交事務

調用session.close()關閉會話

16.JDBC編程有哪些不足之處,MyBatis是如何解決這些問題的?

① 數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫鏈接池可解決此問題。

解決:在SqlMapConfig.xml中配置數據鏈接池,使用連接池管理數據庫鏈接。

②Sql語句寫在代碼中造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java代碼。

解決:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。

③向sql語句傳參數麻煩,因為sql語句的where條件不一定,可能多也可能少,占位符需要和參數一一對應。

解決: Mybatis自動將java對象映射至sql語句。

④對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果能將數據庫記錄封裝成pojo對象解析比較方便。

解決:Mybatis自動將sql執行結果映射至java對象。

17.使用MyBatis的mapper接口調用時有哪些要求?

Mapper接口方法名和mapper.xml中定義的每個sql的id相同

Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql 的parameterType的類型相同

Mapper接口方法的輸出參數類型和mapper.xml中定義的每個sql的resultType的類型相同

Mapper.xml文件中的namespace即是mapper接口的類路徑。

18.簡單的說一下MyBatis的一級緩存和二級緩存?

Mybatis首先去緩存中查詢結果集,如果沒有則查詢數據庫,如果有則從緩存取出返回結果集就不走數據庫。Mybatis內部存儲緩存使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來映射生成的java對象

Mybatis的二級緩存即查詢緩存,它的作用域是一個mapper的namespace,即在同一個namespace中查詢sql可以從緩存中獲取數據。二級緩存是可以跨SqlSession的。

19.Mybatis是否支持延遲加載?如果支持,它的實現原理是什麽?

Mybatis僅支持association關聯對象和collection關聯集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false.

它的原理是,使用CGLIB創建目標對象的代理對象,當調用目標方法時,進入攔截器方法,比如調用a.getB()。getName(),攔截器invoke()方法發現a.getB()是null值,那麽就會單獨發送事先保存好的查詢關聯B對象的sql,把B查詢上來,然後調用a.setB(b),於是a的對象b屬性就有值了,接著完成a.getB()。getName()方法的調用。這就是延遲加載的基本原理。

20.Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重復?

不同的Xml映射文件,如果配置了namespace,那麽id可以重復;如果沒有配置namespace,那麽id不能重復;畢竟namespace不是必須的,只是最佳實踐而已。

原因就是namespace+id是作為Map<String, MappedStatement>的key使用的,如果沒有namespace,就剩下id,那麽,id重復會導致數據互相覆蓋。有了namespace,自然id就可以重復,namespace不同,namespace+id自然也就不同。

21.為什麽說Mybatis是半自動ORM映射工具?它與全自動的區別在哪裏?

Hibernate屬於全自動ORM映射工具,使用Hibernate查詢關聯對象或者關聯集合對象時,可以根據對象關系模型直接獲取,所以它是全自動的。而Mybatis在查詢關聯對象或關聯集合對象時,需要手動編寫sql來完成,所以,稱之為半自動ORM映射工具。

22.SSM優缺點、使用場景?

1. Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程序員自己編寫Sql語句,不過mybatis可以通過XML或註解方式靈活配置要運行的sql語句,並將java對象和sql語句映射生成最終執行的sql,最後將sql執行的結果再映射生成java對象。

2. Mybatis學習門檻低,簡單易學,程序員直接編寫原生態sql,可嚴格控制sql執行性能,靈活度高,非常適合對關系數據模型要求不高的軟件開發,濰坊UI培訓:例如互聯網軟件、企業運營類軟件等,因為這類軟件需求變化頻繁,一但需求變化要求成果輸出迅速。但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件則需要自定義多套sql映射文件,工作量大。

3. Hibernate對象/關系映射能力強,數據庫無關性好,對於關系模型要求高的軟件(例如需求固定的定制化軟件)如果用hibernate開發可以節省很多代碼,提高效率。但是Hibernate的學習門檻高,要精通門檻更高,而且怎麽設計O/R映射,在性能和對象模型之間如何權衡,以及怎樣用好Hibernate需要具有很強的經驗和能力才行。

4. 總之,按照用戶的需求在有限的資源環境下只要能做出維護性、擴展性良好的軟件架構都是好架構,所以框架只有適合才是最好。

23.SpringMvc裏面攔截器是怎麽實現的?

有兩種方式,一種是實現接口,另外一種是繼承適配器類,然後在SpringMvc的配置文件中配置攔截器即可:

技術分享圖片


24.Spring中AOP的應用場景、Aop原理、好處?

AOP--Aspect Oriented Programming面向切面編程;用來封裝橫切關註點,具體可以在下面的場景中使用:

Authentication 權限、Caching 緩存、Context passing 內容傳遞、Error handling 錯誤處理Lazy loading懶加載、Debugging調試、logging, tracing, profiling and monitoring 記錄跟蹤優化 校準、Performance optimization 性能優化、Persistence 持久化、Resource pooling 資源池、Synchronization 同步、Transactions 事務

原理:AOP是面向切面編程,是通過動態代理的方式為程序添加統一功能,集中解決一些公共問題。

優點:

1.各個步驟之間的良好隔離性耦合性大大降低

2.源代碼無關性,再擴展功能的同時不對源碼進行修改操作 .

spring mabatis springmvc 看過