Spring面試題總結(jié)的很全面,附帶超詳細(xì)答案

1藻烤、什么是Spring绷雏?

Spring是一個開源的Java EE開發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Java應(yīng)用程序中怖亭,但對Java EE平臺上的Web應(yīng)用程序有更好的擴(kuò)展性涎显。Spring框架的目標(biāo)是使得Java EE應(yīng)用程序的開發(fā)更加簡捷,通過使用POJO為基礎(chǔ)的編程模型促進(jìn)良好的編程風(fēng)格依许。

2棺禾、Spring有哪些優(yōu)點(diǎn)?

輕量級:Spring在大小和透明性方面絕對屬于輕量級的峭跳,基礎(chǔ)版本的Spring框架大約只有2MB膘婶。

控制反轉(zhuǎn)(IOC):Spring使用控制反轉(zhuǎn)技術(shù)實(shí)現(xiàn)了松耦合。依賴被注入到對象蛀醉,而不是創(chuàng)建或?qū)ふ乙蕾噷ο蟆?/p>

面向切面編程(AOP): Spring支持面向切面編程悬襟,同時把應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)的服務(wù)分離開來。

容器:Spring包含并管理應(yīng)用程序?qū)ο蟮呐渲眉吧芷凇?/p>

MVC框架:Spring的web框架是一個設(shè)計(jì)優(yōu)良的web MVC框架拯刁,很好的取代了一些web框架脊岳。

事務(wù)管理:Spring對下至本地業(yè)務(wù)上至全局業(yè)務(wù)(JAT)提供了統(tǒng)一的事務(wù)管理接口。

異常處理:Spring提供一個方便的API將特定技術(shù)的異常(由JDBC, Hibernate, 或JDO拋出)轉(zhuǎn)化為一致的垛玻、Unchecked異常割捅。

3、Spring 事務(wù)實(shí)現(xiàn)方式

  • 編程式事務(wù)管理:這意味著你可以通過編程的方式管理事務(wù)帚桩,這種方式帶來了很大的靈活性亿驾,但很難維護(hù)。聲明式事務(wù)管理:這種方式意味著你可以將事務(wù)管理和業(yè)務(wù)代碼分離账嚎。你只需要通過注解或者XML配置管理事務(wù)莫瞬。

4儡蔓、Spring框架的事務(wù)管理有哪些優(yōu)點(diǎn)

  • 它為不同的事務(wù)API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了統(tǒng)一的編程模型。它為編程式事務(wù)管理提供了一個簡單的API而非一系列復(fù)雜的事務(wù)API(如JTA).它支持聲明式事務(wù)管理疼邀。它可以和Spring 的多種數(shù)據(jù)訪問技術(shù)很好的融合喂江。

5、spring事務(wù)定義的傳播規(guī)則

  • PROPAGATION_REQUIRED: 支持當(dāng)前事務(wù)旁振,如果當(dāng)前沒有事務(wù)获询,就新建一個事務(wù)。這是最常見的選擇拐袜。PROPAGATION_SUPPORTS: 支持當(dāng)前事務(wù)筐付,如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行阻肿。PROPAGATION_MANDATORY: 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù)沮尿,就拋出異常丛塌。PROPAGATION_REQUIRES_NEW: 新建事務(wù),如果當(dāng)前存在事務(wù)畜疾,把當(dāng)前事務(wù)掛起赴邻。PROPAGATION_NOT_SUPPORTED: 以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù)啡捶,就把當(dāng)前事務(wù)掛起姥敛。PROPAGATION_NEVER: 以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù)瞎暑,則拋出異常彤敛。PROPAGATION_NESTED: 如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行了赌。如果當(dāng)前沒有事務(wù)墨榄,則進(jìn)行與PROPAGATION_REQUIRED類似的操作。

6勿她、Spring 事務(wù)底層原理

  • 劃分處理單元——IoC

由于spring解決的問題是對單個數(shù)據(jù)庫進(jìn)行局部事務(wù)處理的袄秩,具體的實(shí)現(xiàn)首先用spring中的IoC劃分了事務(wù)處理單元。并且將對事務(wù)的各種配置放到了ioc容器中(設(shè)置事務(wù)管理器逢并,設(shè)置事務(wù)的傳播特性及隔離機(jī)制)之剧。

  • AOP攔截需要進(jìn)行事務(wù)處理的類

