亚洲欧美精品沙发,日韩在线精品视频,亚洲Av每日更新在线观看,亚洲国产另类一区在线5

<pre id="hdphd"></pre>

  • <div id="hdphd"><small id="hdphd"></small></div>
      學(xué)習(xí)啦>創(chuàng)業(yè)指南>職場(chǎng)>面試題>

      Java面試題專(zhuān)題之SSH框架

      時(shí)間: 護(hù)托1061 分享

        struts如何實(shí)現(xiàn)國(guó)際化?下面就由學(xué)習(xí)啦小編為大家介紹一下Java面試題專(zhuān)題之SSH框架的文章,歡迎閱讀。

        Java面試題專(zhuān)題之SSH框架篇1

        1、寫(xiě)出你熟悉的開(kāi)源框架以及各自的作用(項(xiàng)目中為什么使用SSH)

        答:框架:hibernate,spring,struts1/struts2.

        Hibernate主要用于數(shù)據(jù)持久化;封裝了JDBC操作;還提供了一個(gè)易用的、高效率的對(duì)象關(guān)系映射框架;

        Spring 的控制反轉(zhuǎn)能起到解耦合的作用;

        Struts 主要用于請(qǐng)求處理的流程控制;struts是基于MVC模式的,很好的將應(yīng)用程序進(jìn)行了分層,使開(kāi)發(fā)者更關(guān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn);struts有著豐富的taglib,如能靈活運(yùn)用,則能大大提高開(kāi)發(fā)效率。

        Struts(表示層)+Spring(業(yè)務(wù)層)+Hibernate(持久層)

        struts相關(guān)

        2、簡(jiǎn)述STRUTS架構(gòu)(說(shuō)下Struts的工作流程、struts的工作原理)

        簡(jiǎn)述:

        Struts是采用Java Servlet/JavaServer Pages技術(shù),開(kāi)發(fā)Web應(yīng)用程序的開(kāi)放源碼的framework。 采用Struts能開(kāi)發(fā)出基于MVC(Model-View-Controller)設(shè)計(jì)模式的應(yīng)用構(gòu)架。 Struts有如下的主要功能: 一.包含一個(gè)controller servlet,能將用戶(hù)的請(qǐng)求發(fā)送到相應(yīng)的Action對(duì)象。 二.JSP自由tag庫(kù),并且在controller servlet中提供關(guān)聯(lián)支持,幫助開(kāi)發(fā)員創(chuàng)建交互式表單應(yīng)用。 三.提供了一系列實(shí)用對(duì)象:XML處理、通過(guò)Java reflection APIs自動(dòng)處理JavaBeans屬性、國(guó)際化的提示和消息。

        流程:

        在web應(yīng)用啟動(dòng)時(shí)就會(huì)加載初始化ActionServlet,ActionServlet從struts-config.xml文件中讀取配置信息,把它們存放到各種配置對(duì)象當(dāng)ActionServlet接收到一個(gè)客戶(hù)請(qǐng)求時(shí),將執(zhí)行如下流程.

        (1)檢索和用戶(hù)請(qǐng)求匹配的ActionMapping實(shí)例,如果不存在,就返回請(qǐng)求路徑無(wú)效信息;

        (2)如果ActionForm實(shí)例不存在,就創(chuàng)建一個(gè)ActionForm對(duì)象,把客戶(hù)提交的表單數(shù)據(jù)保存到ActionForm對(duì)象中;

        (3)根據(jù)配置信息決定是否需要表單驗(yàn)證.如果需要驗(yàn)證,就調(diào)用ActionForm的validate()方法;

        (4)如果ActionForm的validate()方法返回null或返回一個(gè)不包含ActionMessage的ActuibErrors對(duì)象, 就表示表單驗(yàn)證成功;

        (5)ActionServlet根據(jù)ActionMapping所包含的映射信息決定將請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè)Action,如果相應(yīng)的Action實(shí)例不存在,就先創(chuàng)建這個(gè)實(shí)例,然后調(diào)用Action的execute()方法;

        (6)Action的execute()方法返回一個(gè)ActionForward對(duì)象,ActionServlet在把客戶(hù)請(qǐng)求轉(zhuǎn)發(fā)給ActionForward對(duì)象指向的JSP組件;

        (7)ActionForward對(duì)象指向JSP組件生成動(dòng)態(tài)網(wǎng)頁(yè),返回給客戶(hù);

        3、Struts對(duì)MVC的體現(xiàn)

        M: 在Struts中,模型由JavaBean和EJB組件組成,用來(lái)實(shí)現(xiàn)程序的業(yè)務(wù)邏輯部分.

        C: ActionServlet,RequestProcessor和Struts輔助類(lèi)來(lái)實(shí)現(xiàn)控制器。ActionServlet是Struts中的核心控制器ActionServlet會(huì)根據(jù)在Struts配置文件中的配置將控制權(quán)轉(zhuǎn)交給相應(yīng)的Action類(lèi)。Action 類(lèi)是業(yè)務(wù)的代理,在Action類(lèi)中可以調(diào)用模型組件或者編寫(xiě)其他業(yè)務(wù)邏輯代碼來(lái)完成一項(xiàng)具體的業(yè)務(wù)。

        V: Struts框架中的視圖主要由JSP文件構(gòu)成,在JSP文件中可應(yīng)用Struts標(biāo)簽和自定義標(biāo)簽來(lái)表現(xiàn)模型組件中的數(shù)據(jù)進(jìn)行簡(jiǎn)單的處理。ActionForm Bean實(shí)際上是一個(gè)遵循了特殊約定的JavaBean,在Struts中ActionForm Bean可看作為一個(gè)中間存儲(chǔ)器在視圖與控制器之間進(jìn)行數(shù)據(jù)傳遞。

        4、struts1.2和struts2.0的區(qū)別?

        a、Action類(lèi):

        struts1.2要求Action類(lèi)繼承一個(gè)基類(lèi)。struts2.0 Action可以是簡(jiǎn)單的JOPO對(duì)象或者(都會(huì))繼承ActionSupport基類(lèi)

        b、線程模式

        struts1.2 Action是單例模式的并且必須是線程安全的,因?yàn)閮H有一個(gè)Action的實(shí)例來(lái)處理所有的請(qǐng)求。

        單例策略限制了Struts1.2 Action能做的事情,并且開(kāi)發(fā)時(shí)特別小心。Action資源必須是線程安全的或同步的。

        struts2.0 Action為每一個(gè)請(qǐng)求產(chǎn)生一個(gè)實(shí)例,因此沒(méi)有線程安全問(wèn)題。

        c、Servlet依賴(lài)

        struts1.2 Action依賴(lài)于Servlet API,因?yàn)楫?dāng)一個(gè)Action被調(diào)用時(shí)HttpServletRequest和HttpServletResponse被傳遞給execut方法。

        struts2.0 Action不依賴(lài)于容器,允許Action脫離容器單獨(dú)測(cè)試。如果需要,Struts2 Action仍然可以訪問(wèn)初始的Request和Response。

        但是,其他的元素減少或者消除了直接訪問(wèn)HttpServletRequest和HttpServletResponse的必要性。

        d、可測(cè)性

        測(cè)試struts1.2 Action的一個(gè)主要問(wèn)題是execute方法暴露了Servlet API(這使得測(cè)試要依賴(lài)于容器)。一個(gè)第三方擴(kuò)展:struts TestCase

        提供了一套struts1.2的模擬對(duì)象來(lái)進(jìn)行測(cè)試。

        Struts2.0 Action可以通過(guò)初始化、設(shè)置屬性、調(diào)用方法來(lái)測(cè)試,“依賴(lài)注入”也使得測(cè)試更容易。

        5、struts如何實(shí)現(xiàn)國(guó)際化

        以下以?xún)蓢?guó)語(yǔ)言(中文,英文)為例:

        1. 在工程中加入Struts支持

        2. 編輯ApplicationResource.properties文件,在其中加入要使用國(guó)際化的信息, 例如: lable.welcome.china=Welcome!!!

        3. 創(chuàng)建英文資源文件ApplicationResource_en.properites

        4. 創(chuàng)建臨時(shí)中文資源文件ApplicationResource_temp.properites 例如:lable.welcom.china=中國(guó)歡迎您!

        5. 對(duì)臨時(shí)中文資源文件進(jìn)行編碼轉(zhuǎn)換??梢允褂胢yeclipse的插件,也可以在dos下執(zhí)行:

        native2ascii -encoding gb2312 ApplicationResource_temp.properties ApplicationResource_zh_CN.properties

        6. 在jsp中加入struts的bean標(biāo)記庫(kù)

        6、 Struts框架的數(shù)據(jù)驗(yàn)證可分為幾種類(lèi)型?

        表單驗(yàn)證(由ActionForm Bean處理):如果用戶(hù)沒(méi)有在表單中輸入姓名,就提交表單,將生成表單驗(yàn)證錯(cuò)誤

        業(yè)務(wù)邏輯驗(yàn)證(由Action處理):如果用戶(hù)在表單中輸入的姓名為“Monster”,按照本應(yīng)用的業(yè)務(wù)規(guī)則,不允許向“Monster”打招呼,因此將生成業(yè)務(wù)邏輯錯(cuò)誤。

        7、簡(jiǎn)述Form Bean的表單驗(yàn)證流程。

        1、當(dāng)用戶(hù)提交了HTML表單,Struts框架自動(dòng)把表單數(shù)據(jù)組裝到ActionForm Bean中。

        2、接下來(lái)Struts框架會(huì)調(diào)用ActionForm Bean的validate()方法進(jìn)行表單驗(yàn)證。

        3、如果validate()方法返回的ActionErrors 對(duì)象為null,或者不包含任何ActionMessage對(duì)象,就表示沒(méi)有錯(cuò)誤,數(shù)據(jù)驗(yàn)證通過(guò)。

        4、如果ActionErrors中包含ActionMessage對(duì)象,就表示發(fā)生了驗(yàn)證錯(cuò)誤,Struts框架會(huì)把ActionErrors對(duì)象保存到request范圍內(nèi),然后把請(qǐng)求轉(zhuǎn)發(fā)到恰當(dāng)?shù)囊晥D組件,視圖組件通過(guò)標(biāo)簽把request范圍內(nèi)的ActionErrors對(duì)象中包含的錯(cuò)誤消息顯示出來(lái),提示用戶(hù)修改錯(cuò)誤。

        8、簡(jiǎn)單敘述ActionForm Bean的作用

        1、ActionForm Bean也是一種JavaBean,除了具有一些JavaBean的常規(guī)方法,還包含一些特殊的方法,用于驗(yàn)證HTML表單數(shù)據(jù)以及將其屬性重新設(shè)置為默認(rèn)值。

        2、Struts框架利用ActionForm Bean來(lái)進(jìn)行View組件和Controller組件之間表單數(shù)據(jù)的傳遞。

        3、Struts框架把View組件接受到的用戶(hù)輸入的表單數(shù)據(jù)保存在ActionForm Bean中,把它傳遞給Controller組件,Controller組件可以對(duì)ActionForm Bean中的數(shù)據(jù)進(jìn)行修改JSP文件使用Struts標(biāo)簽讀取修改后的ActionForm Bean的信息,重新設(shè)置HTML表單。

        9、Struts優(yōu)缺點(diǎn)

        優(yōu)點(diǎn):

        1. 實(shí)現(xiàn)MVC模式,結(jié)構(gòu)清晰,使開(kāi)發(fā)者只關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn).

        2.有豐富的tag可以用 ,Struts的標(biāo)記庫(kù)(Taglib),如能靈活動(dòng)用,則能大大提高開(kāi)發(fā)效率

        3. 頁(yè)面導(dǎo)航

        使系統(tǒng)的脈絡(luò)更加清晰。通過(guò)一個(gè)配置文件,即可把握整個(gè)系統(tǒng)各部分之間的聯(lián)系,這對(duì)于后期的維護(hù)有著莫大的好處。尤其是當(dāng)另一批開(kāi)發(fā)者接手這個(gè)項(xiàng)目時(shí),這種優(yōu)勢(shì)體現(xiàn)得更加明顯。

        4. 提供Exception處理機(jī)制 .

        5. 數(shù)據(jù)庫(kù)鏈接池管理

        6. 支持I18N

        缺點(diǎn)

        一、 轉(zhuǎn)到展示層時(shí),需要配置forward,如果有十個(gè)展示層的jsp,需要配置十次struts,而且還不包括有時(shí)候目錄、文件變更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整個(gè)項(xiàng)目,而tomcate這樣的服務(wù)器,還必須重新啟動(dòng)服務(wù)器

        二、 二、 Struts 的Action必需是thread-safe方式,它僅僅允許一個(gè)實(shí)例去處理所有的請(qǐng)求。所以action用到的所有的資源都必需統(tǒng)一同步,這個(gè)就引起了線程安全的問(wèn)題。

        三、 測(cè)試不方便. Struts的每個(gè)Action都同Web層耦合在一起,這樣它的測(cè)試依賴(lài)于Web容器,單元測(cè)試也很難實(shí)現(xiàn)。不過(guò)有一個(gè)Junit的擴(kuò)展工具Struts TestCase可以實(shí)現(xiàn)它的單元測(cè)試。

        四、 類(lèi)型的轉(zhuǎn)換. Struts的FormBean把所有的數(shù)據(jù)都作為String類(lèi)型,它可以使用工具Commons-Beanutils進(jìn)行類(lèi)型轉(zhuǎn)化。但它的轉(zhuǎn)化都是在Class級(jí)別,而且轉(zhuǎn)化的類(lèi)型是不可配置的。類(lèi)型轉(zhuǎn)化時(shí)的錯(cuò)誤信息返回給用戶(hù)也是非常困難的。

        五、 對(duì)Servlet的依賴(lài)性過(guò)強(qiáng). Struts處理Action時(shí)必需要依賴(lài)ServletRequest 和ServletResponse,所有它擺脫不了Servlet容器。

        六、 前端表達(dá)式語(yǔ)言方面.Struts集成了JSTL,所以它主要使用JSTL的表達(dá)式語(yǔ)言來(lái)獲取數(shù)據(jù)??墒荍STL的表達(dá)式語(yǔ)言在Collection和索引屬性方面處理顯得很弱。

        七、 對(duì)Action執(zhí)行的控制困難. Struts創(chuàng)建一個(gè)Action,如果想控制它的執(zhí)行順序?qū)?huì)非常困難。甚至你要重新去寫(xiě)Servlet來(lái)實(shí)現(xiàn)你的這個(gè)功能需求。

        八、 對(duì)Action 執(zhí)行前和后的處理. Struts處理Action的時(shí)候是基于class的hierarchies,很難在action處理前和后進(jìn)行操作。

        九、 對(duì)事件支持不夠. 在struts中,實(shí)際是一個(gè)表單Form對(duì)應(yīng)一個(gè)Action類(lèi)(或DispatchAction),換一句話說(shuō):在Struts中實(shí)際是一個(gè)表單只能 對(duì)應(yīng)一個(gè)事件,struts這種事件方式稱(chēng)為application event,application event和component event相比是一種粗粒度的事件

        Java面試題專(zhuān)題之SSH框架篇2

        1、Hibernate框架的認(rèn)識(shí)(工作原理)

        Hibernate是一個(gè)輕量級(jí)的持久層開(kāi)源框架,它是連接Java應(yīng)用程序和關(guān)系數(shù)據(jù)庫(kù)的中間件,負(fù)責(zé)Java對(duì)象和關(guān)系數(shù)據(jù)之間的映射.

        Hibernate內(nèi)部對(duì)JDBC API進(jìn)行了封裝,負(fù)責(zé)Java對(duì)象的持久化.

        因?yàn)樗庋b了所有的數(shù)據(jù)訪問(wèn)細(xì)節(jié),使得業(yè)務(wù)邏輯層可以專(zhuān)注于實(shí)現(xiàn)業(yè)務(wù)邏輯.

        它是一種優(yōu)秀的ORM映射工具,提供了完善的對(duì)象-關(guān)系映射服務(wù),開(kāi)發(fā)過(guò)程不依賴(lài)容器,靈活性非常大,可以無(wú)縫集成到任何一個(gè)java系統(tǒng)中

        2、 為什么要用Hibernate

        1. 封裝了jdbc,簡(jiǎn)化了很多重復(fù)性代碼。

        2. 簡(jiǎn)化了DAO層編碼工作,使開(kāi)發(fā)更對(duì)象化了。

        3. 移植性好,支持各種數(shù)據(jù)庫(kù),如果換個(gè)數(shù)據(jù)庫(kù)只要在配置文件中變換配置就可以了,不用改變hibernate代碼。

        4. 支持透明持久化,因?yàn)閔ibernate操作的是純粹的(pojo)java類(lèi),沒(méi)有實(shí)現(xiàn)任何接口,沒(méi)有侵入性。所以說(shuō)它是一個(gè)輕量級(jí)框架。

        3、緩存:

        session緩存:被稱(chēng)為Hibernate的第一級(jí)緩存.它存放被單前工作單元加載的對(duì)象.

        sessionFactory緩存:

        被稱(chēng)為Hibernate的第二級(jí)緩存.一個(gè)實(shí)例對(duì)應(yīng)一個(gè)數(shù)據(jù)存儲(chǔ)源.它是線程安全的,是重量級(jí)的.

        它需要一個(gè)很大的緩存,用來(lái)存放預(yù)定義的SQL語(yǔ)句以及映射元數(shù)據(jù)等.

        4、對(duì)象的3個(gè)狀態(tài)

        瞬時(shí):一個(gè)實(shí)體通過(guò)new操作符創(chuàng)建后,沒(méi)有和Hibernate的Session建立關(guān)系,

        也沒(méi)有手動(dòng)賦值過(guò)該實(shí)體的持久化標(biāo)識(shí)(持久化標(biāo)識(shí)可以認(rèn)為映射表的主鍵)。

        此時(shí)該實(shí)體中的任何屬性的更新都不會(huì)反映到數(shù)據(jù)庫(kù)表中。

        持久化:當(dāng)一個(gè)實(shí)體和Hibernate的Session創(chuàng)建了關(guān)系,

        并獲取了持久化標(biāo)識(shí),而且在Hibernate的Session生命周期內(nèi)存在。

        此時(shí)針對(duì)該實(shí)體任何屬性的更改都會(huì)直接影響到數(shù)據(jù)庫(kù)表中一條記錄對(duì)應(yīng)字段的更新,

        也即與對(duì)應(yīng)數(shù)據(jù)庫(kù)表保持同步。

        脫管:當(dāng)一個(gè)實(shí)體和Hibernate的Session創(chuàng)建了關(guān)系,并獲取了持久化標(biāo)識(shí),

        而此時(shí)Hibernate的Session的生命周期結(jié)束,實(shí)體的持久化標(biāo)識(shí)沒(méi)有被改動(dòng)過(guò)。

        針對(duì)該實(shí)體的任何屬性的修改都不會(huì)及時(shí)反映到數(shù)據(jù)庫(kù)表中。

        5、性能問(wèn)題

        在批操作性能和cache之間存在不可調(diào)和的矛盾,

        你要熟悉hibernate一級(jí)和二級(jí)緩存機(jī)制才能寫(xiě)出合理批操作代碼,

        否則不但性能低下,還可能導(dǎo)致out memory。

        hibernate reference文檔中的Best practise也提到,

        Use hand-coded JDBC in bottlenecks,

        也就是說(shuō)在某些性能瓶頸的地方考慮使用硬編碼jdbc。

        6、JDBC,Hibernate,EJB三者的區(qū)別?

        EJB:我們必須遵守復(fù)雜的J2EE規(guī)范,Hibernate不強(qiáng)迫必須滿足特定的規(guī)范.

        EJB只能運(yùn)行在EJB容器中,Hibernate可以運(yùn)行在任何java環(huán)境中.

        目前,對(duì)于復(fù)雜的域模型,EJB容器提供的對(duì)象-關(guān)系映射能力有限.相比之下,Hibernate提供了完善的對(duì)象-關(guān)系映射服務(wù).

        EJB雖然是一種可以移植的組件,但是實(shí)際上卻受到很大的限制,因?yàn)楦鱾€(gè)產(chǎn)商生產(chǎn)CMP引擎差異,它們使用的對(duì)象-關(guān)系映射

        元數(shù)據(jù)各不相同,使得EJB不能順利的從一個(gè)EJB容器移植到另一個(gè)EJB容器當(dāng)中.而Hibernate可以無(wú)縫集成到任何一個(gè)Java系統(tǒng)中.

        JDBC:實(shí)現(xiàn)業(yè)務(wù)邏輯的代碼和訪問(wèn)數(shù)據(jù)庫(kù)的代碼混雜在一起,使程序結(jié)構(gòu)不清晰,可讀性差

        7、get和load的區(qū)別

        1>不存在對(duì)應(yīng)記錄時(shí)表現(xiàn)不一樣

        2>load返回的是代理對(duì)象(javassist.jar生成二進(jìn)制碼),等到真正用到對(duì)象的內(nèi)容才會(huì)發(fā)出SQL語(yǔ)句

        3>get直接從數(shù)據(jù)庫(kù)加載,不會(huì)延遲

        無(wú)論是get還是load,都會(huì)首先查找緩存(一級(jí)緩存),如果沒(méi)有,才會(huì)去數(shù)據(jù)庫(kù)查找,調(diào)用clear()方法,可以強(qiáng)制清除

        8、Hibernate是如何延遲加載?

        1. Hibernate2延遲加載實(shí)現(xiàn):a)實(shí)體對(duì)象 b)集合(Collection)

        2. Hibernate3 提供了屬性的延遲加載功能

        當(dāng)Hibernate在查詢(xún)數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒(méi)有存在與內(nèi)存中,當(dāng)程序真正對(duì)數(shù)據(jù)的操作時(shí),對(duì)象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開(kāi)銷(xiāo),從而提高了服務(wù)器的性能。

        9、如何對(duì)hibernate進(jìn)行優(yōu)化?

        1. 使用雙向一對(duì)多關(guān)聯(lián),不使用單向一對(duì)多

        2. 靈活使用單向一對(duì)多關(guān)聯(lián)

        3. 不用一對(duì)一,用多對(duì)一取代

        4. 配置對(duì)象緩存,不使用集合緩存

        5. 一對(duì)多集合使用Bag,多對(duì)多集合使用Set

        6. 繼承類(lèi)使用顯式多態(tài)

        7. 表字段要少,表關(guān)聯(lián)不要怕多,有二級(jí)緩存

        10、 hibernate的核心類(lèi)是什么,它們的相互關(guān)系是什么?重要的方法是什么?

        Configuration 接口:配置Hibernate,根據(jù)其啟動(dòng)hibernate,創(chuàng)建SessionFactory 對(duì)象;

        SessionFactory 接口:初始化Hibernate,充當(dāng)數(shù)據(jù)存儲(chǔ)源的代理,創(chuàng)建session 對(duì)象,sessionFactory 是線程安全的,意味著它的同一個(gè)實(shí)例可以被應(yīng)用的多個(gè)線程共享,是重量級(jí)、二級(jí)緩存;

        Session 接口:負(fù)責(zé)保存、更新、刪除、加載和查詢(xún)對(duì)象,是線程不安全的,避免多個(gè)線程共享同一個(gè)session,是輕量級(jí)、一級(jí)緩存;

        Session如下方法: save,load,update,delete,

        Query q=CreateQuery(“from Customer where customerName=:customerName”)

        beginTransaction, close, transaction, commit

        Transaction 接口:管理事務(wù);

        Query 和Criteria 接口:執(zhí)行數(shù)據(jù)庫(kù)的查詢(xún)。

        Java面試題專(zhuān)題之SSH框架篇3

        1、Spring的理解

        Spring是一個(gè)輕量級(jí)的容器,非侵入性的框架.最重要的核心概念是IOC,并提供AOP概念的實(shí)現(xiàn)方式,提供對(duì)持久層,事務(wù)的支持,對(duì)當(dāng)前流行的一些框架(Struts,Hibernate,MVC),Sping也提供了與它們的相整合的方案.

        使用Spring,我們能夠減少類(lèi)之間的依賴(lài)性和程序之間的耦合度,最大程度的實(shí)現(xiàn)松耦合,使程序更加靈活,可擴(kuò)展性更強(qiáng).

        IOC,中文翻譯為"反轉(zhuǎn)控制,".DI->;"依賴(lài)注入"指的是:我們不必自己在程序代碼中維護(hù)對(duì)象的依賴(lài)關(guān)系,而是通過(guò)一個(gè)xml配置文件,將類(lèi)的屬性和實(shí)例悄悄的注入到類(lèi)里面.實(shí)現(xiàn)類(lèi)的動(dòng)態(tài)加載,使得類(lèi)和類(lèi)之間可以方便的切換(通過(guò)接口).

        這種設(shè)計(jì)方式的思想表現(xiàn)為:高層模塊不應(yīng)該依賴(lài)低層模塊,而是模塊都必須依賴(lài)于抽象.程序不應(yīng)改依賴(lài)于實(shí)現(xiàn),而是依賴(lài)于抽象接口.應(yīng)用程序不要去找容器,而是容器給我們所有想要的對(duì)象.

        Spring的另一個(gè)重要的方面是支持AOP的實(shí)現(xiàn):

        AOP的中文翻譯是:面向切面編程,也稱(chēng)為面向問(wèn)題編程.面向切面編程(aop)是對(duì)面向?qū)ο缶幊?oop)的補(bǔ)充,

        面向?qū)ο缶幊虒⒊绦蚍纸獬筛鱾€(gè)層次的對(duì)象,面向切面編程將程序運(yùn)行過(guò)程分解成各個(gè)切面。AOP從程序運(yùn)行角度考慮程序的結(jié)構(gòu),提取業(yè)務(wù)處理過(guò)程的切面,oop是靜態(tài)的抽象,aop是動(dòng)態(tài)的抽象,是對(duì)應(yīng)用執(zhí)行過(guò)程中的步驟進(jìn)行抽象,從而獲得步驟之間的邏輯劃分。

        aop框架具有的兩個(gè)特征:

        1.各個(gè)步驟之間的良好隔離性2.源代碼無(wú)關(guān)性

        2、Spring 注解

        Spring 2.5 中除了提供 @Component 注釋外,還定義了幾個(gè)擁有特殊語(yǔ)義的注釋?zhuān)鼈兎謩e是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,這 3 個(gè)注釋和 @Component 是等效的,但是從注釋類(lèi)的命名上,很容易看出這 3 個(gè)注釋分別和持久層、業(yè)務(wù)層和控制層(Web 層)相對(duì)應(yīng)。雖然目前這 3 個(gè)注釋和 @Component 相比沒(méi)有什么新意,但 Spring 將在以后的版本中為它們添加特殊的功能。所以,如果 Web 應(yīng)用程序采用了經(jīng)典的三層分層結(jié)構(gòu)的話,最好在持久層、業(yè)務(wù)層和控制層分別采用 @Repository、@Service 和 @Controller 對(duì)分層中的類(lèi)進(jìn)行注釋?zhuān)?@Component 對(duì)那些比較中立的類(lèi)進(jìn)行注釋。

        在 一個(gè)稍大的項(xiàng)目中,通常會(huì)有上百個(gè)組件,如果這些組件采用xml的bean定義來(lái)配置,顯然會(huì)增加配置文件的體積,查找以及維護(hù)起來(lái)也不太方便。 Spring2.5為我們引入了組件自動(dòng)掃描機(jī)制,他可以在類(lèi)路徑底下尋找標(biāo)注了 @Component,@Service,@Controller,@Repository注解的類(lèi),并把這些類(lèi)納入進(jìn)spring容器中管理。它的作用 和在xml文件中使用bean節(jié)點(diǎn)配置組件時(shí)一樣的。

        @Service用于標(biāo)注業(yè)務(wù)層組件,

        @Controller用于標(biāo)注控制層組件(如struts中的action),

        @Repository用于標(biāo)注數(shù)據(jù)訪問(wèn)組件,即DAO組件,

        @Component泛指組件,當(dāng)組件不好歸類(lèi)的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標(biāo)注。

        3、spring 的優(yōu)點(diǎn)都有哪些?

        1.降低了組件之間的耦合性 ,實(shí)現(xiàn)了軟件各層之間的解耦

        2.可以使用容易提供的眾多服務(wù),如事務(wù)管理,消息服務(wù)等

        3.容器提供單例模式支持

        4.容器提供了AOP技術(shù),利用它很容易實(shí)現(xiàn)如權(quán)限攔截,運(yùn)行期監(jiān)控等功能

        5.容器提供了眾多的輔助類(lèi),能加快應(yīng)用的開(kāi)發(fā)

        6.spring對(duì)于主流的應(yīng)用框架提供了集成支持,如hibernate,JPA,Struts等

        7.spring屬于低侵入式設(shè)計(jì),代碼的污染極低

        8.獨(dú)立于各種應(yīng)用服務(wù)器

        9.spring的DI機(jī)制降低了業(yè)務(wù)對(duì)象替換的復(fù)雜性

        10.Spring的高度開(kāi)放性,并不強(qiáng)制應(yīng)用完全依賴(lài)于Spring,開(kāi)發(fā)者可以自由選擇spring的部分或全部

        4、Spring里面如何配置數(shù)據(jù)庫(kù)驅(qū)動(dòng)?

        使用”org.springframework.jdbc.datasource.DriverManagerDataSource”數(shù)據(jù)源來(lái)配置數(shù)據(jù)庫(kù)驅(qū)動(dòng)。

        5、Spring里面applicationContext.xml文件能不能改成其他文件名?

        ContextLoaderListener是一個(gè)ServletContextListener, 它在你的web應(yīng)用啟動(dòng)的時(shí)候初始化。缺省情況下, 它會(huì)在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通過(guò)定義一個(gè)元素名字為”contextConfigLocation”來(lái)改變Spring配置文件的位置。示例如下:

        org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/xyz.xml

        6、AOP里面重要的幾個(gè)名詞概念解釋

        切面(Aspect): 一個(gè)關(guān)注點(diǎn)的模塊化,這個(gè)關(guān)注點(diǎn)可能會(huì)橫切多個(gè)對(duì)象。事務(wù)管理是J2EE應(yīng)用中一個(gè)關(guān)于橫切關(guān)注點(diǎn)的很好的例子。 在Spring AOP中,切面可以使用通用類(lèi)(基于模式的風(fēng)格) 或者在普通類(lèi)中以 @Aspect 注解(@AspectJ風(fēng)格)來(lái)實(shí)現(xiàn)。

        連接點(diǎn)(Joinpoint): 在程序執(zhí)行過(guò)程中某個(gè)特定的點(diǎn),比如某方法調(diào)用的時(shí)候或者處理異常的時(shí)候。 在Spring AOP中,一個(gè)連接點(diǎn) 總是 代表一個(gè)方法的執(zhí)行。 通過(guò)聲明一個(gè)org.aspectj.lang.JoinPoint類(lèi)型的參數(shù)可以使通知(Advice)的主體部分獲得連接點(diǎn)信息。

        通知(Advice): 在切面的某個(gè)特定的連接點(diǎn)(Joinpoint)上執(zhí)行的動(dòng)作。通知有各種類(lèi)型,其中包括“around”、“before”和“after”等通知。 通知的類(lèi)型將在后面部分進(jìn)行討論。許多AOP框架,包括Spring,都是以攔截器做通知模型, 并維護(hù)一個(gè)以連接點(diǎn)為中心的攔截器鏈。

        切入點(diǎn)(Pointcut): 匹配連接點(diǎn)(Joinpoint)的斷言。通知和一個(gè)切入點(diǎn)表達(dá)式關(guān)聯(lián),并在滿足這個(gè)切入點(diǎn)的連接點(diǎn)上運(yùn)行(例如,當(dāng)執(zhí)行某個(gè)特定名稱(chēng)的方法時(shí))。 切入點(diǎn)表達(dá)式如何和連接點(diǎn)匹配是AOP的核心:Spring缺省使用AspectJ切入點(diǎn)語(yǔ)法。

        引入(Introduction): (也被稱(chēng)為內(nèi)部類(lèi)型聲明(inter-type declaration))。聲明額外的方法或者某個(gè)類(lèi)型的字段。 Spring允許引入新的接口(以及一個(gè)對(duì)應(yīng)的實(shí)現(xiàn))到任何被代理的對(duì)象。 例如,你可以使用一個(gè)引入來(lái)使bean實(shí)現(xiàn) IsModified 接口,以便簡(jiǎn)化緩存機(jī)制。

        目標(biāo)對(duì)象(Target Object): 被一個(gè)或者多個(gè)切面(aspect)所通知(advise)的對(duì)象。也有人把它叫做 被通知(advised) 對(duì)象。 既然Spring AOP是通過(guò)運(yùn)行時(shí)代理實(shí)現(xiàn)的,這個(gè)對(duì)象永遠(yuǎn)是一個(gè) 被代理(proxied) 對(duì)象。

        AOP代理(AOP Proxy): AOP框架創(chuàng)建的對(duì)象,用來(lái)實(shí)現(xiàn)切面契約(aspect contract)(包括通知方法執(zhí)行等功能)。 在Spring中,AOP代理可以是JDK動(dòng)態(tài)代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)風(fēng)格和@AspectJ注解風(fēng)格的切面聲明,對(duì)于使用這些風(fēng)格的用戶(hù)來(lái)說(shuō),代理的創(chuàng)建是透明的。

        織入(Weaving): 把切面(aspect)連接到其它的應(yīng)用程序類(lèi)型或者對(duì)象上,并創(chuàng)建一個(gè)被通知(advised)的對(duì)象。 這些可以在編譯時(shí)(例如使用AspectJ編譯器),類(lèi)加載時(shí)和運(yùn)行時(shí)完成。 Spring和其他純Java AOP框架一樣,在運(yùn)行時(shí)完成織入。

        通知的類(lèi)型:

        前置通知(Before advice): 在某連接點(diǎn)(join point)之前執(zhí)行的通知,但這個(gè)通知不能阻止連接點(diǎn)前的執(zhí)行(除非它拋出一個(gè)異常)。

        返回后通知(After returning advice): 在某連接點(diǎn)(join point)正常完成后執(zhí)行的通知:例如,一個(gè)方法沒(méi)有拋出任何異常,正常返回。

        拋出異常后通知(After throwing advice): 在方法拋出異常退出時(shí)執(zhí)行的通知。

        后通知(After (finally) advice): 當(dāng)某連接點(diǎn)退出的時(shí)候執(zhí)行的通知(不論是正常返回還是異常退出)。

        環(huán)繞通知(Around Advice): 包圍一個(gè)連接點(diǎn)(join point)的通知,如方法調(diào)用。這是最強(qiáng)大的一種通知類(lèi)型。 環(huán)繞通知可以在方法調(diào)用前后完成自定義的行為。它也會(huì)選擇是否繼續(xù)執(zhí)行連接點(diǎn)或直接返回它們自己的返回值或拋出異常來(lái)結(jié)束執(zhí)行。

        環(huán)繞通知是最常用的一種通知類(lèi)型。大部分基于攔截的AOP框架,例如Nanning和JBoss4,都只提供環(huán)繞通知。

        切入點(diǎn)(pointcut)和連接點(diǎn)(join point)匹配的概念是AOP的關(guān)鍵,這使得AOP不同于其它僅僅提供攔截功能的舊技術(shù)。 切入點(diǎn)使得定位通知(advice)可獨(dú)立于OO層次。 例如,一個(gè)提供聲明式事務(wù)管理的around通知可以被應(yīng)用到一組橫跨多個(gè)對(duì)象中的方法上(例如服務(wù)層的所有業(yè)務(wù)操作)。

      3155503