我们目前正在考虑将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

在J2SE应用程序中模拟CDI的会话和请求范围相关推荐

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

    j2ee 和 j2se 我们目前正在考虑重构Naked Objects框架,以使用JSR-330(依赖注入)和面向EE的老大哥JSR-299(CDI). 使用香草JSR-330是不费吹灰之力的,但是我 ...

  2. 发送linux键盘消息,在C#程序中模拟发送键盘按键消息

    using System.Runtime.InteropServices; 引入键盘事件函数 [DllImport("user32.dll")] public static ext ...

  3. php cdi_Swing应用程序中的CDI事件将UI和事件处理分离

    php cdi 在愉快地围绕CDI构建我的代码几年之后,使用它根据众所周知的模式来构造我的代码非常自然. CDI是一种旨在在Java EE应用程序服务器中使用的依赖项注入机制,这可能被视为不利. 但是 ...

  4. Swing应用程序中的CDI事件可将UI与事件处理分离

    在享受了几年围绕CDI构建我的代码的乐趣之后,使用它根据众所周知的模式来构造我的代码非常自然. CDI是一种旨在在Java EE应用程序服务器中使用的依赖项注入机制,这可能被视为不利. 但是,我想证明 ...

  5. python在程序中模拟键盘鼠标操作

    Python中模拟键盘和鼠标最著名的模块是:pymouse 和 pykeyboard.一次安装两个模块比较麻烦,而有一个库整合了这两个模块,而且能支持跨平台操作,这个库叫 PyUserInput,通过 ...

  6. 微信小程序中开发环境下的POST请求

    写在前面 不得不说,开发环境下,微信小程序要是在发起网络请求的话,遇到的坑也是有的.尽管,微信提供了十分便捷的API 供开发者调用.今天在小程序中写了一个表单,需要提交到服务器上,于是发起了一个 PO ...

  7. 在Python中模拟do-while循环?

    我需要在Python程序中模拟do-while循环. 不幸的是,以下简单的代码不起作用: list_of_ints = [ 1, 2, 3 ] iterator = list_of_ints.__it ...

  8. 使用.NET Core MVC Web应用程序中的ResponseCache属性处理缓存

    HTTP响应的缓存意味着当发出HTTP请求时,服务器生成的响应由浏览器或服务器存储在某个地方,以便在对同一资源的连续HTTP请求中重复使用.实质上,我们正在存储生成的响应,并将该响应重用于后续请求一段 ...

  9. 小程序中使用web-view链接H5网页

    ##加粗样式小程序中使用web-view链接H5网页 1.小程序中,封装统一的接口请求方法(以便在每个接口中都携带 cookie,放在 header 中):const request = parame ...

最新文章

  1. 转载~vim配置文件
  2. 2.7 迁移学习-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  3. 1、CSS 定位 (Positioning)
  4. Codeforces 1093D Beautiful Graph
  5. 地牢房间迷宫走廊生成(二),Python实现洪水法、完美迷宫
  6. 【Java】获取Java代码段运行毫秒数的策略
  7. 小程序读取几种不同格式json数据(小程序json解析)
  8. 《构建之法》第4章读后感
  9. 天刀服务器未响应,天涯明月刀卡顿怎么办 教你如何优化游戏不在卡顿
  10. 华为手机如何安装Goole play教程及安装包
  11. 数据库编程(常量与变量+常用系统函数)
  12. 刘德华--10有一种精神叫刘德华
  13. Just For Fun
  14. 技术面试(一)认识技术面试
  15. python面试题(面试重点)
  16. Android产品研发(十一)--应用内跳转Scheme协议
  17. linux内核网络收包过程—硬中断与软中断
  18. 天才小毒妃 第912章 坑了一大笔
  19. 蓝桥杯:互质数及其定义
  20. 职业学校计算机教学创新论文题目,信息技术论文题目大全

热门文章

  1. SonarQube 8.3.x中的Maven项目的测试覆盖率报告
  2. java xmpp_Java XMPP负载测试工具
  3. java 函数式编程 示例_功能Java示例 第8部分–更多纯函数
  4. apache.camel_Apache Camel 3.1 –更多骆驼核心优化(第2部分)
  5. spring缓存_有关Spring缓存性能的更多信息
  6. spring序列化_使用@JsonIdentityInfo的Spring自定义序列化器
  7. aws jenkins_Jenkins在AWS上(第1部分)
  8. 参数化测试 junit_使用JUnit 5进行更清洁的参数化测试
  9. 动态代码生成 静态代码生成_将速度提升到自己的个人代码生成器中
  10. java 登陆验证失败_使用Java 8流进行快速失败的验证