成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring Framework 參考文檔(聲明式基于注解的緩存)

makeFoxPlay / 3727人閱讀

摘要:聲明式基于注解的緩存對于緩存聲明,的緩存抽象提供了一組注解觸發(fā)緩存人口。重新組合要應(yīng)用于方法的多個(gè)緩存操作。雖然在大多數(shù)情況下,只聲明一個(gè)緩存,但是注解允許指定多個(gè)名稱,以便使用多個(gè)緩存。

聲明式基于注解的緩存

對于緩存聲明,Spring的緩存抽象提供了一組Java注解:

@Cacheable:觸發(fā)緩存人口。

@CacheEvict:觸發(fā)緩存驅(qū)逐。

@CachePut:在不影響方法執(zhí)行的情況下更新緩存。

@Caching:重新組合要應(yīng)用于方法的多個(gè)緩存操作。

@CacheConfig:在類級別上共享一些常見的緩存相關(guān)設(shè)置。

@Cacheable注解

顧名思義,你可以使用@Cacheable來劃分可緩存的方法 — 也就是說,將結(jié)果存儲在緩存中的方法,以便在后續(xù)調(diào)用(具有相同的參數(shù))時(shí)返回緩存中的值,而不必實(shí)際執(zhí)行該方法。在其最簡單的形式中,注解聲明需要與帶注解的方法相關(guān)聯(lián)的緩存的名稱,如下面的示例所示:

@Cacheable("books")
public Book findBook(ISBN isbn) {...}

在前面的代碼片段中,findBook方法與名為books的緩存相關(guān)聯(lián),每次調(diào)用該方法時(shí),都會檢查緩存,以查看是否已經(jīng)執(zhí)行了調(diào)用,并且不需要重復(fù)調(diào)用。雖然在大多數(shù)情況下,只聲明一個(gè)緩存,但是注解允許指定多個(gè)名稱,以便使用多個(gè)緩存。在本例中,在執(zhí)行方法之前檢查每個(gè)緩存 — 如果至少命中一個(gè)緩存,則返回關(guān)聯(lián)的值。

所有其他不包含該值的緩存也會被更新,即使緩存的方法并沒有實(shí)際執(zhí)行。

下面的示例在findBook方法上使用@Cacheable

@Cacheable({"books", "isbns"})
public Book findBook(ISBN isbn) {...}
默認(rèn)鍵生成

由于緩存本質(zhì)上是鍵值存儲,因此每次對緩存方法的調(diào)用都需要轉(zhuǎn)換為適合緩存訪問的鍵,緩存抽象使用基于以下算法的簡單KeyGenerator

如果沒有提供參數(shù),則返回SimpleKey.EMPTY

如果只給出一個(gè)參數(shù),則返回該實(shí)例。

如果給定多個(gè)參數(shù),則返回包含所有參數(shù)的SimpleKey。

這種方法適用于大多數(shù)用例,只要參數(shù)具有自然鍵并實(shí)現(xiàn)有效的hashCode()equals()方法,如果不是這樣,你需要改變策略。

要提供不同的默認(rèn)鍵生成器,你需要實(shí)現(xiàn)org.springframework.cache.interceptor.KeyGenerator接口。

默認(rèn)的鍵生成策略隨著Spring 4.0的發(fā)布而改變,Spring的早期版本使用的鍵生成策略,對于多個(gè)鍵參數(shù),只考慮參數(shù)的hashCode(),而不考慮equals(),這可能會導(dǎo)致意想不到的鍵沖突(有關(guān)背景,請參見SPR-10237),新的SimpleKeyGenerator為這些場景使用復(fù)合鍵。

如果你想繼續(xù)使用前面的鍵策略,可以配置已廢棄的org.springframework.cache.interceptor.DefaultKeyGenerator類,或者創(chuàng)建一個(gè)基于散列的自定義KeyGenerator實(shí)現(xiàn)。

自定義鍵生成聲明