Spring事務(wù)處理模塊是通過AOP功能來實(shí)現(xiàn)聲明式事務(wù)處理的,具體操作(比如事務(wù)實(shí)行的配置和讀取砍聊,事務(wù)對象的抽象)背稼,用TransactionProxyFactoryBean接口來使用AOP功能,生成proxy代理對象辩恼,通過TransactionInterceptor完成對代理方法的攔截雇庙,將事務(wù)處理的功能編織到攔截的方法中谓形。讀取ioc容器事務(wù)配置屬性,轉(zhuǎn)化為spring事務(wù)處理需要的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(TransactionAttributeSourceAdvisor)疆前,轉(zhuǎn)化為TransactionAttribute表示的數(shù)據(jù)對象寒跳。

  • 對事務(wù)處理實(shí)現(xiàn)(事務(wù)的生成、提交竹椒、回滾童太、掛起)

spring委托給具體的事務(wù)處理器實(shí)現(xiàn)。實(shí)現(xiàn)了一個抽象和適配胸完。適配的具體事務(wù)處理器:DataSource數(shù)據(jù)源支持书释、hibernate數(shù)據(jù)源事務(wù)處理支持、JDO數(shù)據(jù)源事務(wù)處理支持赊窥,JPA爆惧、JTA數(shù)據(jù)源事務(wù)處理支持。這些支持都是通過設(shè)計(jì)PlatformTransactionManager锨能、AbstractPlatforTransaction一系列事務(wù)處理的支持扯再。 為常用數(shù)據(jù)源支持提供了一系列的TransactionManager。

  • 結(jié)合

PlatformTransactionManager實(shí)現(xiàn)了TransactionInterception接口址遇,讓其與TransactionProxyFactoryBean結(jié)合起來熄阻,形成一個Spring聲明式事務(wù)處理的設(shè)計(jì)體系。

7倔约、Spring MVC 運(yùn)行流程

第一步:發(fā)起請求到前端控制器(DispatcherServlet)

第二步:前端控制器請求HandlerMapping查找 Handler( 可以根據(jù)xml配置秃殉、注解進(jìn)行查找)

第三步:處理器映射器HandlerMapping向前端控制器返回Handler

第四步:前端控制器調(diào)用處理器適配器去執(zhí)行Handler

第五步:處理器適配器去執(zhí)行Handler

第六步:Handler執(zhí)行完成給適配器返回ModelAndView

第七步:處理器適配器向前端控制器返回ModelAndView(ModelAndView是springmvc框架的一個底層對象,包括Model和view)

第八步:前端控制器請求視圖解析器去進(jìn)行視圖解析(根據(jù)邏輯視圖名解析成真正的視圖(jsp))

第九步:視圖解析器向前端控制器返回View

第十步:前端控制器進(jìn)行視圖渲染( 視圖渲染將模型數(shù)據(jù)(在ModelAndView對象中)填充到request域)

第十一步:前端控制器向用戶響應(yīng)結(jié)果

8浸剩、BeanFactory和ApplicationContext有什么區(qū)別钾军?

ApplicationContext提供了一種解決文檔信息的方法,一種加載文件資源的方式(如圖片)乒省,他們可以向監(jiān)聽他們的beans發(fā)送消息巧颈。另外,容器或者容器中beans的操作袖扛,這些必須以bean工廠的編程方式處理的操作可以在應(yīng)用上下文中以聲明的方式處理砸泛。應(yīng)用上下文實(shí)現(xiàn)了MessageSource,該接口用于獲取本地消息蛆封,實(shí)際的實(shí)現(xiàn)是可選的唇礁。

相同點(diǎn):兩者都是通過xml配置文件加載bean,ApplicationContext和BeanFacotry相比,提供了更多的擴(kuò)展功能。

不同點(diǎn):BeanFactory是延遲加載,如果Bean的某一個屬性沒有注入惨篱,BeanFacotry加載后盏筐,直至第一次使用調(diào)用getBean方法才會拋出異常;而ApplicationContext則在初始化自身是檢驗(yàn)砸讳,這樣有利于檢查所依賴屬性是否注入琢融;所以通常情況下我們選擇使用ApplicationContext界牡。

9、什么是Spring Beans漾抬?

Spring Beans是構(gòu)成Spring應(yīng)用核心的Java對象宿亡。這些對象由Spring IOC容器實(shí)例化、組裝纳令、管理挽荠。這些對象通過容器中配置的元數(shù)據(jù)創(chuàng)建,例如平绩,使用XML文件中定義的創(chuàng)建圈匆。

