【转】关注CDI(上下文依赖注入):Weld, Seam 3及之后

Quarkus:一个 Kubernetes 原生 Java 框架 Red Hat 发布了 Quarkus,这是一个为 GraalVM 和 OpenJDK HotSpot 量身定制的 Kubernetes 原生 Java 框架。Quarkus 的目标是使 Java 成为 Kubernetes 和无服务器环境中的领先平台,为开发人员提供统一的反应式和命令式编程模型。 Quarkus 利用 Java 开发人员使用的一系列库,如 Eclipse MicroProfile... 阅读详情
Eye on CDI:Weld, Seam 3 and Beyond

Bill Bendrot    2010年6月



目标:

  • JEE的长期挑战
  • 我有一个解决方案,但是……
  • CDI是什么?
  • Weld
  • Seam 3

JEE的长期挑战

太多bean,太少的共同基础……

关注CDI:Weld, Seam 3和Beyond - *工* - 要有光,于是就有了光
 

上下文滥用!—— HttpSession —— 为什么?

关注CDI:Weld, Seam 3和Beyond - *工* - 要有光,于是就有了光
 
  • Servlet上下文模型太粗。
  • 不能反映现实世界的用法。

我有一个解决方案,但是……

  • Seam提出:
    • 转变任何东西为一个“组件”。
      • 一类“东西”。
    • 引入双向注入。
      • 使依赖注入为有状态的和动态的。
    • 结合了JSF和EJB。
    • 增加了对话上下文和业务流程上下文。
  • 但是,Seam仍然是非JEE 的。

解决方案:上下文和依赖注入

  • JSR-299 —— 用于JEE的上下文和依赖注入。
    • JEE6的核心部分。
    • 帮助统一bean模型。
    • 明确定义的上下文,可以绑定有状态bean给它们,并管理生命周期。
    • 增加依赖注入给JEE,并使它成为类型安全。
    • 引入了一个事件通知系统。
    • 使用拦截器,鼓励松耦合。
      • 重新定义拦截器为装饰器,用于细粒度控制。
    • 集成统一的EL,桥接JSF。
    • 引入了一个SPI,扩展JEE —— 走向自己的JEE7!

CDI的关系

  • 规范 —— JSR-299 —— CDI
    • 也集成了JSR-330的元素
      • 参考实现  —— Weld
        • TCK ——  技术兼容工具包
          • 实现 —— Seam 3

名字代表什么?解决方案的历史。

  • 开始使用WebBeans。
  • 更多涉及“Web”,而少涉及“Beans”。
  • 规范改为CDI。
  • 参考实现最初称为 WebBeans。
  • 委员会异议。
  • 参考实现最命名为Weld。
  • 当谷歌搜索信息时,你仍然会看见提及到“WebBeans”,并且甚至在规范的文件名仍然是“WebBeans”。

统一Bean模型

关注CDI(上下文依赖注入):Weld, Seam 3及之后 - *工* - 要有光,于是就有了光
 
管理Bean细节

  • 任何被容器管理的组件都是一个Bean。
  • 管理Bean建立的基本规范。
    • 拦截器
    • 生命周期回调
    • 资源注入
  • 在JEE6及之后中,其他的规范建立在这个基础之上。
    • CDI
    • EJB
    • 等等……

CDI Beans —— 我们回到“管理Beans”

  • CDI增加以下内容到管理Bean的服务:
    • 自动发现
      • 通过beans.xml选择加入
    • Bean类型
    • 有一个“家族”的bean类型的能力:
      • Qualifiers (在设计时选择)
      • Alternatives(在部署时选择)
      • Producers(在运行时选择)
  • 域的通告和联接
  • EL名字(可选的)
    • 直接暴露bean给JSFs或JSPs
  • 拦截器绑定

CDI Bean例子

public class Bike {
public String returnManufacturer() {
return "Made by JBoss";
}
}