由于緩存是通用的,因此目標(biāo)方法很可能具有各種簽名,這些簽名無法輕松映射到緩存結(jié)構(gòu)之上,當(dāng)目標(biāo)方法有多個(gè)參數(shù)時(shí),這往往會變得明顯,其中只有一些參數(shù)適用于緩存(其余參數(shù)僅由方法邏輯使用),請考慮以下示例:

@Cacheable("books")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

乍一看,雖然兩個(gè)boolean參數(shù)影響了書的發(fā)現(xiàn)方式,但它們對緩存沒有用處,如果兩個(gè)中只有一個(gè)重要而另一個(gè)不重要怎么辦?

對于這種情況,@Cacheable注解允許你通過其key屬性指定鍵的生成方式,你可以使用SpEL選擇感興趣的參數(shù)(或其嵌套屬性),執(zhí)行操作,甚至調(diào)用任意方法,而無需編寫任何代碼或?qū)崿F(xiàn)任何接口。這是默認(rèn)生成器的推薦方法,因?yàn)殡S著代碼庫的增長,簽名方法往往會有很大不同,雖然默認(rèn)策略可能適用于某些方法,但它很少適用于所有方法。

以下示例是各種SpEL聲明:

@Cacheable(cacheNames="books", key="#isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

@Cacheable(cacheNames="books", key="#isbn.rawNumber")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

@Cacheable(cacheNames="books", key="T(someType).hash(#isbn)")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

前面的代碼片段顯示了選擇某個(gè)參數(shù)、其屬性之一、甚至是任意(靜態(tài))方法是多么容易。

如果負(fù)責(zé)生成鍵的算法太具體或需要共享,則可以在操作上定義自定義keyGenerator,為此,請指定要使用的KeyGenerator bean實(shí)現(xiàn)的名稱,如以下示例所示:

@Cacheable(cacheNames="books", keyGenerator="myKeyGenerator")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
keykeyGenerator參數(shù)是互斥的,一個(gè)操作指定兩者會導(dǎo)致異常。
默認(rèn)的緩存解析

緩存抽象使用簡單的CacheResolver,它使用配置的CacheManager檢索在操作級別定義的緩存。

要提供不同的默認(rèn)緩存解析器,你需要實(shí)現(xiàn)org.springframework.cache.interceptor.CacheResolver接口。

自定義緩存解析

默認(rèn)緩存解析非常適合使用單個(gè)CacheManager并且沒有復(fù)雜緩存解析要求的應(yīng)用程序。

對于使用多個(gè)緩存管理器的應(yīng)用程序,可以將cacheManager設(shè)置為用于每個(gè)操作,如以下示例所示:

@Cacheable(cacheNames="books", cacheManager="anotherCacheManager") 
public Book findBook(ISBN isbn) {...}

你也可以完全替換CacheResolver,方式類似于替換鍵生成,為每個(gè)緩存操作請求解析,讓實(shí)現(xiàn)實(shí)際上根據(jù)運(yùn)行時(shí)參數(shù)解析要使用的緩存,以下示例顯示如何指定CacheResolver

@Cacheable(cacheResolver="runtimeCacheResolver") 
public Book findBook(ISBN isbn) {...}
從Spring 4.1開始,緩存注解的value屬性不再是必需的,因?yàn)闊o論注解的內(nèi)容如何,??CacheResolver都可以提供此特定信息。

keykeyGenerator類似,cacheManagercacheResolver參數(shù)是互斥的,指定這兩者的操作會導(dǎo)致異常,因?yàn)?b>CacheResolver實(shí)現(xiàn)忽略了自定義CacheManager,這可能不是你所期望的。

同步緩存

在多線程環(huán)境中,可能會為同一參數(shù)同時(shí)調(diào)用某些操作(通常在啟動時(shí)),默認(rèn)情況下,緩存抽象不會鎖定任何內(nèi)容,并且可能會多次計(jì)算相同的值,從而無法實(shí)現(xiàn)緩存。

