看一下CDI 2.0 EDR1
CDI是最近對Java EE最好的補(bǔ)充之一。 該觀點在用戶和集成商之間廣泛共享。 當(dāng)前版本的CDI 1.2于2014年4月發(fā)布。現(xiàn)在,在2015年中期,我們將面對CDI 2.0規(guī)范的早期草案。 CDI 2.0將在Java 8和更高版本上運(yùn)行。
最終版本計劃于2016年發(fā)布,該路線圖包含幾個有趣的項目:
- 將API分為Java SE和Java SE兩部分:拆分API是支持微服務(wù)移動的重要步驟。 從幾行中的每個main()引導(dǎo)CDI。
- 異步事件和優(yōu)先事件允許控制事件觀察者的排序和異步傳遞事件
- JDK 8:CDI 1.x針對Java 1.6及更高版本。 Java 8進(jìn)行了許多改進(jìn),并有助于簡化CDI的API。
- CDI允許從起源開始擴(kuò)展。 SPI非常適合使用DeltaSpike,Spring Data,Camel,CDI度量標(biāo)準(zhǔn)等框架來增強(qiáng)CDI。 CDI 2.0旨在改善對擴(kuò)展的支持
- 你知道嗎? CDI大量使用AOP來實現(xiàn)非常舒適的使用。 所有常規(guī)范圍(例如RequestScoped,ConversationScoped,SessionScoped和ApplicationScoped)都使用代理來查找上下文實例。 但是一個極限規(guī)范是,CDI不允許在本地方法調(diào)用上進(jìn)行自我注入或攔截。 AOP軟件包將解決這些問題并改進(jìn)規(guī)范的某些部分。
但是,讓我們看一下CDI 2.0 EDR的API(早期草案審查),它是新的且值得注意的 。
異步事件
異步事件是CDI用戶希望列表上的第一項。 該問題在2011年初提出,是CDI 2.0的重點之一。 為了啟用異步處理的事件并且不通過引入異步性破壞現(xiàn)有代碼,需要進(jìn)行大量熱烈討論。 當(dāng)前草案需要雙端激活
public class AsyncEvents {@Injectprivate Event<MyEventPayload> event;public void triggerEvent() {event.fireAsync(new MyEventPayload());}public void asyncEventObserver(@ObservesAsync MyEventPayload payload) {System.out.println("Yay, I'm called async!");}public void eventObserver(@Observes MyEventPayload payload) {System.out.println("Yay, I'm called too. " + "Other @Observes are notified in order.");}public static class MyEventPayload {} }可以通過對啟用了異步功能的觀察者的異步處理來觸發(fā)事件。 使用@Observes觀察者也會在調(diào)用線程中得到通知。 可以使用調(diào)用fireAsync時返回的CompletionStage跟蹤異步事件觀察器的CompletionStage fireAsync 。
當(dāng)事件處理處于活動狀態(tài)時,異步事件觀察器可以在上下文Bean實例上進(jìn)行操作。 默認(rèn)情況下,啟用的范圍是@RequestScoped和@ApplicationScoped 。 該@SessionScoped被排除variuous原因。 只要考慮一下會話在事件處理過程中結(jié)束時的行為方式即可。 在上下文實例中修改事件有效負(fù)載或數(shù)據(jù)時,用戶應(yīng)注意效果。 CDI不會強(qiáng)制事件有效負(fù)載保持不變,但強(qiáng)烈建議您避免由于并發(fā)而導(dǎo)致競爭情況。
CDI容器負(fù)責(zé)提供多線程基礎(chǔ)結(jié)構(gòu)。 有時,您想提供一個自己的執(zhí)行程序來控制并發(fā)級別或包裝異步調(diào)用。 fireAsync方法允許為每個調(diào)用指定單獨(dú)的執(zhí)行程序。
private ExecutorService executor;@Injectprivate Event<MyEventPayload> event;@PostConstructpublic void postConstruct() {int threads = Runtime.getRuntime().availableProcessors();executor = new ThreadPoolExecutor(threads, threads, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>());}@PreDestroypublic void preDestroy() {executor.shutdown();}public void triggerEventWithExecutor() {event.fireAsync(new MyEventPayload(), executor);}上面的示例創(chuàng)建/銷毀執(zhí)行器。 您可以將CDI管理的執(zhí)行器與生產(chǎn)者方法( @Produces )結(jié)合使用,并在需要的地方@Inject 。 CDI很酷,是嗎?
異步事件將仍然是一個熱門話題,這肯定不是其最終形式。
有序事件觀察者
在CDI 1.2中,使用事件觀察器時的通知順序是不可預(yù)測的。 在2.0中,這將發(fā)生變化。
public class PrioritizedEvents {@Injectprivate Event<MyEventPayload> event;public void trigger() {event.fire(new MyEventPayload());}public void observeBeforeOtherObservers(@Observes @Priority(Interceptor.Priority.APPLICATION + 499) MyEventPayload payload) {System.out.println("Notified before all other observers");}public void observeAfterOtherObservers(@Observes @Priority(Interceptor.Priority.APPLICATION + 501) MyEventPayload payload) {System.out.println("Notified after all other observers");}public static class MyEventPayload {} }事件觀察者的順序可以通過應(yīng)用@Priority注釋來影響。 為什么受到影響卻不受控制?
這個問題的答案更長一些,您需要了解CDI的類型安全解析部分。 事件觀察者是根據(jù)其事件有效負(fù)載類型選擇的。 事件觀察者可以觀察不同的類型,接口,類,子類型,合格和不合格類型。 通過使用Event或BeanManager API,可以在觸發(fā)事件時選擇事件觀察器。 您可以通過使用類型或其子類型來通知另一組事件觀察者。 因此,沒有可用的全局事件觀察者順序,這導(dǎo)致我們使用@Priority批注。
通過應(yīng)用@Priority可以提前通知某些事件觀察者,并在以后通知它們。 默認(rèn)值為Interceptor.Priority.APPLICATION + 500 ,結(jié)果為2500 。 這是所有不帶有@Priority批注的事件觀察器的默認(rèn)值。
仔細(xì)觀察@Priority發(fā)現(xiàn),它僅適用于當(dāng)前類型。 這將更改,直到CDI 2.0最終確定。
Java SE的CDI
JavaSE的CDI從一開始就可用,或者我這樣說:您可以在JavaSE中啟動Weld和OpenWebBeans,而無需JavaEE容器。 CDI 2.0僅指定了以標(biāo)準(zhǔn)方式引導(dǎo)CDI容器的標(biāo)準(zhǔn)方法。 這是我個人的最愛。
public class CDIJumpStart {public static void main(String[] args) {try(CDI<Object> cdi = CDI.getCDIProvider().initialize()) {cdi.select(MyApp.class).get().runMyApplication();}}private static class MyApp{public void runMyApplication(){// ...}} }該代碼將啟動CDI容器并調(diào)用一種方法來運(yùn)行您的應(yīng)用程序。 應(yīng)用程序完成后,將使用try-with-resources模式關(guān)閉容器。 用來啟動一個獨(dú)立的,可能是微服務(wù)式應(yīng)用程序的代碼比Spring Boot長兩行。 與Spring或Dropwizard的主要區(qū)別在于生態(tài)系統(tǒng),我找不到現(xiàn)成的嵌入式Tomcat的集成。 我猜想,JavaSE的CDI成為真正的微服務(wù)框架之類的替代品要花費(fèi)一些時間。
結(jié)論
CDI 2.0 EDR只是正在進(jìn)行的JSR365工作的很小的成果。 有很多問題需要討論和說明。 JBoss的Weld團(tuán)隊會為規(guī)范的發(fā)展而努力,并會在將來的某個地方提出RI。 CDI是一個熱門話題,并且對于Java EE和SE仍然非常有吸引力。 請繼續(xù)關(guān)注并遵循CDI 2.0
與CDI規(guī)范聯(lián)系:
- Spec網(wǎng)站: http : //www.cdi-spec.org/
- GitHub: https : //github.com/cdi-spec/cdi
- 主要郵件列表: https : //lists.jboss.org/mailman/listinfo/cdi-dev
- CDI 2.0 JCP頁面: http : //jcp.org/en/jsr/summary? id = 365
- IRC:irc://freenode.net/#cdi-dev
- 推特:@cdispec
- Google+: https : //plus.google.com/+CdiSpecOrgPage/posts
翻譯自: https://www.javacodegeeks.com/2015/09/a-look-on-cdi-2-0-edr1.html
總結(jié)
以上是生活随笔為你收集整理的看一下CDI 2.0 EDR1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2015阿里巴巴(2015阿里ddos)
- 下一篇: 汽车抵押车管所备案流程(汽车抵押车管所备