//相同的Bean作为一个EJB
@Stateful public class Bike {
.....

//
相同的Bean暴露给一个JSF
@Named
public class Bike {
.....

明确定义的上下文 —— 增加了对话

关注CDI(上下文依赖注入):Weld, Seam 3及之后 - *工* - 要有光,于是就有了光
 
Conversation (对话)
  • 多请求,少会话
  • 存在于一个JSF用例的时间长短

@ConversationScoped 

促进从瞬时的到长期的:
  • Conversation.start()
  • Conversation.end();

上下文模型

@SessionScoped
public class Race() {
@Inject @Motocross Motorcycle racer1
....
}

伪域:
  • @Dependent
Servlet域:
  • @RequestScoped
  • @SessionScoped
  • @ApplicationScoped
JSF域
  • @ConversationScoped

对话域

关注CDI(上下文依赖注入):Weld, Seam 3及之后 - *工* - 要有光,于是就有了光
 
@ConversationScoped
public class RentCar { 
  @Inject Conversation conversation; 
  public void rentCar(){
    CODE TO RENT CAR 
    conversation.begin();
  } ...

类型安全的依赖注入

  • 注入现在是基于类型
Bean 注入
分类
基于下面的组合:
  •  
    • Annotation
    • Type
    • Type Params
  • 消除了基于名字/字符串的注入

近看CDI注入

@Motocross
public class Motorcycle extends Vehicle 
implements Bike<Motorized> {
 …
}

4个方法,这个Bean可以被注入:

  •  Motorcycle
  •  Vehicle
  •  Wheel<TwoWheel>
  • @Motocross

限定者(Qualifiers)

@Motocross是一个限定者( Qualifier):当你有实现了相同接口的多个Bean时,这是一个区分它们的方法。充当一个绑定类型。

@Motocross
public class Motorcycle extends Vehicle 
implements Bike<Motorized> {
 …
}

@Qualifier
@Retention(RUNTIME)
@Target ({TYPE, METHOD, FIELD})
public @interface Motocross { }

@Alternative

可选择性(Alternatives)作为一个布置时覆盖必须专门启用。然后它们占据了匹配的类型的位置。

@Alternative @Motocross
public class TestBike extends Vehicle 
implements Bike<Motorized> {
 …
}

由beans.xml 
启用:

<alternatives>
  <class>
  org.jbossmotors.mock.TestBike
  </class> 
</alternatives>

生产者(Producers)

生产者方法( Producer method)是一个方法,它充当Bean实例的资源。该方法的声明自身描述了Bean,并且当指定的上下文中不存在实例时,容器会调用该方法获取此Bean的一个实例。

@ApplicationScoped
public class RandomNumberGenerator {
  private Random random = 
                  new Random(System.currentTimeMillis());
  @Produces @Named @Random int getRandomNumber() { 
      return random.nextInt(100);
  }
}

被用来,在运行时,动态地实现一个注入。

生产者字段(Producer fields )是一个更简单的可选方法。用于JEE组件参考注入特别好。

@Produces @WebServiceRef
   (lookup="java:app/service/Catalog") Catalog catalog;

事件通知

表示生产者与观察者完全解耦的一种方式,反之也然。

生产者: DeliveryTracking.java

@Inject Event<Package> delivered;
public void delivery(String recipient) {
delivered.fire(new Package(recipient, timeStamp) );
}

接受者: DeliveryNotifier.java

void onDelivery(@Observes Package package,
                        @Default Recipient recipient) { 
      System.out.println(recipient + 
                “ recieved “ + package.getContents()); 

统一的确EL集成

  • 统一的EL暴露管理的Beans给JSF和JSP视图。
    • 所有需要的一切是 @Named注释。
  • 大多数资源是可注入的:
    • 管理的Beans
    • 网页服务参考
    • 本地或远程EJBs
    • 生产者创建的对象
    • 等等
Weld

  • CDI参考实现。
    • “普通(Vanilla)” CDI
  • CDI实现是在JBoss AS 6 和GlassFish 3 中。
    • 但是也支持Tomcat和Jetty,甚至也支持JavaSE
  • 被maven化。
  • 提供扩展的基础。
    • Weld 扩展是用于扩展核心。

关注CDI(上下文依赖注入):Weld, Seam 3及之后 - *工* - 要有光,于是就有了光
 
接下来都会去什么地方?—— Seam 3

  • 现在,Seam在核心利用CDI被模块化。
    • 模块有一个独立发行的周期。
    • 普通的快照/包装发行。
  • Seam堆栈由以下内容构成:
    • Java EE集成在平台内部。
    • 声明性安全。
    • 页面流(jPDL)和业务流程(jBPM)。
    • JavaScrip远程处理。
    • “渲染” e-mail, 图形, PDF, 和 XLS
    • Spring集成,等等。
  • 工具化。

从Seam 2 到 Seam 3

  • Seam 3 = Java EE的可移动扩展。
  • 构建在CDI 基础的顶部。
  • 现在以模块方式组织。

关注CDI(上下文依赖注入):Weld, Seam 3及之后 - *工* - 要有光,于是就有了光


 Seam 3 模块

关注CDI(上下文依赖注入):Weld, Seam 3及之后 - *工* - 要有光,于是就有了光
 
Seam 3 vs. Seam 2

  • 已改变的注释。
    •  @In 现在为 @Inject, @Name 现在为 @Named。
    •  @ScopeType 由域注释替换 ——  @RequestScope 。
    •  @Begin/@End 调用对话接口,现在为了—— Conversation.begin() 。
  • 一些概念/实现被取代。
    • Outjection(注出)—— 不是注出某些东西到域内部,而是确保你正在从该域中读取。
      • 此外,可使用更安全的生产者字段(Producer Fields)替代。
    • 工厂(Factories) —— 来自生产者方法的更安全的结果。

最新的信息

  • http://www.seamframework.org
    • 下载
    • 文档
    • 论坛和社区
    • 投稿

小结

  • JSR-299 —— 引入了一个灵活的JEE 服务集合:
    • 强壮类型的管理的Beans。
    • 上下文。
    • 动态的依赖注入。
    • 多渠道的松耦合。
    • 可扩展的SPI。
  • Weld是 CDI的参考实现,并且在JBoss 6 和 GlassFish3 中被实现。
    • 可以被添加到Tomcat, Jetty。
  • Seam 3 —— JEE的可移动扩展(通过CDI)
保姆级教程:断网环境下用Flexnet服务器搞定SolidWorks 2021安装与破解(附错误5解决方案) 本文提供SolidWorks 2021在断网环境下的企业级部署指南,详细解析Flexnet服务器本地化工作原理,并给出安装与破解的实战方案,特别针对常见的'错误5'问题提供多维度解决方案。适用于需要内网隔离或移动办公的工业设计场景,确保数据安全与授权合规。 阅读详情

相关推荐

PCL 点云格式换【2024最新版】

常见点云格式化汇总包括txt、stl、csv、ply、obj、xyz、las等。博客长期更新,本文最近一次更新时间为:2024年9月14日,代码更新至PCL1.14.1版本。

点云侠的博客 39万+

cdi-async-events-extension:允许您在 CDI 托管容器内发送异步 CDI 事件的 CDI 扩展

cdi-异步事件扩展 介绍 该项目为 JSR 346: Contexts and Dependency Injection 1.1 提供了 CDI 扩展。 此扩展通过发送异步消息的能力增强了 CDI 生命周期。 该项目经过全面测试,并提供了多个配置文件,可在多个 CDI 容器中轻松进行集成测试。 这个项目是用构建的。 对于不同 CDI 容器内的集成测试,使用了 。 在您尝试将此扩展集成到您的基础架构中之前,请务必阅读整个文档。 它包含以下信息: :使用此扩展程序时您可以立即使用的所有功能的列表 :运行此扩展所需的列表 :如何构建和安装这个扩展到你的本地 Maven 存储库中。 :如何在应用程序中使用扩展 :技术背景、使用的插件等。 概述 该项目提供了一个占用空间仅为 9kb 的简约单 jar CDI 扩展,使您的 JavaEE6/JavaEE7 堆栈为异步事件做好准备,而无需引入

cdi-weld:焊接CDI简介

CDI-上下文依赖注入 内容: 资源和材料 &uarr; 介绍 多年来,程序员已经编写了使用众所周知的new关键字创建对象的代码。 随着时间的流逝,程序变得越来越复杂,维护繁琐的创建逻辑变得越来越困难,同时又保持了代码更改的灵活性(当然,它不会崩溃)。 最初,开发了设计模式(pattern) ,从而稍微改善了情况。 但是我想要更轻便。 然后程序员认为,我们为什么要管理诸如创建对象之类的例程? 让我们说出我们想看到的对象和对象,然后有人会替我们完成所有肮脏的工作? 然后他们提出了&ldquo;依赖注入&rdquo;一词。 那就是我们所依赖的类,称为&ldquo;依赖&rdquo; (Dependency)。 我们决定将其规定称为&ldquo;注入&rdquo;( Injection )。 在那之后,他们认为不可能仅仅采取并实现,将所有类混合到一个大的垃圾堆中。 我们决定区分某些领域的类,即上下文(Context),它们决定了这些类的生存方式。 好吧,是的,这些根据CD

tomcat下的struts2+CDIweld)+JPA配置

之前一直用JavaEE的服务器,CDI,JPA都是默认支持的,配置方面很简单。由于使用axon和axon-cdi(CDI api 1.1),想使用轻量一点的应用服务器,选择了tomcat,配置方面总是有些问题,不过终于可以跑了,记录一下。 1.首先,使用基本的tomcat 7,而不是TomEE,TomeEE不支持cdi-api 1.1 2.使用weld作为cdi的实现,它可以在j2se下运行,

yys79的专栏 2043

CDI(Weld)基础<1>入门,解析CDIBeans

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

weixin_33752045的博客 317

WeldCDI)教程

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

weixin_34416754的博客 302

cdi 2.7.5_CDI参考实施Weld 1.1.6最终焊接区,OSGi即将到来

JBoss社区很高兴宣布Weld 1.1.6 Final的到来,领导Ales Justin将其描述为“自接手项目以来,可能是最大的bug压榨节”。 Weld是JSR-299的JBoss 参考实现(RI) :Java EE平台(或称为CDI )的 Java上下文依赖注入CDI JCP规范由Red Hat领导 加文·金(Gavin King),Java EE和JBoss for CD...

193

关注CDI上下文依赖注入):Weld, Seam 3及之后

Eye on CDI:Weld, Seam 3 and Beyond Bill Bendrot    2010年6月 目标: JEE的长期挑战我有一个解决方案,但是……CDI是什么?WeldSeam 3 JEE的长期挑战 太多bean,太少的共同基础……  

BlingBling 711

Jboss seam + EJB3 + Hibernate3

jboss seam + EJB3 + JPA ( HIBERNATE 3) http://docs.jboss.org/weld/reference/latest/en US/html/intro.html#bean-definition Java EE6规范中包含的Web Beans规范已经更名为Java EE 上下文依赖注入规范(JSR-299)。相应的,JBoss对此规范的实...

iloveflowerll的专栏 163

[译文]Java EE 6中的依赖注入——第1部分