對于這些特定情況,你可以使用sync屬性指示底層緩存提供程序在計(jì)算值時(shí)鎖定緩存條目,因此,只有一個(gè)線程忙于計(jì)算該值,而其他線程則被阻塞,直到該條目在緩存中更新為止,以下示例顯示了如何使用sync屬性:

@Cacheable(cacheNames="foos", sync=true) 
public Foo executeExpensiveOperation(String id) {...}
這是一項(xiàng)可選功能,你最喜歡的緩存庫可能不支持它,核心框架提供的所有CacheManager實(shí)現(xiàn)都支持它,有關(guān)更多詳細(xì)信息,請參閱緩存提供程序的文檔。
條件緩存

有時(shí),方法可能不適合一直緩存(例如,它可能取決于給定的參數(shù)),緩存注解通過condition參數(shù)支持此類功能,該參數(shù)采用被評估為truefalseSpEL表達(dá)式,如果為true,則緩存該方法,如果沒有,它的行為就好像該方法沒有被緩存(也就是說,無論緩存中的值是什么,或者使用了什么參數(shù),每次都執(zhí)行該方法)。例如,僅當(dāng)參數(shù)name的長度小于32時(shí),才會緩存以下方法:

@Cacheable(cacheNames="book", condition="#name.length() < 32") 
public Book findBook(String name)

condition參數(shù)外,還可以使用unless參數(shù)否決向緩存添加值,與condition不同,unless表達(dá)式在調(diào)用該方法后進(jìn)行評估,要擴(kuò)展上一個(gè)示例,也許我們只想緩存平裝書,如下例所示:

@Cacheable(cacheNames="book", condition="#name.length() < 32", unless="#result.hardback") 
public Book findBook(String name)

緩存抽象支持java.util.Optional,僅在其存在時(shí)將其內(nèi)容用作緩存值,#result總是引用業(yè)務(wù)實(shí)體而從不支持包裝器,因此前面的示例可以重寫如下:

@Cacheable(cacheNames="book", condition="#name.length() < 32", unless="#result?.hardback")
public Optional findBook(String name)

請注意,result仍然引用Book而不是Optional,由于它可能為null,我們應(yīng)該使用安全導(dǎo)航操作符。

可用的緩存SpEL評估上下文

每個(gè)SpEL表達(dá)式都針對專用context進(jìn)行評估,除了內(nèi)置參數(shù)之外,框架還提供專用的與緩存相關(guān)的元數(shù)據(jù),例如參數(shù)名稱。下表描述了上下文可用的項(xiàng)目,以便你可以將它們用于鍵和條件計(jì)算:

