在J2SE應用程序中模擬CDI的會話和請求范圍

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

現在,JSR-299(至少是Weld參考實現)可以在J2SE上運行,但是不可能使用標注為@SessionScoped或@RequestScoped的bean…確實不足為奇,因為沒有HttpSession或HttpServletRequest鉤入。 另一方面,至少在J2SE上下文中的Naked Objects框架中,我們確實能夠將這些概念映射到其自身的內部生命周期中……例如,對于客戶端應用程序,用戶始終被視為正在運行在一個長時間的會議上。

那么,如何為這些作用域設置上下文,并使其在J2SE中運行時自動激活?

首先,讓我們看一下我們要運行的代碼:

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 。 因此,我們需要做的是編寫擴展。 這有點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擴展一樣,它需要在META-INF / services中注冊,在這種情況下, 包含在包含完整類名的名為javax.enterprise.inject.spi.Extension的文件中。

現在,當我們運行應用程序時,將同時設置會話和請求范圍,并且將觸發我們的HelloWorld bean。

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

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

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

參考: Dan Haywood博客上的JCG合作伙伴 Dan Haywood在J2SE應用程序中模擬了CDI的會話和請求范圍 。

相關文章 :

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374173.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374173.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374173.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VS2019 WPF制作OTA上位機(二)獲取bin文件路徑

OTA升級是通過無線通信遠程把bin文件內容傳輸到單片機&#xff0c;完成升級。 因此上位機需要獲取bin文件的路徑&#xff0c;讀取bin文件內容&#xff0c;將內容分割依次發送&#xff08;因為單片機的接收緩存不會開得和bin文件一樣大&#xff08;十幾K甚至幾十K&#xff09;&a…

java 線程“生產/消費”模型1

