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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

j2ee 和 j2se_在J2SE应用中模拟CDI的会话和请求范围

發(fā)布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 j2ee 和 j2se_在J2SE应用中模拟CDI的会话和请求范围 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

j2ee 和 j2se

我們目前正在考慮重構(gòu)Naked Objects框架,以使用JSR-330(依賴注入)和面向EE的老大哥JSR-299(CDI)。 使用香草JSR-330是不費(fèi)吹灰之力的,但是我們想利用JSR-299中的一些不錯的功能(例如事件和裝飾器)。 障礙? 裸對象還必須在J2SE環(huán)境中透明運(yùn)行。

現(xiàn)在,JSR-299(至少是Weld參考實現(xiàn))可以在J2SE上運(yùn)行,但是無法使用標(biāo)注為@SessionScoped或@RequestScoped的bean…確實不足為奇,因為沒有HttpSession或HttpServletRequest鉤入。 另一方面,至少在J2SE上下文中的Naked Objects框架中,我們確實能夠?qū)⑦@些概念映射到其自身的內(nèi)部生命周期中……例如,對于客戶端應(yīng)用程序,用戶總是被認(rèn)為正在運(yùn)行在一個長時間的會議上。

那么,如何為這些作用域設(shè)置上下文,并使其在J2SE中運(yùn)行時自動激活呢?

首先,讓我們看一下我們要運(yùn)行的代碼:

package org.nakedobjects.experiments.cdi;import java.util.List; import javax.enterprise.context.RequestScoped; import javax.enterprise.event.Observes; import org.jboss.weld.environment.se.bindings.Parameters; import org.jboss.weld.environment.se.events.ContainerInitialized;@RequestScoped public class HelloWorld {public static void main(String[] args) {// bootstraporg.jboss.weld.environment.se.StartMain.main(new String[]{"JSR","299"});}public void printHello(@Observes ContainerInitialized event, @Parameters List<String> args) {System.out.println("Hello " + args);System.out.flush();} }

因為這是一個CDI bean,所以我們需要一個空的META-INF / beans.xml。

如果將上述類注釋為@ApplicationScoped ,則將打印出“ Hello [JSR,299]”,但不會將其注釋為@RequestScoped 。 因此,我們需要做的是編寫擴(kuò)展。 這有點(diǎn)hacky,但是可以用:

package org.jboss.weld.manager; // required for visibility to BeanManagerImpl#getContexts()import java.lang.annotation.Annotation;import javax.enterprise.context.RequestScoped; import javax.enterprise.context.SessionScoped; import javax.enterprise.event.Observes; import javax.enterprise.inject.spi.AfterDeploymentValidation; import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.Extension;import org.jboss.weld.context.AbstractThreadLocalMapContext; import org.jboss.weld.context.beanstore.HashMapBeanStore;public class WeldServletScopesSupportForSe implements Extension {public void afterDeployment(@Observes AfterDeploymentValidation event,BeanManager beanManager) {setContextActive(beanManager, SessionScoped.class);setContextActive(beanManager, RequestScoped.class);}private void setContextActive(BeanManager beanManager,Class<? extends Annotation> cls) {BeanManagerImpl beanManagerImpl = (BeanManagerImpl) beanManager;AbstractThreadLocalMapContext context = (AbstractThreadLocalMapContext) beanManagerImpl.getContexts().get(cls).get(0);context.setBeanStore(new HashMapBeanStore());context.setActive(true);} }

像所有Weld擴(kuò)展一樣,它需要在META-INF / services中注冊,在這種情況下, 應(yīng)包含在包含完整類名的名為javax.enterprise.inject.spi.Extension的文件中。

現(xiàn)在,當(dāng)我們運(yùn)行應(yīng)用程序時,將同時設(shè)置會話和請求范圍,并且將觸發(fā)我們的HelloWorld bean。

對于在Naked Objects中編寫應(yīng)用程序的開發(fā)人員,如果在非Web后端(例如,具有套接字級遠(yuǎn)程處理的-t服務(wù)器)上部署客戶端( -t客戶端或服務(wù)器),則他們需要包括對其他模塊的依賴。在后者中,我們將需要一些技巧來確定我們是否在Web應(yīng)用程序中運(yùn)行,并且僅在我們確定自己不在上下文中時才設(shè)置Context(例如,在Web應(yīng)用程序中找不到javax.servlet類)。類路徑。

如果您想嘗試代碼,可以使用

svn co https://nakedobjects.svn.sourceforge.net/svnroot/nakedobjects/framework/trunk/experiments .

參考:我們的JCG合作伙伴 Dan Haywood在Dan Haywood博客上 通過J2SE應(yīng)用程序模擬了CDI的會話和請求范圍 。

相關(guān)文章 :

  • Spring Singleton,請求,會話Bean和線程安全
  • 什么是CDI,它與@EJB和Spring有什么關(guān)系?
  • Java EE6 CDI,命名組件和限定符
  • Java EE6裝飾器:在注入時裝飾類
  • Java EE6事件:JMS的輕量級替代品

翻譯自: https://www.javacodegeeks.com/2012/01/simulating-cdis-session-and-request.html

j2ee 和 j2se

總結(jié)

以上是生活随笔為你收集整理的j2ee 和 j2se_在J2SE应用中模拟CDI的会话和请求范围的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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