名稱 位置 描述 示例
methodName 根對象 要調(diào)用的方法的名稱 #root.methodName
method 根對象 正在調(diào)用的方法 #root.method.name
target 根對象 正在調(diào)用的目標(biāo)對象 #root.target
targetClass 根對象 正在調(diào)用的目標(biāo)的類 #root.targetClass
args 根對象 用于調(diào)用目標(biāo)的參數(shù)(作為數(shù)組) #root.args[0]
caches 根對象 執(zhí)行當(dāng)前方法的高速緩存的集合 #root.caches[0].name
參數(shù)名稱 評估上下文 任何方法參數(shù)的名稱;
如果名稱不可用(可能由于沒有調(diào)試信息),
參數(shù)名稱也可以在#a<#arg>下獲得。
其中#arg代表參數(shù)索引(從0開始)。
#iban#a0
(你也可以使用#p0
#p<#arg>表示法作為別名)
result 評估上下文 方法調(diào)用的結(jié)果(要緩存的值)
只能在unless表達(dá)式、緩存放置表達(dá)式(計(jì)算鍵)
或緩存逐出表達(dá)式(當(dāng)beforeInvocationfalse
時(shí))中使用
對于受支持的包裝器(例如Optional),
#result引用實(shí)際的對象,而不是包裝器。
#result
@CachePut注解

當(dāng)需要更新緩存而不干擾方法執(zhí)行時(shí),可以使用@CachePut注解,也就是說,始終執(zhí)行該方法,并將其結(jié)果放入緩存中(根據(jù)@CachePut選項(xiàng))。它支持與@Cacheable相同的選項(xiàng),應(yīng)該用于緩存填充而不是方法流優(yōu)化,以下示例使用@CachePut注解:

@CachePut(cacheNames="book", key="#isbn")
public Book updateBook(ISBN isbn, BookDescriptor descriptor)
通常強(qiáng)烈建議不要在同一方法上使用@CachePut@Cacheable注解,因?yàn)樗鼈冇胁煌男袨?,雖然后者導(dǎo)致通過使用緩存跳過方法執(zhí)行,但前者強(qiáng)制執(zhí)行以執(zhí)行緩存更新。這將導(dǎo)致意想不到的行為,除了特定的情況外(例如注解具有將它們彼此排除的條件)之外,應(yīng)避免此類聲明。還請注意,這些條件不應(yīng)該依賴于result對象(即#result變量),因?yàn)檫@些都是預(yù)先驗(yàn)證以確認(rèn)排除的。
@CacheEvict注解

緩存抽象不僅允許緩存存儲的填充,還允許驅(qū)逐,此過程對于從緩存中刪除陳舊或未使用的數(shù)據(jù)非常有用。與@Cacheable相反,@CacheEvict劃分了執(zhí)行緩存逐出的方法(即,用作從緩存中刪除數(shù)據(jù)的觸發(fā)器的方法)。@CacheEvict需要指定受操作影響的一個(gè)或多個(gè)緩存,允許指定自定義緩存和鍵解析或條件,并具有一個(gè)額外的參數(shù)(allEntries),指示是否需要執(zhí)行緩存范圍的驅(qū)逐而不僅僅是條目驅(qū)逐(基于鍵),以下示例逐出books緩存中的所有條目:

@CacheEvict(cacheNames="books", allEntries=true) 
public void loadBooks(InputStream batch)

當(dāng)需要清除整個(gè)緩存區(qū)域時(shí),此選項(xiàng)會派上用場,而不是逐出每個(gè)條目(這將花費(fèi)很長時(shí)間,因?yàn)樗堑托У模?,所有條目在一個(gè)操作中被移除,如前面的示例所示。請注意,框架會忽略此方案中指定的任何鍵,因?yàn)樗贿m用(整個(gè)緩存被驅(qū)逐,而不僅僅是一個(gè)條目)。

你還可以通過使用beforeInvocation屬性指示驅(qū)逐是在方法執(zhí)行之后(默認(rèn))還是在方法執(zhí)行之前進(jìn)行的,前者提供與其他注解相同的語義:方法成功完成后,將執(zhí)行緩存上的操作(在本例中為驅(qū)逐),如果方法未執(zhí)行(因?yàn)樗赡鼙痪彺妫┗驋伋霎惓?,則不會發(fā)生驅(qū)逐。后者(beforeInvocation=true)導(dǎo)致驅(qū)逐始終在調(diào)用方法之前發(fā)生,這在驅(qū)逐不需要與方法結(jié)果相關(guān)聯(lián)的情況下非常有用。

請注意,void方法可以與@CacheEvict一起使用 — 因?yàn)榉椒ǔ洚?dāng)觸發(fā)器,返回值將被忽略(因?yàn)樗鼈儾慌c緩存交互),這不是@Cacheable的情況,它將數(shù)據(jù)添加或更新到緩存中,因此需要結(jié)果。

@Caching注解

有時(shí),需要指定相同類型的多個(gè)注解(例如@CacheEvict@CachePut),例如,因?yàn)闂l件或鍵表達(dá)式在不同的緩存之間是不同的,@Caching允許在同一方法上使用多個(gè)嵌套的@Cacheable 、@CachePut@CacheEvict注解,以下示例使用兩個(gè)@CacheEvict注解:

@Caching(evict = { @CacheEvict("primary"), @CacheEvict(cacheNames="secondary", key="#p0") })
public Book importBooks(String deposit, Date date)
@CacheConfig注解

到目前為止,我們已經(jīng)看到緩存操作提供了許多自定義選項(xiàng),你可以為每個(gè)操作設(shè)置這些選項(xiàng),但是,如果某些自定義選項(xiàng)適用于該類的所有操作,那么配置它們可能會很麻煩。例如,可以用一個(gè)類級別的定義替換指定類的每個(gè)緩存操作使用的緩存名稱,這就是@CacheConfig發(fā)揮作用的地方,以下示例使用@CacheConfig設(shè)置緩存的名稱:

@CacheConfig("books") 
public class BookRepositoryImpl implements BookRepository {

    @Cacheable
    public Book findBook(ISBN isbn) {...}
}

@CacheConfig是一個(gè)類級注解,允許共享緩存名稱、自定義KeyGenerator、自定義CacheManager和自定義CacheResolver,將此注解放在類上不會打開任何緩存操作。

操作級別自定義始終覆蓋@CacheConfig上的自定義集,因此,這為每個(gè)緩存操作提供了三個(gè)級別的自定義:

全局配置,可用于CacheManagerKeyGenerator。

在類級別,使用@CacheConfig。

在操作級別。

啟用緩存注解

請務(wù)必注意,即使聲明緩存注解也不會自動觸發(fā)其操作 — 與Spring中的許多功能一樣,該特性必須以聲明方式啟用(這意味著如果你懷疑緩存是罪魁禍?zhǔn)?,你可以通過僅刪除一個(gè)配置行而不是代碼中的所有注解來禁用它)。

要啟用緩存注解,請將注解@EnableCaching添加到@Configuration類之一:

@Configuration
@EnableCaching
public class AppConfig {
}

或者,對于XML配置,你可以使用cache:annotation-driven元素:



        

cache:annotation-driven元素和@EnableCaching注解都允許你指定各種選項(xiàng),這些選項(xiàng)影響方式通過AOP將緩存行為添加到應(yīng)用程序,該配置與@Transactional的配置有意類似。