在Spring中創(chuàng)建的beans都是單例的beans。在bean標(biāo)簽中有一個屬性為”singleton”,如果設(shè)為true捏雌,該bean是單例的跃赚,如果設(shè)為false,該bean是原型bean性湿。Singleton屬性默認(rèn)設(shè)置為true来累。因此,spring框架中所有的bean都默認(rèn)為單例bean窘奏。

10、說一下Spring中支持的bean作用域

Spring框架支持如下五種不同的作用域:

  • singleton:在Spring IOC容器中僅存在一個Bean實(shí)例葫录,Bean以單實(shí)例的方式存在着裹。prototype:一個bean可以定義多個實(shí)例。request:每次HTTP請求都會創(chuàng)建一個新的Bean米同。該作用域僅適用于WebApplicationContext環(huán)境骇扇。session:一個HTTP Session定義一個Bean。該作用域僅適用于WebApplicationContext環(huán)境面粮。globalSession:同一個全局HTTP Session定義一個Bean少孝。該作用域同樣僅適用于WebApplicationContext環(huán)境。

bean默認(rèn)的scope屬性是"singleton"熬苍。

11稍走、Spring 的單例實(shí)現(xiàn)原理

Spring框架對單例的支持是采用單例注冊表的方式進(jìn)行實(shí)現(xiàn)的,而這個注冊表的緩存是HashMap對象柴底,如果配置文件中的配置信息不要求使用單例婿脸,Spring會采用新建實(shí)例的方式返回對象實(shí)例。

12柄驻、解釋Spring框架中bean的生命周期

ApplicationContext容器中狐树,Bean的生命周期流程如上圖所示,流程大致如下:

Spring面試題總結(jié)的很全面鸿脓,附帶超詳細(xì)答案

1.首先容器啟動后抑钟,會對scope為singleton且非懶加載的bean進(jìn)行實(shí)例化涯曲,

2.按照Bean定義信息配置信息,注入所有的屬性在塔,

3.如果Bean實(shí)現(xiàn)了BeanNameAware接口幻件,會回調(diào)該接口的setBeanName()方法,傳入該Bean的id心俗,此時該Bean就獲得了自己在配置文件中的id傲武,

4.如果Bean實(shí)現(xiàn)了BeanFactoryAware接口,會回調(diào)該接口的setBeanFactory()方法,傳入該Bean的BeanFactory城榛,這樣該Bean就獲得了自己所在的BeanFactory揪利,

5.如果Bean實(shí)現(xiàn)了ApplicationContextAware接口,會回調(diào)該接口的setApplicationContext()方法,傳入該Bean的ApplicationContext狠持,這樣該Bean就獲得了自己所在的ApplicationContext疟位,

6.如果有Bean實(shí)現(xiàn)了BeanPostProcessor接口,則會回調(diào)該接口的postProcessBeforeInitialzation()方法喘垂,

7.如果Bean實(shí)現(xiàn)了InitializingBean接口甜刻,則會回調(diào)該接口的afterPropertiesSet()方法,

8.如果Bean配置了init-method方法正勒,則會執(zhí)行init-method配置的方法得院,

9.如果有Bean實(shí)現(xiàn)了BeanPostProcessor接口,則會回調(diào)該接口的postProcessAfterInitialization()方法章贞,

10.經(jīng)過流程9之后祥绞,就可以正式使用該Bean了,對于scope為singleton的Bean,Spring的ioc容器中會緩存一份該bean的實(shí)例,而對于scope為prototype的Bean,每次被調(diào)用都會new一個新的對象鸭限,期生命周期就交給調(diào)用方管理了蜕径,不再是Spring容器進(jìn)行管理了

11.容器關(guān)閉后,如果Bean實(shí)現(xiàn)了DisposableBean接口败京,則會回調(diào)該接口的destroy()方法兜喻,

12.如果Bean配置了destroy-method方法,則會執(zhí)行destroy-method配置的方法赡麦,至此朴皆,整個Bean的生命周期結(jié)束

13、Resource 是如何被查找泛粹、加載的车荔?

