日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用CDI简化JAX-RS缓存

發(fā)布時(shí)間:2023/12/3 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用CDI简化JAX-RS缓存 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇文章(通過(guò)一個(gè)簡(jiǎn)單的示例)說(shuō)明了如何使用CDI Producers使其在RESTful服務(wù)中利用緩存控制語(yǔ)義更加容易

與HTTP 1.0中可用的Expires標(biāo)頭相比, HTTP 1.1中添加了Cache-Control標(biāo)頭,這是急需的改進(jìn)。 RESTful Web服務(wù)可以利用此標(biāo)頭來(lái)擴(kuò)展其應(yīng)用程序并使它們更有效,例如,如果您可以緩存先前請(qǐng)求的響應(yīng),那么顯然,如果您確定對(duì)以下內(nèi)容,則無(wú)需再次向服務(wù)器發(fā)出相同的請(qǐng)求您緩存的數(shù)據(jù)不是陳舊的事實(shí)!

JAX-RS有何幫助?

自其初始(1.0)版本以來(lái), JAX-RS就已經(jīng)支持Cache-Control標(biāo)頭。 CacheControl類表示現(xiàn)實(shí)世界中的Cache-Control HTTP標(biāo)頭,并提供了通過(guò)簡(jiǎn)單的setter方法配置標(biāo)頭的功能。 JAX-RS 2.0 javadocs中有關(guān)CacheControl類的更多信息

那么我該如何使用

只需返回一個(gè)Response對(duì)象,即可圍繞它包裝 CacheControl類的實(shí)例。

@Path("/testcache") public class RESTfulResource {@GET@Produces("text/plain")public Response find(){CacheControl cc = new CacheControl();cc.setMaxAge(20);return Response.ok(UUID.randomUUID().toString()).cacheControl(cc).build();} }

盡管這對(duì)于單個(gè)方法來(lái)說(shuō)相對(duì)方便,但是重復(fù)創(chuàng)建和返回CacheControl對(duì)象可能會(huì)激怒多個(gè)方法

CDI生產(chǎn)者來(lái)?yè)尵?#xff01;

CDI生產(chǎn)者可以幫助注入類的實(shí)例,這些類在技術(shù)上不是Bean (按照嚴(yán)格的定義),或者對(duì)于您無(wú)法控制的類,要使用范圍和限定符進(jìn)行修飾。

這個(gè)想法是為了

  • 有一個(gè)自定義注釋( @CacheControlConfig )來(lái)定義Cache-Control標(biāo)頭的默認(rèn)值,并在您要覆蓋它時(shí)提供靈活性 @Retention(RUNTIME) @Target({FIELD, PARAMETER}) public @interface CachControlConfig {public boolean isPrivate() default true;public boolean noCache() default false;public boolean noStore() default false;public boolean noTransform() default true;public boolean mustRevalidate() default true;public boolean proxyRevalidate() default false;public int maxAge() default 0;public int sMaxAge() default 0;}
  • 只需使用CDI Producer通過(guò)使用InjectionPoint對(duì)象(由CDI高興地注入!)來(lái)創(chuàng)建CacheControl類的實(shí)例,具體取決于注釋參數(shù) public class CacheControlFactory {@Producespublic CacheControl get(InjectionPoint ip) {CachControlConfig ccConfig = ip.getAnnotated().getAnnotation(CachControlConfig.class);CacheControl cc = null;if (ccConfig != null) {cc = new CacheControl();cc.setMaxAge(ccConfig.maxAge());cc.setMustRevalidate(ccConfig.mustRevalidate());cc.setNoCache(ccConfig.noCache());cc.setNoStore(ccConfig.noStore());cc.setNoTransform(ccConfig.noTransform());cc.setPrivate(ccConfig.isPrivate());cc.setProxyRevalidate(ccConfig.proxyRevalidate());cc.setSMaxAge(ccConfig.sMaxAge());}return cc;} }
  • 只需將 CacheControl實(shí)例注入您的REST資源類中,并在您的方法中使用它 @Path("/testcache") public class RESTfulResource {@Inject@CachControlConfig(maxAge = 20)CacheControl cc;@GET@Produces("text/plain")public Response find() {return Response.ok(UUID.randomUUID().toString()).cacheControl(cc).build();} }

其他想法

  • 在這種情況下,產(chǎn)生的CacheControl實(shí)例的作用域?yàn)?#64;Dependent,即它將與注入它的類一起生存和死亡。 在這種情況下,由于JAX-RS容器為每個(gè)客戶端請(qǐng)求創(chuàng)建了一個(gè)新實(shí)例,因此JAX-RS資源本身是RequestScoped (默認(rèn)),因此將與每個(gè)HTTP請(qǐng)求一起創(chuàng)建注入的CacheControl實(shí)例的新實(shí)例。
  • 您還可以引入CDI限定詞以進(jìn)一步縮小范圍并考慮極端情況
  • 您可能會(huì)認(rèn)為,使用JAX-RS過(guò)濾器可以實(shí)現(xiàn)相同的目的。 那是正確的。 但是您需要手動(dòng)設(shè)置Cache-Control標(biāo)頭(在可變的MultivaluedMap中),并且邏輯不夠靈活,無(wú)法解決不同情況下的不同Cache-Control配置

實(shí)驗(yàn)結(jié)果

使用NetBeans IDE播放此示例(推薦)

  • 部署WAR并瀏覽到http:// localhost:8080 / JAX-RS-Caching-CDI / testcache
  • 隨機(jī)字符串,將被緩存20秒 (根據(jù)@CacheControl注釋的配置)

  • 對(duì)相同URL的GET請(qǐng)求不會(huì)導(dǎo)致服務(wù)器端REST服務(wù)的調(diào)用。 瀏覽器將返回緩存的值。

盡管代碼很簡(jiǎn)單,但是如果您覺(jué)得很懶,可以從這里獲取(maven)項(xiàng)目并在其中玩轉(zhuǎn)

玩得開(kāi)心!

翻譯自: https://www.javacodegeeks.com/2015/02/simplifying-jax-rs-caching-with-cdi.html

總結(jié)

以上是生活随笔為你收集整理的使用CDI简化JAX-RS缓存的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。