處理緩存注解的默認(rèn)建議模式是proxy,它允許僅通過代理攔截調(diào)用,同一類中的本地調(diào)用不能以這種方式截獲,對于更高級的攔截模式,請考慮結(jié)合編譯時(shí)或加載時(shí)編織切換到aspectj模式。
有關(guān)實(shí)現(xiàn)CachingConfigurer所需的高級自定義(使用Java配置)的更多詳細(xì)信息,請參閱javadoc。
緩存注解設(shè)置
XML屬性 注解屬性 默認(rèn) 描述
cache-manager N/A(參見CachingConfigurer javadoc cacheManager 要使用的緩存管理器的名稱;
使用此緩存管理器(如果未設(shè)置則為cacheManager)在后臺初始化默認(rèn)的CacheResolver
要獲得更精細(xì)的緩存解析管理,請考慮設(shè)置“cache-resolver”屬性。
cache-resolver N/A(參見CachingConfigurer javadoc 使用配置的cacheManagerSimpleCacheResolver 用于解析后備緩存的CacheResolver的bean名稱;
此屬性不是必需的,只需要指定為“cache-manager”屬性的替代。
key-generator N/A(參見CachingConfigurer javadoc SimpleKeyGenerator 要使用的自定義鍵生成器的名稱。
error-handler N/A(參見CachingConfigurer javadoc SimpleCacheErrorHandler 要使用的自定義緩存錯誤處理程序的名稱;
默認(rèn)情況下,在緩存相關(guān)操作期間拋出的任何異常都會在客戶端返回。
mode mode proxy 默認(rèn)模式(proxy)處理要使用Spring的AOP框架代理的帶注解bean(遵循代理語義,如前所述,僅適用于通過代理進(jìn)入的方法調(diào)用);
替代模式(aspectj)用Spring的AspectJ緩存切面編織受影響的類,修改目標(biāo)類字節(jié)碼以應(yīng)用于任何類型的方法調(diào)用;
AspectJ編織需要在類路徑中使用spring-aspects.jar以及啟用加載時(shí)編織(或編譯時(shí)編織);
(有關(guān)如何設(shè)置加載時(shí)編織的詳細(xì)信息,請參閱Spring配置)。
proxy-target-class proxyTargetClass false 僅適用于代理模式;
控制為使用@Cacheable@CacheEvict注解注解的類創(chuàng)建哪種類型的緩存代理;
如果proxy-target-class屬性設(shè)置為true,則創(chuàng)建基于類的代理;
如果proxy-target-classfalse或者省略了該屬性,則會創(chuàng)建基于標(biāo)準(zhǔn)JDK接口的代理;
(有關(guān)不同代理類型的詳細(xì)解釋,請參閱代理機(jī)制)。
order order Ordered.LOWEST_PRECEDENCE 定義應(yīng)用于使用@Cacheable@CacheEvict注解的bean的緩存建議的順序;
(有關(guān)排序AOP建議相關(guān)規(guī)則的更多信息,請參閱建議排序);
沒有指定的排序意味著AOP子系統(tǒng)確定建議的順序。
查找@Cacheable/@CachePut/@CacheEvict/@Caching僅在定義它的同一應(yīng)用程序上下文中的bean上進(jìn)行緩存,這意味著,如果你在WebApplicationContext中為DispatcherServlet放置,它只會在你的控制器中檢查bean,而不是你的服務(wù),有關(guān)更多信息,請參閱MVC部分。
方法可見性和緩存注解

使用代理時(shí),應(yīng)僅將緩存注解應(yīng)用于具有公共可見性的方法,如果使用這些注解來注解protected、private或包可見方法,不會引發(fā)錯誤,但帶注解的方法不會顯示已配置的緩存設(shè)置。如果需要注解非公共方法,請考慮使用AspectJ(請參閱本節(jié)的其余部分),因?yàn)樗鼤淖止?jié)碼本身。

Spring建議只使用@Cache*注解來注解具體類(以及具體類的方法),而不是注解接口,你當(dāng)然可以將@Cache*注解放在接口(或接口方法)上,但這只能在你使用基于接口的代理時(shí)按預(yù)期工作。Java注解不是從接口繼承的事實(shí)意味著,如果你使用基于類的代理(proxy-target-class="true")或基于編織的切面(mode="aspectj"),代理和編織基礎(chǔ)設(shè)施無法識別緩存設(shè)置,并且該對象未包裝在緩存代理中。
在代理模式(默認(rèn))下,只攔截通過代理進(jìn)入的外部方法調(diào)用,這意味著自調(diào)用(實(shí)際上是目標(biāo)對象中調(diào)用目標(biāo)對象的另一個(gè)方法的方法)在運(yùn)行時(shí)不會導(dǎo)致實(shí)際的緩存,即使調(diào)用的方法用@Cacheable標(biāo)記,在這種情況下,請考慮使用aspectj模式。此外,必須完全初始化代理以提供預(yù)期的行為,因此你不應(yīng)該在初始化代碼(即@PostConstruct)中依賴此功能。
使用自定義注解
自定義注解和AspectJ

此特性僅適用于基于代理的方法,但可以通過使用AspectJ進(jìn)行一些額外的工作。
spring-aspects模塊僅定義標(biāo)準(zhǔn)注解的切面,如果你已定義自己的注解,則還需要為這些注解定義切面。

緩存抽象允許你使用自己的注解來標(biāo)識觸發(fā)緩存填充或驅(qū)逐的方法,這作為模板機(jī)制非常方便,因?yàn)樗酥貜?fù)緩存注解聲明的需要,這在指定了鍵或條件或者代碼庫中不允許外部導(dǎo)入(org.springframework)時(shí)特別有用。與其他原型注解類似,你可以使用@Cacheable@CachePut、@CacheEvict@CacheConfig作為元注解(即可以注解其他注解的注解),在下面的示例中,使用自己的自定義注解替換常見的@Cacheable聲明:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Cacheable(cacheNames="books", key="#isbn")
public @interface SlowService {
}