Resource 接口是 Spring 資源訪問策略的抽象,它本身并不提供任何資源訪問實(shí)現(xiàn)戚扳,具體的資源訪問由該接口的實(shí)現(xiàn)類完成——每個實(shí)現(xiàn)類代表一種資源訪問策略忧便。 Spring 為 Resource 接口提供了如下實(shí)現(xiàn)類:

  • UrlResource:訪問網(wǎng)絡(luò)資源的實(shí)現(xiàn)類。ClassPathResource:訪問類加載路徑里資源的實(shí)現(xiàn)類。FileSystemResource:訪問文件系統(tǒng)里資源的實(shí)現(xiàn)類珠增。ServletContextResource:訪問相對于 ServletContext 路徑里的資源的實(shí)現(xiàn)類:InputStreamResource:訪問輸入流資源的實(shí)現(xiàn)類超歌。ByteArrayResource:訪問字節(jié)數(shù)組資源的實(shí)現(xiàn)類。 這些 Resource 實(shí)現(xiàn)類蒂教,針對不同的的底層資源巍举,提供了相應(yīng)的資源訪問邏輯,并提供便捷的包裝凝垛,以利于客戶端程序的資源訪問懊悯。

14、解釋自動裝配的各種模式梦皮?

自動裝配提供五種不同的模式供Spring容器用來自動裝配beans之間的依賴注入:

no:默認(rèn)的方式是不進(jìn)行自動裝配炭分,通過手工設(shè)置ref 屬性來進(jìn)行裝配bean。

byName:通過參數(shù)名自動裝配剑肯,Spring容器查找beans的屬性捧毛,這些beans在XML配置文件中被設(shè)置為byName。之后容器試圖匹配让网、裝配和該bean的屬性具有相同名字的bean呀忧。

byType:通過參數(shù)的數(shù)據(jù)類型自動自動裝配,Spring容器查找beans的屬性溃睹,這些beans在XML配置文件中被設(shè)置為byType而账。之后容器試圖匹配和裝配和該bean的屬性類型一樣的bean。如果有多個bean符合條件因篇,則拋出錯誤福扬。

constructor:這個同byType類似,不過是應(yīng)用于構(gòu)造函數(shù)的參數(shù)惜犀。如果在BeanFactory中不是恰好有一個bean與構(gòu)造函數(shù)參數(shù)相同類型,則拋出一個嚴(yán)重的錯誤狠裹。

autodetect:如果有默認(rèn)的構(gòu)造方法虽界,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配涛菠。

15莉御、Spring中的依賴注入是什么?

依賴注入作為控制反轉(zhuǎn)(IOC)的一個層面俗冻,可以有多種解釋方式礁叔。在這個概念中,你不用創(chuàng)建對象而只需要描述如何創(chuàng)建它們迄薄。你不必通過代碼直接的將組件和服務(wù)連接在一起琅关,而是通過配置文件說明哪些組件需要什么服務(wù)。之后IOC容器負(fù)責(zé)銜接讥蔽。

16涣易、有哪些不同類型的IOC(依賴注入)画机?

構(gòu)造器依賴注入:構(gòu)造器依賴注入在容器觸發(fā)構(gòu)造器的時候完成,該構(gòu)造器有一系列的參數(shù)新症,每個參數(shù)代表注入的對象步氏。

Setter方法依賴注入:首先容器會觸發(fā)一個無參構(gòu)造函數(shù)或無參靜態(tài)工廠方法實(shí)例化對象,之后容器調(diào)用bean中的setter方法完成Setter方法依賴注入徒爹。

17荚醒、你推薦哪種依賴注入?構(gòu)造器依賴注入還是Setter方法依賴注入隆嗅?

你可以同時使用兩種方式的依賴注入界阁,最好的選擇是使用構(gòu)造器參數(shù)實(shí)現(xiàn)強(qiáng)制依賴注入,使用setter方法實(shí)現(xiàn)可選的依賴關(guān)系榛瓮。

18铺董、Spring IOC 如何實(shí)現(xiàn)

Spring中的 org.springframework.beans 包和 org.springframework.context包構(gòu)成了Spring框架IoC容器的基礎(chǔ)。

BeanFactory 接口提供了一個先進(jìn)的配置機(jī)制禀晓,使得任何類型的對象的配置成為可能精续。ApplicationContex接口對BeanFactory(是一個子接口)進(jìn)行了擴(kuò)展,在BeanFactory的基礎(chǔ)上添加了其他功能粹懒,比如與Spring的AOP更容易集成重付,也提供了處理message resource的機(jī)制(用于國際化)、事件傳播以及應(yīng)用層的特別配置凫乖,比如針對Web應(yīng)用的WebApplicationContext确垫。

org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具體實(shí)現(xiàn),用來包裝和管理前面提到的各種bean帽芽。BeanFactory接口是Spring IoC 容器的核心接口删掀。