/*資源類*/ public class ShareValue {private int total;public ShareValue(int total){this.totaltotal;}//生產void putValue(int value){totalvalue;}//消費資源int getValue(int value){if(total-value>0){total-value;}else{valuetotal;total0;System.out.println(&qu…

PHP - 代碼分離

總代碼&#xff1a; <?php/** Version&#xff1a;1.0* CreateTime&#xff1a;2015年11月11日* Author&#xff1a;HF_Ultrastrong*///引入公共文件,在公共文件中創建&#xff0c;相對于項目的絕對路徑require dirname(__FILE__)./includes/common.inc.php; ?&…

原生js封裝table表格操作,獲取任意行列td,任意單行單列方法

V1.001更新增加findTable-min.js 本次更新&#xff0c;優化了代碼性能方面&#xff0c;增加了部分新功能&#xff0c;可以獲取多個table表格批量操作。 考慮到本人后面的項目中可能涉及到大量的表格操作&#xff0c;提前先封了 一個簡單的操作方法&#xff0c;日后再加完善&…

Spring陷阱:事務測試被認為是有害的

Spring殺手級功能之一是容器內集成測試 。 盡管EJB多年來一直缺乏此功能&#xff08;Java EE 6終于解決了這個問題&#xff0c;但是我還沒測試過&#xff09;&#xff0c;但是Spring從一開始就允許您從Web層開始&#xff0c;通過所有服務來測試整個堆棧。到數據庫的方式。 數據…

python xlwt寫入已有表_Python中,添加寫入數據到已經存在的Excel文件

1.安裝xlrd、xlwt、xlutilshttps://pypi.org/project/xlutils/pip安裝&#xff1a;cmd下輸入&#xff1a;pip install xlrd #讀取exclepip install xlwt #寫入exclepip install xlutils #操作 Excel 文件的實用工具&#xff0c;如復制、分割、篩選等2.代碼主要部分實現import x…

java線程“生產/消費”模型2

/* 資源類 */ class ShareValue {private int total;//判斷對象是否為空private boolean isEmptytrue;//判斷對象是否已滿private boolean isFulltrue;public ShareValue(int total) {this.total total;if(total>0) isEmptyfalse;if(total<1000) isFullfalse;}/** sync…

linux更改用戶名_破舊安卓手機第二春,在安卓手機上使用Linux_deploy運行Linux

由于服務器位于國外&#xff0c;害怕被墻掉導致數據丟失&#xff0c;所以在本地寫了腳本每小時從服務器上導出并下載到本地。但是電腦不可能二十四小時開機&#xff0c;所以很想買一個樹莓派4玩玩。但是太貴遼&#xff0c;還好搜索到了Android運行Linux的方法&#xff0c;下面記…

關于Cocos2d-x中init方法和onEnter方法的區別

init()和onEnter()這兩個方法都是寫實例化對象的類(比如繼承自Node的一些類等等)的時候用到的方法。 一般都是public類型下面的 bool init(); void onEnter(); 兩個方法在實現的時候都要先執行父類方法&#xff0c;比如 Node::init(); Node::onEnter(); 注意&#xff1a; 1.ini…

在5分鐘內在MacOSX Lion中設置JAVA_HOME,MAVEN_HOME,ANT_HOME

人們一直試圖通過Mac上的Java開發世界來解決這個問題&#xff0c;這一直是我一直遇到的問題。 他們必須解決的第一件事就是設置適當的工具和環境。 幸運的是&#xff0c;足夠多的MacOSX &#xff08;Lion或以前的版本&#xff09;仍然有許多重要的工具可用于Java開發&#xff0…

MCUXpress IDE常用設置

NXP的開發工具Xpress是基于eclipse制作的&#xff0c;我們如果需要設置一些東西可以直接搜索eclipse是怎么設置的。 1、字體大小 搜索eclipse字體大小&#xff0c;菜單Window > Preference 而Xpress是漢化了的&#xff0c;英語不好的同學可能懵逼&#xff0c;其實就是菜單欄…

C語言中空格符、空字符、字符數組結束符、換行、回車的區別

空格符和空字符是不一樣的,在ASCII里面,空格(space)符號的ASCII碼是32,而空字符是0, 2個是完全不一樣的2個字符 空字符 一般來描述一個字符串的結尾,其實是控制符的一種,但不能理解為沒有字符,應該理解為代表什么都沒有的字符.好比回車0x0A和換行0x0D雖然不顯示,但是也是控制字…

hdu5823 (附帶數的二進制子集)

二進制數子集的取法,結果不會輸出0&#xff0c;且從大到小 for(int i0 i;i0;i0(i0-1)&i)cout<<i0<<endl; 題意&#xff1a; 給定一個 N個點的圖&#xff0c; 求它的每一個子圖的最小染色數 染色方法是所有子圖中相連接兩點顏色不一致 其中 N≤18 題解&…

anaconda如何卸載庫_小白必看!Anaconda安裝全攻略

本文作者&#xff1a;戴 雯文字編輯&#xff1a;方 言技術總編&#xff1a;張馨月爬蟲俱樂部云端課程來襲&#xff01;爬蟲俱樂部將于2020年8月25日至28日在線上舉行Stata數據分析法律與制度專題訓練營&#xff0c;主要是為了讓學員掌握Stata軟件進階操作&#xff0c;涉及…

RESTful Web服務可發現性,第4部分

這是有關使用Spring 3.1和Spring Security 3.1和基于Java的配置來建立安全的RESTful Web Service的系列文章的第四篇 。 本文將重點介紹REST API&#xff0c;HATEOAS的可發現性以及由測試驅動的實際方案。 引入REST可發現性 API的可發現性是一個值得引起足夠關注的主題&#x…

10位IT領袖給應屆畢業生的10條忠告

10位IT領袖給應屆畢業生的10條忠告&#xff0c;在走向獨立和自主的偉大征程中&#xff0c;吸取他們的經驗。 在畢業生們邁出象牙塔之時&#xff0c;他們應該聽從哪些人的建議&#xff1f;在走向獨立和自主的偉大征程中&#xff0c;他們該吸取哪些教訓&#xff1f;聽一聽各領域…

ubuntu安裝好后常用軟件安裝和配置

1、安裝vim sudo apt install vim 安裝好后進入路徑打開vimrc文件&#xff0c;這里需要注意一定要用sudo不然編輯后無法保存&#xff01; cd /etc/vim sudo vim vimrc 在最下面加入 set nu set ts4 set softtabstop4 set shiftwidth4 set expandtab set autoindent 依次是…

Objective-c 數據類型

這里列出Objective-c中獨有數據類型&#xff1a; 一、字符串 在Objective-c中&#xff0c;字符串常量是由和一對從引號括起的字符串序列。比如&#xff1a;"China"、"objective-c"等都是合法的字符串常量。 二、id類型 id類型是Objective-c中一個比較獨…

JBoss AS 7 EJB3池配置

現在&#xff0c;AS 7.0.1已經發布&#xff0c;讓我們看一下可用的EJB3新功能。 就像我在上一篇文章中提到的那樣 &#xff0c;AS 7.0.1現在允許您為無狀態會話bean和MDB配置池。 當前&#xff0c;我們允許在子系統級別配置池&#xff0c;這意味著該池將適用于服務器上部署的所…

iOS開發網絡篇—文件的上傳

說明&#xff1a;文件上傳使用的時POST請求&#xff0c;通常把要上傳的數據保存在請求體中。本文介紹如何不借助第三方框架實現iOS開發中得文件上傳。 由于過程較為復雜&#xff0c;因此本文只貼出部分關鍵代碼。 主控制器的關鍵代碼&#xff1a; YYViewController.m 1 #import…