 原文:Dependency Injection in Java EE 6 – Part 1作者:Reza Rahman出处:http://www.theserverside.com/tt/articles/article.tss?l=DependencyInjectioninJavaEE6 这一文章系列介绍了Java EE的上下文依赖注入(Contexts and Depe

没有自信心的软件开发者 1825

php cdi_教程– CDI扩展编程

在Enterprise Java的早期,创建了许多框架,每个框架都有非常明确的技术目标。 不幸的是,这些很快变得超载,并塞满了很多功能,无法满足每一个需求。 CDI专家组旨在通过严格关注依赖关系注入的核心问题并定义一个非常强大的扩展机制来在其之上实现附加功能,来避免CDI规范出现此问题。 CDI扩展机制Swift流行起来,并且已经有许多高质量的扩展可用。 该机制称为“便携式CDI扩展”,因...

351

[译文]Java EE 6中的依赖注入——第1部分(一)

原文:Dependency Injection in Java EE 6 – Part 1 作者:Reza Rahman 出处:http://www.theserverside.com/tt/articles/article.tss?l=DependencyInjectioninJavaEE6   这一文章系列介绍了Java EE的上下文依赖注入(Contexts and Depende

bluedot的专栏 951

web beans --weld---JSR-299 快速入门

本人使用JSF2.0/webbeans(WELD)开发的例子:http://download.csdn.net/source/2336819   前沿:全球第一篇中文webbeans(weld)整理资料...原装处女作..2009年12月,sun发布了javaEE6.这个消息如同梦中情人的一个滚烫的吻,吻醒了我久久期盼的心情...抓紧研究,在百忙之中,写下此快速入门,由于接触时间不长,如有疏漏...

iteye_7340的博客 727

Spring常见面试问题 (

Spring 1. Spring工作机制及为什么要用?Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。Spring既是一个AOP框架,也是一IOC容器。SpringFramework的组成:Spring AOP,Spring DAO,Spring ORM,Spring Web,Spring Context, Spring We...

weixin_34248487的博客 401

互联网大厂Java面试实战:Spring Boot、微服务与JVM核心技术解析

本篇文章模拟了互联网大厂一场具有代表性的Java面试,求职者谢飞机面对严肃的面试官展开了三轮技术问答。文章包含详细的问题、谢飞机的回答及面试官的反馈,最后附上详尽的答案解析,帮助小白快速补齐知识盲点。

2301_76895560的博客 375

CDI(Weld)高级<1>CDI高级说明以及Producer methods

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

weixin_33938733的博客 272

Weld-Probe –一站式查看CDI的所有方面

焊接3.0.0.Alpha4被释放 ,而我一直坐在在DevConf.CZ一间会议室。 Jozef Hartinger( @jozefhartinger )或多或少地在几分钟前告诉我有关此最新版本的新功能的信息。 有一个特别的功能真正引起了我的注意,它是新的焊接探针机制。 什么是焊接? WeldCDI的参考实现:Java EE平台的上下文依赖注入,这是用于依赖注入上下文生命周期管理...

最佳 Java 编程 316

第三章 依赖注入CDI

依赖注入:Dependency Injection 一 ,Java EE 实现依赖注入 java EE 为了摆脱XML配置,java EE新增了几个注解来执行注入 1,@Resource(),用于注入数据源、java消息服务(JMS)、URL、邮件与环境变量 2,@EJB,用于注入EJB 3,@WebServiceRef 用于注入Web Service 4,@Inject 注解DI是类型安全的,因为它会根据对象引用类型注入依赖。 import javax.inject.Inject; class .

lazyboy2的博客 386

浙江省下属八大流域划分及其矢量SHP整理数据

数据预览地址:https://blog.csdn.net/yinchoushi8780/article/details/156910866浙江省下属八大流域划分及其矢量SHP整理数据。包含n八大流域的合并图层,及其拆分后的单个图层。一、钱塘江:北源(新安江)河长588.73公里、南源(马金溪)河长522.22公里二、瓯江:河长379.93公里;流域面积18168.75平方公里(其中省外部分37.66平方公里)三、椒江:河长202.00公里;流域面积6590.71平方公里四、飞云江:河长194.62公里;流域面积3729.10平方公里五、苕溪:河长160.68公里(以东苕溪为干流)六、甬江:河长130.96公里;流域面积4572.00平方公里七、运河:河长129.49公里,京杭浙江段八、鳌江:河长81.52公里;流域面积1544.92平方公里九、其他海岸线区域

上一篇: SVN steal lock
ken_C
博客等级 码龄20年 0粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值