1、寫(xiě)出你熟悉的開(kāi)源框架以及各自的作用(項目中為什么使用SSH)
答:框架:hibernate,spring,struts1/struts2.
Hibernate主要用于數據持久化;封裝了JDBC操作;還提供了一個(gè)易用的、高效率的對象關(guān)系映射框架;
Spring 的控制反轉能起到解耦合的作用;
Struts主要用于請求處理的流程控制;struts是基于MVC模式的,很好的將應用程序進(jìn)行了分層,使開(kāi)發(fā)者更關(guān)注于業(yè)務(wù)邏輯的實(shí)現;struts有著(zhù)豐富的taglib,如能靈活運用,則能大大提高開(kāi)發(fā)效率。
struts相關(guān)
2、簡(jiǎn)述STRUTS架構(說(shuō)下Struts的工作流程、struts的工作原理)
簡(jiǎn)述:
Struts是采用Java Servlet/JavaServerPages技術(shù),開(kāi)發(fā)Web應用程序的開(kāi)放源碼的framework。采用Struts能開(kāi)發(fā)出基于MVC(Model-View-Controller)設計模式的應用構架。 Struts有如下的主要功能:一.包含一個(gè)controller servlet,能將用戶(hù)的請求發(fā)送到相應的Action對象。二.JSP自由tag庫,并且在controller servlet中提供關(guān)聯(lián)支持,幫助開(kāi)發(fā)員創(chuàng )建交互式表單應用。三.提供了一系列實(shí)用對象:XML處理、通過(guò)Java reflectionAPIs自動(dòng)處理JavaBeans屬性、國際化的提示和消息。
流程:
在web應用啟動(dòng)時(shí)就會(huì )加載初始化ActionServlet,ActionServlet從struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象當ActionServlet接收到一個(gè)客戶(hù)請求時(shí),將執行如下流程.
(1)檢索和用戶(hù)請求匹配的ActionMapping實(shí)例,如果不存在,就返回請求路徑無(wú)效信息;
(2)如果ActionForm實(shí)例不存在,就創(chuàng )建一個(gè)ActionForm對象,把客戶(hù)提交的表單數據保存到ActionForm對象中;
(3)根據配置信息決定是否需要表單驗證.如果需要驗證,就調用ActionForm的validate()方法;
(4)如果ActionForm的validate()方法返回null或返回一個(gè)不包含ActionMessage的ActuibErrors對象,就表示表單驗證成功;
(5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發(fā)給哪個(gè)Action,如果相應的Action實(shí)例不存在,就先創(chuàng )建這個(gè)實(shí)例,然后調用Action的execute()方法;
(6)Action的execute()方法返回一個(gè)ActionForward對象,ActionServlet在把客戶(hù)請求轉發(fā)給ActionForward對象指向的JSP組件;
(7)ActionForward對象指向JSP組件生成動(dòng)態(tài)網(wǎng)頁(yè),返回給客戶(hù);
3、Struts對MVC的體現
M: 在Struts中,模型由JavaBean和EJB組件組成,用來(lái)實(shí)現程序的業(yè)務(wù)邏輯部分.
C:ActionServlet,RequestProcessor和Struts輔助類(lèi)來(lái)實(shí)現控制器。ActionServlet是Struts中的核心控制器ActionServlet會(huì )根據在Struts配置文件中的配置將控制權轉交給相應的Action類(lèi)。Action類(lèi)是業(yè)務(wù)的代理,在A(yíng)ction類(lèi)中可以調用模型組件或者編寫(xiě)其他業(yè)務(wù)邏輯代碼來(lái)完成一項具體的業(yè)務(wù)。
V:Struts框架中的視圖主要由JSP文件構成,在JSP文件中可應用Struts標簽和自定義標簽來(lái)表現模型組件中的數據進(jìn)行簡(jiǎn)單的處理。ActionFormBean實(shí)際上是一個(gè)遵循了特殊約定的JavaBean,在Struts中ActionFormBean可看作為一個(gè)中間存儲器在視圖與控制器之間進(jìn)行數據傳遞。
4、struts1.2和struts2.0的區別?
a、Action類(lèi):
struts1.2要求Action類(lèi)繼承一個(gè)基類(lèi)。struts2.0Action可以是簡(jiǎn)單的JOPO對象或者(都會(huì ))繼承ActionSupport基類(lèi)
b、線(xiàn)程模式
struts1.2 Action是單例模式的并且必須是線(xiàn)程安全的,因為僅有一個(gè)Action的實(shí)例來(lái)處理所有的請求。
單例策略限制了Struts1.2 Action能做的事情,并且開(kāi)發(fā)時(shí)特別小心。Action資源必須是線(xiàn)程安全的或同步的。
struts2.0 Action為每一個(gè)請求產(chǎn)生一個(gè)實(shí)例,因此沒(méi)有線(xiàn)程安全問(wèn)題。
c、Servlet依賴(lài)
struts1.2 Action依賴(lài)于ServletAPI,因為當一個(gè)Action被調用時(shí)HttpServletRequest和HttpServletResponse被傳遞給execut方法。
struts2.0 Action不依賴(lài)于容器,允許Action脫離容器單獨測試。如果需要,Struts2Action仍然可以訪(fǎng)問(wèn)初始的Request和Response。
但是,其他的元素減少或者消除了直接訪(fǎng)問(wèn)HttpServletRequest和HttpServletResponse的必要性。
d、可測性
測試struts1.2 Action的一個(gè)主要問(wèn)題是execute方法暴露了ServletAPI(這使得測試要依賴(lài)于容器)。一個(gè)第三方擴展:struts TestCase
提供了一套struts1.2的模擬對象來(lái)進(jìn)行測試。
Struts2.0 Action可以通過(guò)初始化、設置屬性、調用方法來(lái)測試,“依賴(lài)注入”也使得測試更容易。
5、struts如何實(shí)現國際化
以下以?xún)蓢Z(yǔ)言(中文,英文)為例:
1. 在工程中加入Struts支持
2. 編輯ApplicationResource.properties文件,在其中加入要使用國際化的信息, 例如:lable.welcome.china=Welcome!!!
3. 創(chuàng )建英文資源文件ApplicationResource_en.properites
4. 創(chuàng )建臨時(shí)中文資源文件ApplicationResource_temp.properites例如:lable.welcom.china=中國歡迎您!
5. 對臨時(shí)中文資源文件進(jìn)行編碼轉換??梢允褂胢yeclipse的插件,也可以在dos下執行:
native2ascii -encoding gb2312 ApplicationResource_temp.propertiesApplicationResource_zh_CN.properties
6. 在jsp中加入struts的bean標記庫
6、 Struts框架的數據驗證可分為幾種類(lèi)型?
表單驗證(由ActionForm Bean處理):如果用戶(hù)沒(méi)有在表單中輸入姓名,就提交表單,將生成表單驗證錯誤
業(yè)務(wù)邏輯驗證(由Action處理):如果用戶(hù)在表單中輸入的姓名為“Monster”,按照本應用的業(yè)務(wù)規則,不允許向“Monster”打招呼,因此將生成業(yè)務(wù)邏輯錯誤。
7、簡(jiǎn)述Form Bean的表單驗證流程。
1、當用戶(hù)提交了HTML表單,Struts框架自動(dòng)把表單數據組裝到ActionForm Bean中。
2、接下來(lái)Struts框架會(huì )調用ActionForm Bean的validate()方法進(jìn)行表單驗證。
3、如果validate()方法返回的ActionErrors對象為null,或者不包含任何ActionMessage對象,就表示沒(méi)有錯誤,數據驗證通過(guò)。
4、如果ActionErrors中包含ActionMessage對象,就表示發(fā)生了驗證錯誤,Struts框架會(huì )把ActionErrors對象保存到request范圍內,然后把請求轉發(fā)到恰當的視圖組件,視圖組件通過(guò)<html:errors>標簽把request范圍內的ActionErrors對象中包含的錯誤消息顯示出來(lái),提示用戶(hù)修改錯誤。
8、簡(jiǎn)單敘述ActionForm Bean的作用
1、ActionFormBean也是一種JavaBean,除了具有一些JavaBean的常規方法,還包含一些特殊的方法,用于驗證HTML表單數據以及將其屬性重新設置為默認值。
2、Struts框架利用ActionForm Bean來(lái)進(jìn)行View組件和Controller組件之間表單數據的傳遞。
3、Struts框架把View組件接受到的用戶(hù)輸入的表單數據保存在A(yíng)ctionFormBean中,把它傳遞給Controller組件,Controller組件可以對ActionFormBean中的數據進(jìn)行修改JSP文件使用Struts標簽讀取修改后的ActionForm Bean的信息,重新設置HTML表單。
9、Struts優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1. 實(shí)現MVC模式,結構清晰,使開(kāi)發(fā)者只關(guān)注業(yè)務(wù)邏輯的實(shí)現.
2.有豐富的tag可以用 ,Struts的標記庫(Taglib),如能靈活動(dòng)用,則能大大提高開(kāi)發(fā)效率
3. 頁(yè)面導航
使系統的脈絡(luò )更加清晰。通過(guò)一個(gè)配置文件,即可把握整個(gè)系統各部分之間的聯(lián)系,這對于后期的維護有著(zhù)莫大的好處。尤其是當另一批開(kāi)發(fā)者接手這個(gè)項目時(shí),這種優(yōu)勢體現得更加明顯。
4. 提供Exception處理機制 .
5. 數據庫鏈接池管理
6. 支持I18N
缺點(diǎn)
一、轉到展示層時(shí),需要配置forward,如果有十個(gè)展示層%4??鍵)。
此時(shí)該實(shí)體中的任何屬性的更新都不會(huì )反映到數據庫表中。
持久化:當一個(gè)實(shí)體和Hibernate的Session創(chuàng )建了關(guān)系,
并獲取了持久化標識,而且在Hibernate的Session生命周期內存在。
此時(shí)針對該實(shí)體任何屬性的更改都會(huì )直接影響到數據庫表中一條記錄對應字段的更新,
也即與對應數據庫表保持同步。
脫管:當一個(gè)實(shí)體和Hibernate的Session創(chuàng )建了關(guān)系,并獲取了持久化標識,
而此時(shí)Hibernate的Session的生命周期結束,實(shí)體的持久化標識沒(méi)有被改動(dòng)過(guò)。
針對該實(shí)體的任何屬性的修改都不會(huì )及時(shí)反映到數據庫表中。
5、性能問(wèn)題
在批操作性能和cache之間存在不可調和的矛盾,
你要熟悉hibernate一級和二級緩存機制才能寫(xiě)出合理批操作代碼,
否則不但性能低下,還可能導致out memory。
hibernate reference文檔中的Best practise也提到,
Use hand-coded JDBC in bottlenecks,
也就是說(shuō)在某些性能瓶頸的地方考慮使用硬編碼jdbc。
6、JDBC,Hibernate,EJB三者的區別?
EJB:我們必須遵守復雜的J2EE規范,Hibernate不強迫必須滿(mǎn)足特定的規范.
EJB只能運行在EJB容器中,Hibernate可以運行在任何java環(huán)境中.
目前,對于復雜的域模型,EJB容器提供的對象-關(guān)系映射能力有限.相比之下,Hibernate提供了完善的對象-關(guān)系映射服務(wù).
EJB雖然是一種可以移植的組件,但是實(shí)際上卻受到很大的限制,因為各個(gè)產(chǎn)商生產(chǎn)CMP引擎差異,它們使用的對象-關(guān)系映射
元數據各不相同,使得EJB不能順利的從一個(gè)EJB容器移植到另一個(gè)EJB容器當中.而Hibernate可以無(wú)縫集成到任何一個(gè)Java系統中.
JDBC:實(shí)現業(yè)務(wù)邏輯的代碼和訪(fǎng)問(wèn)數據庫的代碼混雜在一起,使程序結構不清晰,可讀性差
7、get和load的區別
1>不存在對應記錄時(shí)表現不一樣
2>load返回的是代理對象(javassist.jar生成二進(jìn)制碼),等到真正用到對象的內容才會(huì )發(fā)出SQL語(yǔ)句
3>get直接從數據庫加載,不會(huì )延遲
無(wú)論是get還是load,都會(huì )首先查找緩存(一級緩存),如果沒(méi)有,才會(huì )去數據庫查找,調用clear()方法,可以強制清除
8、Hibernate是如何延遲加載?
1. Hibernate2延遲加載實(shí)現:a)實(shí)體對象
2. Hibernate3 提供了屬性的延遲加載功能
當Hibernate在查詢(xún)數據的時(shí)候,數據并沒(méi)有存在與內存中,當程序真正對數據的操作時(shí),對象才存在與內存中,就實(shí)現了延遲加載,他節省了服務(wù)器的內存開(kāi)銷(xiāo),從而提高了服務(wù)器的性能。
9、如何對hibernate進(jìn)行優(yōu)化?
1. 使用雙向一對多關(guān)聯(lián),不使用單向一對多
2. 靈活使用單向一對多關(guān)聯(lián)
3. 不用一對一,用多對一取代
4. 配置對象緩存,不使用集合緩存
5. 一對多集合使用Bag,多對多集合使用Set
6. 繼承類(lèi)使用顯式多態(tài)
7. 表字段要少,表關(guān)聯(lián)不要怕多,有二級緩存
10、 hibernate的核心類(lèi)是什么,它們的相互關(guān)系是什么?重要的方法是什么?
Configuration 接口:配置Hibernate,根據其啟動(dòng)hibernate,創(chuàng )建SessionFactory對象;
SessionFactory 接口:初始化Hibernate,充當數據存儲源的代理,創(chuàng )建session對象,sessionFactory 是線(xiàn)程安全的,意味著(zhù)它的同一個(gè)實(shí)例可以被應用的多個(gè)線(xiàn)程共享,是重量級、二級緩存;
Session接口:負責保存、更新、刪除、加載和查詢(xún)對象,是線(xiàn)程不安全的,避免多個(gè)線(xiàn)程共享同一個(gè)session,是輕量級、一級緩存;
Session如下方法: save,load,update,delete,
Query q=CreateQuery(“from Customer wherecustomerName=:customerName”)
beginTransaction, close, transaction, commit
Transaction 接口:管理事務(wù);
Query 和Criteria 接口:執行數據庫的查詢(xún)。
Spring相關(guān)
1、Spring的理解
Spring是一個(gè)輕量級的容器,非侵入性的框架.最重要的核心概念是IOC,并提供AOP概念的實(shí)現方式,提供對持久層,事務(wù)的支持,對當前流行的一些框架(Struts,Hibernate,MVC),Sping也提供了與它們的相整合的方案.
使用Spring,我們能夠減少類(lèi)之間的依賴(lài)性和程序之間的耦合度,最大程度的實(shí)現松耦合,使程序更加靈活,可擴展性更強.
IOC,中文翻譯為"反轉控制,".DI->;"依賴(lài)注入"指的是:我們不必自己在程序代碼中維護對象的依賴(lài)關(guān)系,而是通過(guò)一個(gè)xml配置文件,將類(lèi)的屬性和實(shí)例悄悄的注入到類(lèi)里面.實(shí)現類(lèi)的動(dòng)態(tài)加載,使得類(lèi)和類(lèi)之間可以方便的切換(通過(guò)接口).
這種設計方式的思想表現為:高層模塊不應該依賴(lài)低層模塊,而是模塊都必須依賴(lài)于抽象.程序不應改依賴(lài)于實(shí)現,而是依賴(lài)于抽象接口.應用程序不要去找容器,而是容器給我們所有想要的對象.
Spring的另一個(gè)重要的方面是支持AOP的實(shí)現:
AOP的中文翻譯是:面向切面編程,也稱(chēng)為面向問(wèn)題編程.面向切面編程(aop)是對面向對象編程(oop)的補充,
面向對象編程將程序分解成各個(gè)層次的對象,面向切面編程將程序運行過(guò)程分解成各個(gè)切面。AOP從程序運行角度考慮程序的結構,提取業(yè)務(wù)處理過(guò)程的切面,oop是靜態(tài)的抽象,aop是動(dòng)態(tài)的抽象,是對應用執行過(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 層)相對應。雖然目前這 3 個(gè)注釋和 @Component 相比沒(méi)有什么新意,但Spring 將在以后的版本中為它們添加特殊的功能。所以,如果 Web應用程序采用了經(jīng)典的三層分層結構的話(huà),最好在持久層、業(yè)務(wù)層和控制層分別采用 @Repository、@Service 和@Controller 對分層中的類(lèi)進(jìn)行注釋?zhuān)?@Component 對那些比較中立的類(lèi)進(jìn)行注釋。
在一個(gè)稍大的項目中,通常會(huì )有上百個(gè)組件,如果這些組件采用xml的bean定義來(lái)配置,顯然會(huì )增加配置文件的體積,查找以及維護起來(lái)也不太方便。Spring2.5為我們引入了組件自動(dòng)掃描機制,他可以在類(lèi)路徑底下尋找標注了@Component,@Service,@Controller,@Repository注解的類(lèi),并把這些類(lèi)納入進(jìn)spring容器中管理。它的作用和在xml文件中使用bean節點(diǎn)配置組件時(shí)一樣的。
@Service用于標注業(yè)務(wù)層組件,
@Controller用于標注控制層組件(如struts中的action),
@Repository用于標注數據訪(fǎng)問(wèn)組件,即DAO組件,
@Component泛指組件,當組件不好歸類(lèi)的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標注。
3、spring 的優(yōu)點(diǎn)都有哪些?
1.降低了組件之間的耦合性 ,實(shí)現了軟件各層之間的解耦
2.可以使用容易提供的眾多服務(wù),如事務(wù)管理,消息服務(wù)等
3.容器提供單例模式支持
4.容器提供了AOP技術(shù),利用它很容易實(shí)現如權限攔截,運行期監控等功能
5.容器提供了眾多的輔助類(lèi),能加快應用的開(kāi)發(fā)
6.spring對于主流的應用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring屬于低侵入式設計,代碼的污染極低
8.獨立于各種應用服務(wù)器
9.spring的DI機制降低了業(yè)務(wù)對象替換的復雜性
10.Spring的高度開(kāi)放性,并不強制應用完全依賴(lài)于Spring,開(kāi)發(fā)者可以自由選擇spring的部分或全部
4、Spring里面如何配置數據庫驅動(dòng)?
使用”org.springframework.jdbc.datasource.DriverManagerDataSource”數據源來(lái)配置數據庫驅動(dòng)。
5、Spring里面applicationContext.xml文件能不能改成其他文件名?
ContextLoaderListener是一個(gè)ServletContextListener,它在你的web應用啟動(dòng)的時(shí)候初始化。缺省情況下,它會(huì )在WEB-INF/applicationContext.xml文件找Spring的配置。你可以通過(guò)定義一個(gè)元素名字為”contextConfigLocation”來(lái)改變Spring配置文件的位置。示例如下:
org.springframework.web.context.ContextLoaderListenercontextConfigLocation /WEB-INF/xyz.xml
6、AOP里面重要的幾個(gè)名詞概念解釋
切面(Aspect):一個(gè)關(guān)注點(diǎn)的模塊化,這個(gè)關(guān)注點(diǎn)可能會(huì )橫切多個(gè)對象。事務(wù)管理是J2EE應用中一個(gè)關(guān)于橫切關(guān)注點(diǎn)的很好的例子。 在SpringAOP中,切面可以使用通用類(lèi)(基于模式的風(fēng)格) 或者在普通類(lèi)中以 @Aspect 注解(@AspectJ風(fēng)格)來(lái)實(shí)現。
連接點(diǎn)(Joinpoint): 在程序執行過(guò)程中某個(gè)特定的點(diǎn),比如某方法調用的時(shí)候或者處理異常的時(shí)候。 在SpringAOP中,一個(gè)連接點(diǎn) 總是 代表一個(gè)方法的執行。通過(guò)聲明一個(gè)org.aspectj.lang.JoinPoint類(lèi)型的參數可以使通知(Advice)的主體部分獲得連接點(diǎn)信息。
通知(Advice):在切面的某個(gè)特定的連接點(diǎn)(Joinpoint)上執行的動(dòng)作。通知有各種類(lèi)型,其中包括“around”、“before”和“after”等通知。通知的類(lèi)型將在后面部分進(jìn)行討論。許多AOP框架,包括Spring,都是以攔截器做通知模型,并維護一個(gè)以連接點(diǎn)為中心的攔截器鏈。
切入點(diǎn)(Pointcut):匹配連接點(diǎn)(Joinpoint)的斷言。通知和一個(gè)切入點(diǎn)表達式關(guān)聯(lián),并在滿(mǎn)足這個(gè)切入點(diǎn)的連接點(diǎn)上運行(例如,當執行某個(gè)特定名稱(chēng)的方法時(shí))。切入點(diǎn)表達式如何和連接點(diǎn)匹配是AOP的核心:Spring缺省使用AspectJ切入點(diǎn)語(yǔ)法。
引入(Introduction): (也被稱(chēng)為內部類(lèi)型聲明(inter-typedeclaration))。聲明額外的方法或者某個(gè)類(lèi)型的字段。 Spring允許引入新的接口(以及一個(gè)對應的實(shí)現)到任何被代理的對象。例如,你可以使用一個(gè)引入來(lái)使bean實(shí)現 IsModified 接口,以便簡(jiǎn)化緩存機制。
目標對象(Target Object): 被一個(gè)或者多個(gè)切面(aspect)所通知(advise)的對象。也有人把它叫做被通知(advised) 對象。 既然Spring AOP是通過(guò)運行時(shí)代理實(shí)現的,這個(gè)對象永遠是一個(gè) 被代理(proxied)對象。
AOP代理(AOP Proxy): AOP框架創(chuàng )建的對象,用來(lái)實(shí)現切面契約(aspectcontract)(包括通知方法執行等功能)。 在Spring中,AOP代理可以是JDK動(dòng)態(tài)代理或者CGLIB代理。注意:Spring2.0最新引入的基于模式(schema-based)風(fēng)格和@AspectJ注解風(fēng)格的切面聲明,對于使用這些風(fēng)格的用戶(hù)來(lái)說(shuō),代理的創(chuàng )建是透明的。
織入(Weaving): 把切面(aspect)連接到其它的應用程序類(lèi)型或者對象上,并創(chuàng )建一個(gè)被通知(advised)的對象。這些可以在編譯時(shí)(例如使用AspectJ編譯器),類(lèi)加載時(shí)和運行時(shí)完成。 Spring和其他純JavaAOP框架一樣,在運行時(shí)完成織入。
通知的類(lèi)型:
前置通知(Before advice): 在某連接點(diǎn)(joinpoint)之前執行的通知,但這個(gè)通知不能阻止連接點(diǎn)前的執行(除非它拋出一個(gè)異常)。
返回后通知(After returning advice): 在某連接點(diǎn)(joinpoint)正常完成后執行的通知:例如,一個(gè)方法沒(méi)有拋出任何異常,正常返回。
拋出異常后通知(After throwing advice): 在方法拋出異常退出時(shí)執行的通知。
后通知(After (finally) advice): 當某連接點(diǎn)退出的時(shí)候執行的通知(不論是正常返回還是異常退出)。
環(huán)繞通知(Around Advice): 包圍一個(gè)連接點(diǎn)(join point)的通知,如方法調用。這是最強大的一種通知類(lèi)型。環(huán)繞通知可以在方法調用前后完成自定義的行為。它也會(huì )選擇是否繼續執行連接點(diǎn)或直接返回它們自己的返回值或拋出異常來(lái)結束執行。
環(huán)繞通知是最常用的一種通知類(lèi)型。大部分基于攔截的AOP框架,例如Nanning和JBoss4,都只提供環(huán)繞通知。
切入點(diǎn)(pointcut)和連接點(diǎn)(joinpoint)匹配的概念是AOP的關(guān)鍵,這使得AOP不同于其它僅僅提供攔截功能的舊技術(shù)。切入點(diǎn)使得定位通知(advice)可獨立于OO層次。例如,一個(gè)提供聲明式事務(wù)管理的around通知可以被應用到一組橫跨多個(gè)對象中的方法上(例如服務(wù)層的所有業(yè)務(wù)操作)。
聯(lián)系客服