19、Spring IoC容器是什么导街?

Spring IOC負(fù)責(zé)創(chuàng)建對象披泪、管理對象(通過依賴注入)、整合對象搬瑰、配置對象以及管理這些對象的生命周期款票。

20、IoC有什么優(yōu)點(diǎn)泽论?

IOC或依賴注入減少了應(yīng)用程序的代碼量艾少。它使得應(yīng)用程序的測試很簡單,因?yàn)樵趩卧獪y試中不再需要單例或JNDI查找機(jī)制翼悴。簡單的實(shí)現(xiàn)以及較少的干擾機(jī)制使得松耦合得以實(shí)現(xiàn)缚够。IOC容器支持勤性單例及延遲加載服務(wù)。

21、解釋AOP模塊

AOP模塊用來開發(fā)Spring應(yīng)用程序中具有切面性質(zhì)的部分潮瓶。該模塊的大部分服務(wù)由AOP Aliance提供陶冷,這就保證了Spring框架和其他AOP框架之間的互操作性。另外毯辅,該模塊將元數(shù)據(jù)編程引入到了Spring埂伦。

22、Spring面向切面編程(AOP)

面向切面編程(AOP):允許程序員模塊化橫向業(yè)務(wù)邏輯思恐,或定義核心部分的功能沾谜,例如日志管理和事務(wù)管理。

切面(Aspect) :AOP的核心就是切面胀莹,它將多個類的通用行為封裝為可重用的模塊基跑。該模塊含有一組API提供 cross-cutting功能。例如,日志模塊稱為日志的AOP切面描焰。根據(jù)需求的不同媳否,一個應(yīng)用程序可以有若干切面。在Spring AOP中荆秦,切面通過帶有@Aspect注解的類實(shí)現(xiàn)篱竭。

通知(Advice):通知表示在方法執(zhí)行前后需要執(zhí)行的動作。實(shí)際上它是Spring AOP框架在程序執(zhí)行過程中觸發(fā)的一些代碼步绸。Spring切面可以執(zhí)行一下五種類型的通知:

  • before(前置通知):在一個方法之前執(zhí)行的通知掺逼。after(最終通知):當(dāng)某連接點(diǎn)退出的時候執(zhí)行的通知(不論是正常返回還是異常退出)。after-returning(后置通知):在某連接點(diǎn)正常完成后執(zhí)行的通知瓤介。after-throwing(異常通知):在方法拋出異常退出時執(zhí)行的通知吕喘。around(環(huán)繞通知):在方法調(diào)用前后觸發(fā)的通知。

切入點(diǎn)(Pointcut):切入點(diǎn)是一個或一組連接點(diǎn)刑桑,通知將在這些位置執(zhí)行氯质。可以通過表達(dá)式或匹配的方式指明切入點(diǎn)祠斧。

引入:引入允許我們在已有的類上添加新的方法或?qū)傩浴?/p>

目標(biāo)對象:被一個或者多個切面所通知的對象闻察。它通常是一個代理對象。也被稱做被通知(advised)對象梁肿。

代理:代理是將通知應(yīng)用到目標(biāo)對象后創(chuàng)建的對象。從客戶端的角度看觅彰,代理對象和目標(biāo)對象是一樣的吩蔑。有以下幾種代理:

  • BeanNameAutoProxyCreator:bean名稱自動代理創(chuàng)建器DefaultAdvisorAutoProxyCreator:默認(rèn)通知者自動代理創(chuàng)建器Metadata autoproxying:元數(shù)據(jù)自動代理

織入:將切面和其他應(yīng)用類型或?qū)ο筮B接起來創(chuàng)建一個通知對象的過程√钐В織入可以在編譯烛芬、加載或運(yùn)行時完成。

23、Spring AOP 實(shí)現(xiàn)原理

實(shí)現(xiàn)AOP的技術(shù)赘娄,主要分為兩大類:

  • 一是采用動態(tài)代理技術(shù)仆潮,利用截取消息的方式,對該消息進(jìn)行裝飾遣臼,以取代原有對象行為的執(zhí)行性置;二是采用靜態(tài)織入的方式,引入特定的語法創(chuàng)建“方面”揍堰,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼鹏浅。