在前面的示例中,定義了自己的SlowService注解,該注解本身使用@Cacheable進(jìn)行注解,現(xiàn)在我們可以替換以下代碼:

@Cacheable(cacheNames="books", key="#isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

以下示例顯示了自定義注解,我們可以使用它來替換前面的代碼:

@SlowService
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

盡管@SlowService不是Spring注解,但容器會在運(yùn)行時(shí)自動獲取其聲明并理解其含義,請注意,如前所述,需要啟用annotation-driven的行為。

上一篇:理解緩存抽象

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76135.html

相關(guān)文章

  • Spring Framework 參考文檔(JCache(JSR-107)注解

    摘要:注解從版開始,的緩存抽象完全支持標(biāo)準(zhǔn)注解和以及和。使用方法調(diào)用的結(jié)果更新緩存,要求將其作為使用注解的參數(shù)傳遞給它由于這種差異,允許在實(shí)際方法調(diào)用之前或之后更新緩存。非常相似,當(dāng)方法調(diào)用導(dǎo)致異常時(shí),支持條件驅(qū)逐。 JCache(JSR-107)注解 從4.1版開始,Spring的緩存抽象完全支持JCache標(biāo)準(zhǔn)注解:@CacheResult、@CachePut、@CacheRemove和...

    fengxiuping 評論0 收藏0
  • Spring之旅第二站:bean、新特性。。。

    摘要:除了,還簡單介紹了對的支持,可以幫助應(yīng)用將散落在各處的邏輯匯集于一處切面。當(dāng)裝配的時(shí)候,這些切面能夠運(yùn)行期編織起來,這樣就能呢個(gè)非常有效的賦予新功能。 第1章 Spring之旅 說明 1、本文參考了《Spring 實(shí)戰(zhàn)》重點(diǎn)內(nèi)容,參考了GitHub上的代碼 2、每個(gè)人的學(xué)習(xí)方式不一樣,但目的是一樣的,活學(xué)活用。最近一直在聽《我們不一樣》 3、本文只為記錄作為以后參考,要想真正領(lǐng)悟Sp...

    luodongseu 評論0 收藏0
  • 《 Kotlin + Spring Boot : 下一代 Java 服務(wù)端開發(fā) 》

    摘要:下一代服務(wù)端開發(fā)下一代服務(wù)端開發(fā)第部門快速開始第章快速開始環(huán)境準(zhǔn)備,,快速上手實(shí)現(xiàn)一個(gè)第章企業(yè)級服務(wù)開發(fā)從到語言的缺點(diǎn)發(fā)展歷程的缺點(diǎn)為什么是產(chǎn)生的背景解決了哪些問題為什么是的發(fā)展歷程容器的配置地獄是什么從到下一代企業(yè)級服務(wù)開發(fā)在移動開發(fā)領(lǐng)域 《 Kotlin + Spring Boot : 下一代 Java 服務(wù)端開發(fā) 》 Kotlin + Spring Boot : 下一代 Java...

    springDevBird 評論0 收藏0
  • Spring Framework 參考文檔(容器概述)

    摘要:容器概述接口表示容器,負(fù)責(zé)實(shí)例化配置和組裝?;诘脑獢?shù)據(jù)不是惟一允許的配置元數(shù)據(jù)形式,容器本身與實(shí)際編寫配置元數(shù)據(jù)的格式完全解耦,現(xiàn)在,許多開發(fā)人員為他們的應(yīng)用程序選擇基于的配置。 容器概述 org.springframework.context.ApplicationContext接口表示Spring IoC容器,負(fù)責(zé)實(shí)例化、配置和組裝bean。容器通過讀取配置元數(shù)據(jù)獲取關(guān)于要實(shí)例化...

    huashiou 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<