在J2SE应用程序中模拟CDI的会话和请求范围
现在,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
在J2SE应用程序中模拟CDI的会话和请求范围相关推荐
- j2ee 和 j2se_在J2SE应用中模拟CDI的会话和请求范围
j2ee 和 j2se 我们目前正在考虑重构Naked Objects框架,以使用JSR-330(依赖注入)和面向EE的老大哥JSR-299(CDI). 使用香草JSR-330是不费吹灰之力的,但是我 ...
- 发送linux键盘消息,在C#程序中模拟发送键盘按键消息
using System.Runtime.InteropServices; 引入键盘事件函数 [DllImport("user32.dll")] public static ext ...
- php cdi_Swing应用程序中的CDI事件将UI和事件处理分离
php cdi 在愉快地围绕CDI构建我的代码几年之后,使用它根据众所周知的模式来构造我的代码非常自然. CDI是一种旨在在Java EE应用程序服务器中使用的依赖项注入机制,这可能被视为不利. 但是 ...
- Swing应用程序中的CDI事件可将UI与事件处理分离
在享受了几年围绕CDI构建我的代码的乐趣之后,使用它根据众所周知的模式来构造我的代码非常自然. CDI是一种旨在在Java EE应用程序服务器中使用的依赖项注入机制,这可能被视为不利. 但是,我想证明 ...
- python在程序中模拟键盘鼠标操作
Python中模拟键盘和鼠标最著名的模块是:pymouse 和 pykeyboard.一次安装两个模块比较麻烦,而有一个库整合了这两个模块,而且能支持跨平台操作,这个库叫 PyUserInput,通过 ...
- 微信小程序中开发环境下的POST请求
写在前面 不得不说,开发环境下,微信小程序要是在发起网络请求的话,遇到的坑也是有的.尽管,微信提供了十分便捷的API 供开发者调用.今天在小程序中写了一个表单,需要提交到服务器上,于是发起了一个 PO ...
- 在Python中模拟do-while循环?
我需要在Python程序中模拟do-while循环. 不幸的是,以下简单的代码不起作用: list_of_ints = [ 1, 2, 3 ] iterator = list_of_ints.__it ...
- 使用.NET Core MVC Web应用程序中的ResponseCache属性处理缓存
HTTP响应的缓存意味着当发出HTTP请求时,服务器生成的响应由浏览器或服务器存储在某个地方,以便在对同一资源的连续HTTP请求中重复使用.实质上,我们正在存储生成的响应,并将该响应重用于后续请求一段 ...
- 小程序中使用web-view链接H5网页
##加粗样式小程序中使用web-view链接H5网页 1.小程序中,封装统一的接口请求方法(以便在每个接口中都携带 cookie,放在 header 中):const request = parame ...
最新文章
- 转载~vim配置文件
- 2.7 迁移学习-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
- 1、CSS 定位 (Positioning)
- Codeforces 1093D Beautiful Graph
- 地牢房间迷宫走廊生成(二),Python实现洪水法、完美迷宫
- 【Java】获取Java代码段运行毫秒数的策略
- 小程序读取几种不同格式json数据(小程序json解析)
- 《构建之法》第4章读后感
- 天刀服务器未响应,天涯明月刀卡顿怎么办 教你如何优化游戏不在卡顿
- 华为手机如何安装Goole play教程及安装包
- 数据库编程(常量与变量+常用系统函数)
- 刘德华--10有一种精神叫刘德华
- Just For Fun
- 技术面试(一)认识技术面试
- python面试题(面试重点)
- Android产品研发(十一)--应用内跳转Scheme协议
- linux内核网络收包过程—硬中断与软中断
- 天才小毒妃 第912章 坑了一大笔
- 蓝桥杯:互质数及其定义
- 职业学校计算机教学创新论文题目,信息技术论文题目大全
热门文章
- SonarQube 8.3.x中的Maven项目的测试覆盖率报告
- java xmpp_Java XMPP负载测试工具
- java 函数式编程 示例_功能Java示例 第8部分–更多纯函数
- apache.camel_Apache Camel 3.1 –更多骆驼核心优化(第2部分)
- spring缓存_有关Spring缓存性能的更多信息
- spring序列化_使用@JsonIdentityInfo的Spring自定义序列化器
- aws jenkins_Jenkins在AWS上(第1部分)
- 参数化测试 junit_使用JUnit 5进行更清洁的参数化测试
- 动态代码生成 静态代码生成_将速度提升到自己的个人代码生成器中
- java 登陆验证失败_使用Java 8流进行快速失败的验证