三大框架面試問(wèn)題及答案
面試前做好準(zhǔn)備,輕松面對(duì)考官的提問(wèn),下面小編精心整理了一些三大框架面試問(wèn)題及答案的例文,希望可以幫到你!
三大框架面試問(wèn)題及答案(一)
一、Spring依賴注入的3種實(shí)現(xiàn)方式是什么?
依賴注入的3種實(shí)現(xiàn)方式分別是:接口注入(interface injection)、Set注入(setter injection)和構(gòu)造注入(constructor injection)。接口注入指的就是在接口中定義要注入的信息,并通過(guò)接口完成注入。其具體步驟包括(1)編寫一個(gè)接口,各種數(shù)據(jù)的注入將通過(guò)這個(gè)接口進(jìn)行。(2)任何想要使用數(shù)據(jù)的類都必須實(shí)現(xiàn)這個(gè)接口 。Set注入指的就是在接受注入的類中定義一個(gè)Set方法,并在參數(shù)中定義需要注入的元素。構(gòu)造注入指的就是在接受注入的類中定義一個(gè)構(gòu)造方法,并在參數(shù)中定義需要注入的元素。
二、SSH 框架配置流程是什么?
1.創(chuàng)建java web項(xiàng)目:添加struts包:freemarker,ognl,struts2-core,struts2-spring-plugin,xwork-core,commons-fileupload、commons-io、 commons-lang等 ;添加spring包:spring-aop、spring-aspects、spring-beans、spring-context、spring-core、spring-jdbc、spring-orm、spring-web等;添加hibernate包:hibernate-core等;添加其他包:ojdbc等
2.配置struts(1)配置struts核心過(guò)濾器。打開(kāi)web.xml,配置struts核心過(guò)濾器和過(guò)濾器映射。(2)建立Action,繼承ActionSupport類。
(3)配置action。在struts.xml文件中,添加對(duì)Action的配置。包含<package><action><result>等元素的配置(4)新建視圖頁(yè)面
3.配置hibernate:(1)建立數(shù)據(jù)庫(kù)與數(shù)據(jù)表(2)創(chuàng)建持久層實(shí)體類及映射文件(3)編寫數(shù)據(jù)訪問(wèn)類,集成HibernateDaoSupport父類
4.配置spring:(1)配置applicationContext.xml文件,配置spring會(huì)話工廠bean,數(shù)據(jù)訪問(wèn)bean ,業(yè)務(wù)bean和action bean等。(2)引入aop和tx命名空間,配置聲明式事務(wù)(3)配置web.xml,添加Spring監(jiān)聽(tīng)器和context-param初始化參數(shù),告知監(jiān)聽(tīng)器applicationContext.xml的位置。
三、Struts的運(yùn)行機(jī)制是什么
1、客戶端初始化一個(gè)指向Servlet容器(例如Tomcat)的請(qǐng)求;
2、這個(gè)請(qǐng)求經(jīng)過(guò)一系列的過(guò)濾器(Filter)(這些過(guò)濾器中有一個(gè)叫做ActionContextCleanUp的可選過(guò)濾器,這個(gè)過(guò)濾器對(duì)于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin);
3、接著StrutsPrepareAndExecuteFilter被調(diào)用,StrutsPrepareAndExecuteFilter詢問(wèn)ActionMapper來(lái)決定這個(gè)請(qǐng)求是否需要調(diào)用某個(gè)Action
4、如果ActionMapper決定需要調(diào)用某個(gè)Action,StrutsPrepareAndExecuteFilter把請(qǐng)求的處理交給ActionProxy;
5、ActionProxy通過(guò)Configuration Manager詢問(wèn)框架的配置文件,找到需要調(diào)用的Action類;
6、ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。
7、ActionInvocation實(shí)例使用命名模式來(lái)調(diào)用,在調(diào)用Action的過(guò)程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。
8、一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是 (但不總是,也可能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過(guò)程中可以使用Struts2 框架中繼承的標(biāo)簽。在這個(gè)過(guò)程中需要涉及到ActionMapper。
三大框架面試問(wèn)題及答案(二)
一、說(shuō)說(shuō)IOC和AOP的概念以及在Spring中是如何應(yīng)用的
1.控制反轉(zhuǎn)(Inversion of Control,英文縮寫為IoC)是一個(gè)重要的面向?qū)ο缶幊痰姆▌t來(lái)削減計(jì)算機(jī)程序的耦合問(wèn)題,也是輕量級(jí)的Spring框架的核心。 控制反轉(zhuǎn)一般分為兩種類型,依賴注入(Dependency Injection,簡(jiǎn)稱DI)和依賴查找(Dependency Lookup)。依賴注入應(yīng)用比較廣泛。2.AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP的延續(xù)。利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開(kāi)發(fā)的效率。
3.IOC是典型的工廠模式,而AOP則是典型的代理模式的體現(xiàn)。spring的IoC容器是spring的核心,spring AOP是spring框架的重要組成部分 4.在spring中ioc最典型的應(yīng)用就是整合并管理各個(gè)組件,如整合ssh時(shí),spring可以管理datasource,sessionfactory,dao,service,action等bean,這些傳統(tǒng)開(kāi)發(fā)方式中均是由硬編碼的方式實(shí)現(xiàn);而aop則在spring中表現(xiàn)為各種通知,spring提供了諸如MethodBeforeAdvice,AfterReturningAdvice,AfterThrowingAdvice等API,并在spring提供的聲明式事務(wù)中也提供了相應(yīng)的tx命名空間,利用aop簡(jiǎn)化事務(wù)配置
二、Struts中mvc中分別使用的什么技術(shù)?
1.在Action的實(shí)現(xiàn)方面,而Struts2中可以是一個(gè)POJO。Struts2支持通過(guò)攔截器堆棧為每一個(gè)Action創(chuàng)建不同的生命周期,其中攔截器在AOP(Aspect-Oriented Programming)中用于在某個(gè)方法或字段被訪問(wèn)之前或之后加入某些操作
2.線程模型方面,Struts2的Action是一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)實(shí)例(每次請(qǐng)求時(shí)都新new出一個(gè)對(duì)象),沒(méi)有線程安全方面的問(wèn)題。
3.Servlet依賴方面,Struts2中的Action不再依賴于Servlet API,有利于測(cè)試,并且實(shí)現(xiàn)TDD。
4.封裝請(qǐng)求參數(shù),Struts2可以選擇使用POJO類來(lái)封裝請(qǐng)求的參數(shù),或者直接使用Action的屬性。
5.表達(dá)式語(yǔ)言方面,Struts2整合了OGNL(Object Graph NavigationLanguage)。
6.綁定值到視圖技術(shù),Struts2使用“ValueStack”技術(shù)。
7.類型轉(zhuǎn)換,Struts2中使用OGNL進(jìn)行轉(zhuǎn)換,可以更方便的使用。
8.Struts2支持重寫validate方法或者使用XWork的驗(yàn)證框架。同時(shí)也很好的使用了Java的國(guó)際化機(jī)制
三、Spring是怎么實(shí)現(xiàn)事務(wù)處理的?
Spring 提供兩種事務(wù)處理方式,一種是編程式事務(wù)處理;一種是聲明式事務(wù)處理。其中編程式事務(wù)處理使用TransactionTemplate進(jìn)行事務(wù)處理(Spring進(jìn)行commit和rollback)。而Spring 的聲明式事務(wù)處理,可以說(shuō)是 Spring AOP的一種實(shí)現(xiàn)。因?yàn)槭聞?wù)處理是所謂方面( Aspect )的一個(gè)子集。因此默認(rèn)情況下,事務(wù)處理是利用 Java動(dòng)態(tài)代理機(jī)制實(shí)現(xiàn)的,這樣就必須先定義一個(gè)接口,然后再編寫實(shí)現(xiàn);而對(duì)于沒(méi)有接口的 Javabean ,則通過(guò) CGLIB 實(shí)現(xiàn)。這部分是 SpringAOP 部分的內(nèi)容。 其實(shí)就是在執(zhí)行某個(gè)業(yè)務(wù)方法之前添加了tx.beginTran()事務(wù)開(kāi)啟,若沒(méi)有異常,業(yè)務(wù)方法執(zhí)行完畢后添加了tx.commitTran()事務(wù)提交。若有異常拋出,則添加了tx.rollbackTran();事務(wù)回滾。使用Spring?AOP進(jìn)行事務(wù)控制需要具備一定的規(guī)則,若是開(kāi)發(fā)人員的業(yè)務(wù)Service或者說(shuō)業(yè)務(wù)Service中的業(yè)務(wù)方法命名不按照事前定義好的規(guī)則進(jìn)行命名的話,AOP是攔截不到的。
三大框架面試問(wèn)題及答案(三)
一、談?wù)凥ibernate的緩存機(jī)制
Hibernate的緩存包括Session的緩存和SessionFactory的緩存,其中SessionFactory的緩存又可以分為兩類:內(nèi)置緩存和外置緩存。Session的緩存是內(nèi)置的,不能被卸載,也被稱為Hibernate的第一級(jí)緩存。SessionFactory的內(nèi)置緩存和Session的緩存在實(shí)現(xiàn)方式上比較相似,前者是SessionFactory對(duì)象的一些集合屬性包含的數(shù)據(jù),后者是指Session的一些集合屬性包含的數(shù)據(jù)。SessionFactory的內(nèi)置緩存中存放了映射元數(shù)據(jù)和預(yù)定義SQL語(yǔ)句,映射元數(shù)據(jù)是映射文件中數(shù)據(jù)的拷貝,而預(yù)定義SQL語(yǔ)句是在Hibernate初始化階段根據(jù)映射元數(shù)據(jù)推導(dǎo)出來(lái),SessionFactory的內(nèi)置緩存是只讀的,應(yīng)用程序不能修改緩存中的映射元數(shù)據(jù)和預(yù)定義SQL語(yǔ)句,因此SessionFactory不需要進(jìn)行內(nèi)置緩存與映射文件的同步。SessionFactory的外置緩存是一個(gè)可配置的插件。在默認(rèn)情況下,SessionFactory不會(huì)啟用這個(gè)插件。外置緩存的數(shù)據(jù)是數(shù)據(jù)庫(kù)數(shù)據(jù)的拷貝,外置緩存的介質(zhì)可以是內(nèi)存或者硬盤。SessionFactory的外置緩存也被稱為Hibernate的第二級(jí)緩存。
二、MyBatis和Hibernate有什么區(qū)別
1)MyBATIS非常簡(jiǎn)單易學(xué),Hibernate相對(duì)較復(fù)雜,門檻較高。2) 二者都是比較優(yōu)秀的開(kāi)源產(chǎn)品。但Hibernate現(xiàn)在已經(jīng)是主流O/R Mapping框架,從文檔的豐富性,產(chǎn)品的完善性,版本的開(kāi)發(fā)速度都要強(qiáng)于MyBatis。3) 當(dāng)系統(tǒng)屬于二次開(kāi)發(fā),無(wú)法對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)做到控制和修改,那MyBatis的靈活性將比Hibernate更適合。4) 系統(tǒng)數(shù)據(jù)處理量巨大,性能要求極為苛刻,在這種情況下MyBatis會(huì)有更好的可控性和表現(xiàn)。因?yàn)镸yBatis比Hibernate更容易進(jìn)行sql的優(yōu)化。5) MyBatis 可以進(jìn)行細(xì)粒度的優(yōu)化,減少與數(shù)據(jù)庫(kù)的交互,對(duì)于性能的提升是非常重要。6) MyBatis需要手寫sql語(yǔ)句,也可以生成一部分,Hibernate則基本上可以自動(dòng)生成,偶爾會(huì)寫一些Hql。如果涉及到數(shù)據(jù)庫(kù)字段的修改,Hibernate修改的地方很少。7) 開(kāi)發(fā)方面:開(kāi)發(fā)效率上,兩者差不多 ;可維護(hù)性方面,MyBatis更好一些。8) 運(yùn)行效率:在不考慮cache的情況下,MyBatis應(yīng)該會(huì)比hibernate快一些或者很多(根據(jù)實(shí)際情況會(huì)有所不同)。 9) 對(duì)不同數(shù)據(jù)庫(kù)類型的支持。MyBatis對(duì)不同數(shù)據(jù)庫(kù)類型的支持不夠好,如果你要開(kāi)發(fā)的系統(tǒng)是要在對(duì)中數(shù)據(jù)間移植,那可能用hibernate比較好。10)對(duì)缺省的cache支持。MyBatis對(duì)缺省的cache支持不夠好,但是hibernate的cache支持其實(shí)也不是很好,而且很復(fù)雜。尤其是對(duì)于大并發(fā)量的應(yīng)用。
三、Hashmap和Hashtable的區(qū)別
1 HashMap不是線程安全的,hastmap是將鍵映射到值的對(duì)象,其中鍵和值都是對(duì)象,并且不能包含重復(fù)鍵,但可以包含重復(fù)值。HashMap允許null key和null value,而hashtable不允許。2 .HashTable是線程安全的一個(gè)Collection。HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable。 HashMap允許將null作為一個(gè)entry的key或者value,而Hashtable不允許。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。 Hashtable繼承自Dictionary類,而HashMap是Java1.2引進(jìn)的Map interface的一個(gè)實(shí)現(xiàn)。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個(gè)線程訪問(wèn)Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap 就必須為之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會(huì)有很大的差異
四、JDBC與Hibernate的優(yōu)缺點(diǎn)比較
JDBC與Hibernate在性能上相比,JDBC靈活性有優(yōu)勢(shì)。而Hibernate在易學(xué)性,易用性上有些優(yōu)勢(shì)。當(dāng)用到很多復(fù)雜的多表聯(lián)查和復(fù)雜的數(shù)據(jù)庫(kù)操作時(shí),JDBC有優(yōu)勢(shì)。 相同點(diǎn):
◆兩者都是JAVA的數(shù)據(jù)庫(kù)操作中間件。
◆兩者對(duì)于數(shù)據(jù)庫(kù)進(jìn)行直接操作的對(duì)象都不是線程安全的,都需要及時(shí)關(guān)閉。 ◆兩者都可以對(duì)數(shù)據(jù)庫(kù)的更新操作進(jìn)行顯式的事務(wù)處理。
不同點(diǎn):
◆使用的SQL語(yǔ)言不同:JDBC使用的是基于關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)SQL語(yǔ)言,Hibernate使用的是HQL(Hibernate query language)語(yǔ)言
◆操作的對(duì)象不同:JDBC操作的是數(shù)據(jù),將數(shù)據(jù)通過(guò)SQL語(yǔ)句直接傳送到數(shù)據(jù)庫(kù)中執(zhí)行,Hibernate操作的是持久化對(duì)象,由底層持久化對(duì)象的數(shù)據(jù)更新到數(shù)據(jù)庫(kù)中。 ◆數(shù)據(jù)狀態(tài)不同:JDBC操作的數(shù)據(jù)是“瞬時(shí)”的,變量的值無(wú)法與數(shù)據(jù)庫(kù)中的值保持一致,而Hibernate操作的數(shù)據(jù)是可持久的,即持久化對(duì)象的數(shù)據(jù)屬性的值是可以跟數(shù)據(jù)庫(kù)中的值保持一致的。