cdi 2.7.5_看一下CDI 2.0 EDR1
cdi 2.7.5
CDI是最近對Java EE最好的補充之一。 該觀點在用戶和集成商之間廣泛共享。 當前版本的CDI 1.2于2014年4月發布。現在,在2015年中期,我們將面對CDI 2.0規范的早期草案。 CDI 2.0將在Java 8和更高版本上運行。
最終版本計劃于2016年發布,該路線圖包含幾個有趣的項目:
- 將API分為Java SE和Java SE兩部分:拆分API是支持微服務移動的重要步驟。 從幾行中的每個main()引導CDI。
- 異步事件和優先事件允許控制事件觀察者的排序和異步事件傳遞
- JDK 8:CDI 1.x針對Java 1.6及更高版本。 Java 8進行了大量改進,并有助于簡化CDI的API。
- CDI允許從起源開始擴展。 SPI非常適合使用DeltaSpike,Spring Data,Camel,CDI度量標準等框架來增強CDI。 CDI 2.0旨在改善對擴展的支持
- 你知道嗎? CDI大量使用AOP來實現非常舒適的使用。 所有常規范圍(例如RequestScoped,ConversationScoped,SessionScoped和ApplicationScoped)都使用代理來查找上下文實例。 但是一個極限規格是,CDI不允許在本地方法調用上進行自我注入或攔截。 AOP軟件包將解決這些問題并改進規范的某些部分。
但是,讓我們來看看CDI 2.0 EDR的API(早期草案審查),它是新的且值得注意的 。
異步事件
異步事件是CDI用戶希望列表上的第一項。 該問題在2011年初提出,是CDI 2.0的重點之一。 為了啟用異步處理的事件并通過引入異步性不破壞現有代碼,必須進行大量熱烈討論。 當前草案需要雙端激活
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 {} }可以通過對啟用了異步功能的觀察者的異步處理來觸發事件。 使用@Observes觀察者也會在調用線程中得到通知。 可以使用調用fireAsync時返回的CompletionStage跟蹤異步事件觀察器的CompletionStage fireAsync 。
當事件處理處于活動狀態時,異步事件觀察器可以在上下文Bean實例上進行操作。 默認情況下,啟用的范圍是@RequestScoped和@ApplicationScoped 。 該@SessionScoped被排除variuous原因。 只要考慮一下會話在事件處理過程中結束時的行為方式即可。 在上下文實例中修改事件有效負載或數據時,用戶應注意效果。 CDI不會強制事件有效負載保持不變,但強烈建議您避免由于并發而導致競爭情況。
CDI容器負責提供多線程基礎結構。 有時,您想提供一個自己的執行程序來控制并發級別或包裝異步調用。 fireAsync方法允許為每個調用指定單獨的執行程序。
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);}上面的示例創建/銷毀執行器。 您可以將CDI管理的執行器與生產者方法( @Produces )結合使用,并在需要的地方@Inject 。 CDI很酷,是嗎?
異步事件將仍然是一個熱門話題,這肯定不是其最終形式。
有序事件觀察者
在CDI 1.2中,使用事件觀察器時的通知順序是不可預測的。 在2.0中,這將發生變化。
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 {} }事件觀察者的順序可以通過應用@Priority注釋來影響。 為什么受到影響卻不受控制?
這個問題的答案更長一些,您需要了解CDI的類型安全解析部分。 事件觀察者是根據其事件有效負載類型選擇的。 事件觀察者可以觀察不同的類型,接口,類,子類型,合格和不合格類型。 通過使用Event或BeanManager API,將在Event觸發時選擇事件觀察器。 您可以通過使用類型或其子類型來通知另一組事件觀察者。 因此,沒有可用的全局事件觀察者順序,這導致我們使用@Priority批注。
通過應用@Priority可以提前通知某些事件觀察者,并在以后通知某些事件觀察者。 默認值為Interceptor.Priority.APPLICATION + 500 ,結果為2500 。 這是所有不帶有@Priority批注的事件觀察器的默認設置。
仔細觀察@Priority發現,它僅適用于當前類型。 這將一直更改到CDI 2.0最終版本為止。
Java SE的CDI
JavaSE的CDI從一開始就可用,或者我這樣說:您可以在JavaSE中啟動Weld和OpenWebBeans,而無需JavaEE容器。 CDI 2.0僅指定了以標準方式引導CDI容器的標準方法。 這是我個人的最愛。
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容器并調用一種方法來運行您的應用程序。 應用程序完成后,將使用try-with-resources模式關閉容器。 用來啟動一個獨立的,可能是微服務式應用程序的代碼比Spring Boot長兩行。 與Spring或Dropwizard的主要區別在于生態系統,我找不到現成的嵌入式Tomcat的集成。 我猜想,要成為JavaSE的CDI成為真正的微服務框架之類的替代品,需要花費一些時間。
結論
CDI 2.0 EDR只是正在進行的JSR365努力的一小部分。 有很多問題需要討論和說明。 JBoss的Weld團隊會為規范的發展而努力,并會在將來的某個地方提出RI。 對于Java EE和SE,CDI是一個熱門話題,并且仍然非常有吸引力。 請繼續關注并遵循CDI 2.0
聯系CDI規范:
- Spec網站: 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
cdi 2.7.5
總結
以上是生活随笔為你收集整理的cdi 2.7.5_看一下CDI 2.0 EDR1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么更改电脑flashair(怎么更改电
- 下一篇: 台湾拼音电脑键盘对照图(台湾键盘图片)