在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.mzph.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…