Spring AOP 的實(shí)現(xiàn)原理其實(shí)很簡單:AOP 框架負(fù)責(zé)動態(tài)地生成 AOP 代理類,這個代理類的方法則由 Advice和回調(diào)目標(biāo)對象的方法所組成, 并將該對象可作為目標(biāo)對象使用屏歹。AOP 代理包含了目標(biāo)對象的全部方法隐砸,但AOP代理中的方法與目標(biāo)對象的方法存在差異,AOP方法在特定切入點(diǎn)添加了增強(qiáng)處理蝙眶,并回調(diào)了目標(biāo)對象的方法季希。

Spring AOP使用動態(tài)代理技術(shù)在運(yùn)行期織入增強(qiáng)代碼。使用兩種代理機(jī)制:基于JDK的動態(tài)代理(JDK本身只提供接口的代理)和基于CGlib的動態(tài)代理幽纷。

  • (1) JDK的動態(tài)代理
  • JDK的動態(tài)代理主要涉及java.lang.reflect包中的兩個類:Proxy和InvocationHandler式塌。其中InvocationHandler只是一個接口,可以通過實(shí)現(xiàn)該接口定義橫切邏輯霹崎,并通過反射機(jī)制調(diào)用目標(biāo)類的代碼珊搀,動態(tài)的將橫切邏輯與業(yè)務(wù)邏輯織在一起。而Proxy利用InvocationHandler動態(tài)創(chuàng)建一個符合某一接口的實(shí)例尾菇,生成目標(biāo)類的代理對象境析。
  • 其代理對象必須是某個接口的實(shí)現(xiàn), 它是通過在運(yùn)行期間創(chuàng)建一個接口的實(shí)現(xiàn)類來完成對目標(biāo)對象的代理.只能實(shí)現(xiàn)接口的類生成代理,而不能針對類(2)CGLib
  • CGLib采用底層的字節(jié)碼技術(shù),為一個類創(chuàng)建子類派诬,并在子類中采用方法攔截的技術(shù)攔截所有父類的調(diào)用方法劳淆,并順勢織入橫切邏輯.它運(yùn)行期間生成的代理對象是目標(biāo)類的擴(kuò)展子類.所以無法通知final、private的方法,因?yàn)樗鼈儾荒鼙桓矊?是針對類實(shí)現(xiàn)代理,主要是為指定的類生成一個子類,覆蓋其中方法.
  • 在spring中默認(rèn)情況下使用JDK動態(tài)代理實(shí)現(xiàn)AOP,如果proxy-target-class設(shè)置為true或者使用了優(yōu)化策略那么會使用CGLIB來創(chuàng)建動態(tài)代理.Spring AOP在這兩種方式的實(shí)現(xiàn)上基本一樣.以JDK代理為例默赂,會使用JdkDynamicAopProxy來創(chuàng)建代理沛鸵,在invoke()方法首先需要織入到當(dāng)前類的增強(qiáng)器封裝到攔截器鏈中,然后遞歸的調(diào)用這些攔截器完成功能的織入.最終返回代理對象.

點(diǎn)個關(guān)注唄

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缆八,一起剝皮案震驚了整個濱河市曲掰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奈辰,老刑警劉巖栏妖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奖恰,居然都是意外死亡吊趾,警方通過查閱死者的電腦和手機(jī)古戴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門吧寺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來周叮,“玉大人所禀,你說我怎么就攤上這事∑ㄗ啵” “怎么了岩榆?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長了袁。 經(jīng)常有香客問我朗恳,道長,這世上最難降的妖魔是什么载绿? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任粥诫,我火速辦了婚禮,結(jié)果婚禮上崭庸,老公的妹妹穿的比我還像新娘怀浆。我一直安慰自己,他們只是感情好怕享,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布执赡。 她就那樣靜靜地躺著,像睡著了一般函筋。 火紅的嫁衣襯著肌膚如雪沙合。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天跌帐,我揣著相機(jī)與錄音首懈,去河邊找鬼。 笑死谨敛,一個胖子當(dāng)著我的面吹牛究履,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脸狸,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼最仑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了炊甲?” 一聲冷哼從身側(cè)響起泥彤,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卿啡,沒想到半個月后吟吝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牵囤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年爸黄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揭鳞。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡炕贵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出野崇,到底是詐尸還是另有隱情称开,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布乓梨,位于F島的核電站鳖轰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扶镀。R本人自食惡果不足惜蕴侣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臭觉。 院中可真熱鬧昆雀,春花似錦、人聲如沸蝠筑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽什乙。三九已至挽封,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臣镣,已是汗流浹背辅愿。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留退疫,地道東北人渠缕。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像褒繁,于是被迫代替她去往敵國和親亦鳞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容