为什么80%的码农都做不了架构师?>>>   

本文作者:Tony Lee (http://blog.niinoo.com)首发地址:http://my.oschina.net/niinoo/blog/38310

转载请与作者联系。

-- 简介

CDI - Context Dependency Injection 上下文依赖注入:Java EE 6中定义的规范标准,编号:JSR-299。定义了一系列简化Java开发的功能。CDI已经超出一个框架的定义,升华到一种开发模型。这个开发模型不会去限制你必须将代码分为几层,不限制你必须写ORM、持久化、业务代码等,甚至不限制你到底是开发WEB程序还是客户端程序。

CDI的思想来源于几个开源项目:Seam、Guice、Spring However。不过CDI在集合了这几个框架的有点之外,克服了各自的缺点。

CDI只是一个标准(Java Community Process - JCP),不是一个具体的框架,不同的应用服务器有其自己的实现,比如JBoss AS的CDI名叫Weld。

-- 什么样的类可以用来注入

定义比较复杂,有很多巴拉巴拉的东西,实际上不用太关心,遇到问题在Google就行了。下面来看个最简单的可以用来注入的类:

package greetings;public class Greeting {public String greet(String name) {return "Hello, " + name + ".";}
}

就这么简单!然后你就可以将手往上空一伸,心里默念想要的东西,虚空一抓,想要的类就在你手中了,敲到电脑里面,打完收工!如下:

import javax.inject.Inject;public class Printer {@Inject Greeting greeting;...
}

就应该这样么!什么新技术出来以后要让人云里雾里,有必要么!既然是新技术,就是要能简化我们的开发,延长我们的生命!如果什么新技术出来以后缩短了我们的生命,就该坚决排斥!CDI是每个Java开发人员都必须使用起来的技术!除非你嫌时间太多,生命太长!用了CDI,你不必写XML了,不必配置了,不必new了!所要做的,就是在想用的时候,敲一个@I然后在弹出提示中选择、回车,搞定!

回到正题。上面Greeting类的写法,与下面的写法一模一样:

package greetings;import javax.enterprise.inject.Default;@Default
public class Greeting {public String greet(String name) {return "Hello, " + name + ".";}
}

实际上在你用了CDI以后,它会自动给你加上@Default

“它是谁?”我问。

耳边响起一个老者的声音:“你不认识,跟你说了你也不认识。等你见到的时候会给你介绍的,现在说了你还是不认识……”

“既然@Default等于是阴魂,不可能散掉,那么不难想到,会不会还有其他不干净的东西我看不到的?”我继续问到。

“这东西叫Qualifier,现在就只告诉你这么多,别多想,也不用多想,反正牲畜无害。”耳边的声音见见远去。

-- Scope,范围,作用域,生存周期……

既然CDI的作用是在我想要那个类的时候,向上伸手就能抓到我想要的,那么难免就会出现一个问题:如果我头顶上有一大堆东西飘来飘去,或者有两个长得一样的东西分别飘在我头顶1cm处于10cm处,我该抓谁敲进电脑呢?这就需要Scope来将头顶的东西整理一下了。对于WEB开发,Scope会将你头顶的空间分为五层,就好比大气中平流层与对流层的区别。分别如下所列:

1)@Dependent:不在你头顶scope多管闲事将你的头放在这一层了,既然你不可能将你的头敲进电脑(如果能将电脑放进我的头里面又不影响我活着的状态的话,我倒是比较乐意),那就别多管这个东西了

2)@RequestScoped:头顶1cm处

3)@SessionScoped:头顶10cm处

4)@ApplicationScoped:头顶50cm处

5)@ConversationScoped:这东西是一个叫Gaving King的美国人作弊加进来的东西,通常情况下游离于头顶1cm到10cm之间,不过特殊情况它会大脑发热上下乱窜,甚至飞到外太空去。通常这个东西只能在一个叫做JSF的环境内生存。

当然,一个类会活在哪一层的世界,都是由你决定的,比如:

import javax.inject.Inject;
import javax.enterprise.context.RequestScoped;@RequestScoped
public class Printer {@Inject Greeting greeting;...
}

这样你就让Printer活在你头顶大约1cm左右的地方了。你可以给它起个小名,让你在某些地方(记住,很特定的某些地方)能够通过小名找到它:

@Named
@RequestScoped
public class Printer {@Inject @Informal Greeting greeting;...
}

@Named后面什么都没有,意味着你偷懒,让他大名小名都一样,虽然我通常喜欢这样偷懒。不过如果你想让它叫起来亲切一点,可以在后面加上一个比较平易近人的名字:

@Named("MyPrinter")

-- 如何在项目中使用CDI

同样,足够简单,只要在WEB-INF目录下面加一个名叫beans.xml的空文件就行了。

什么?连JAR包都不用?

CDI的JAR包这东西应该由容器提供(天上的众神告诉你)。

那为什么要加一个空文件?

你总要做点事情让我们知道你想用CDI吧,不然我怎么知道该不该帮你?现在这社会,路上倒个老人都得问问清楚再扶,何况你这么阴险的家伙……

-- 注入

既然名称叫做上下文依赖注入,那么首先看看到底是怎么注入的。

· 往哪里注入(3种)

public class Checkout {private final ShoppingCart cart;@Injectpublic Checkout(ShoppingCart cart) {this.cart = cart;}
}

↑  注入到构造方法。一个类只能有一个注入的构造方法

public class Checkout {private ShoppingCart cart;@Injectvoid setShoppingCart(ShoppingCart cart) {this.cart = cart;}
}
public class Checkout {private @Inject ShoppingCart cart;
}

↑  注入到类属性。不需要getter与setter!

-- 注入的顺序:

1)构造方法

2)类属性

3)方法注入

4)@PostConstruct

知道以上东西,基本上已经能够将以前的开发工作量减少很多了。后面的东西就属于“高级”部分了。

本文作者:Tony Lee (http://blog.niinoo.com)首发地址:http://my.oschina.net/niinoo/blog/38310

转载请与作者联系。

转载于:https://my.oschina.net/niinoo/blog/38310

Weld(CDI)教程相关推荐

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

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

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

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

  3. tms tck_在雅加达EE TCK中使用Arquillian的可能方法

    tms tck 最近,我们讨论了如何创建独立的Jakarta Batch测试套件(TCK). 对于大多数提交者而言,使用Arquillian将测试从实现中如何执行抽象化是很自然的. 但是Romain提 ...

  4. 在雅加达EE TCK中使用Arquillian的可能方法

    最近,我们讨论了如何创建独立的Jakarta Batch测试套件(TCK). 对于大多数提交者而言,使用Arquillian将测试从实现中如何执行抽象化是很自然的. 但是Romain提出了一个有趣的想 ...

  5. RestEasy的入门与使用

    文章目录 RestEasy的入门与使用 背景 传统Servlet JAX-RS和JSR 为什么要看规范? 简单解读JSR370 Applications Resources Providers Res ...

  6. java ee cdi_Java EE CDI Producer方法教程

    java ee cdi 这是CDI Producer方法的教程. 在CDI中,生产者方法生成一个对象,然后可以将其注入. 当我们要注入本身不是bean的对象,要注入的对象的具体类型在运行时可能有所不同 ...

  7. Java EE CDI Producer方法教程

    这是CDI Producer方法的教程. 在CDI中,生产者方法生成一个可以注入的对象. 当我们要注入本身不是bean的对象,要注入的对象的具体类型在运行时可能有所不同,或者当对象需要一些bean构造 ...

  8. jsf教程_JSF范围教程– JSF / CDI会话范围

    jsf教程 会话作用域跨越多个HTTP请求-响应周期(理论上是无限的). 当您需要每个HTTP请求-响应周期进行一次交互时,请求作用域在任何Web应用程序中都非常有用. 但是,当您需要对属于用户会话的 ...

  9. weld焊接_玩Weld-Probe –一站式查看CDI的所有方面

    weld焊接 当我坐在DevConf.CZ的会议室时, Weld 3.0.0.Alpha4已发布 . 大约在Jozef Hartinger( @jozefhartinger )旁边或多或少 ,后者在共 ...

  10. php cdi_教程:编写自己的CDI扩展

    php cdi 今天,我将向您展示如何编写CDI扩展. CDI提供了一种扩展功能的简便方法,例如 添加自己的范围, 启用Java核心类进行扩展, 使用注释元数据进行扩充或修改, 以及更多. 在本教程中 ...

最新文章

  1. ovirt官方安装文档 第八章
  2. java 将单词转换为_java – 将int列表转换为单词
  3. js:自动亮起100盏灯
  4. java 下载文件选择下载路径_Java后台如何根据路径地址下载文件?
  5. 基于CDS view生成的OData服务的metadata是如何生成的
  6. 商品评价判别,文本分类——学习笔记
  7. 内核启动的C语言阶段——start_kernel函数
  8. 云端之战:Oracle研发总裁Thomas Kurian 加盟 Google Cloud
  9. 年轻人如何抵抗居高不下的房价?
  10. 据中心综合管理存在诸多挑战
  11. 计算机打出音乐小樱,《火影忍者》插曲——小樱主题曲
  12. linux-LNMP一键安装Error: MySQL install failed. Error: PHP install failed
  13. 前加加 后加加 ++ 详解
  14. Msm8937+android7.1.1编译环境搭建及编译
  15. Android设备:外接扫码枪与系统软键盘问题
  16. C语言解决狐狸找兔子的问题(数组)
  17. CPU位数和DDR位宽
  18. 【Nvidia AGX Xavier】AGX Xavier使用记录
  19. 基于Android Tv制作一个Tv桌面(二)
  20. SSM框架搭建(Maven项目)

热门文章

  1. OpenCV-Python教程(10、直方图均衡化)
  2. 【0x50「动态规划」例题】LCIS【最长公共上升子序列】
  3. 每日一题/014/三角函数/和差化积/求证:cos 2+cos 4+cos 6+...+cos 2n=sin ncos(n+1)/sin1
  4. Mybatis常见的面试题
  5. matlab绘制两个函数,一系列复杂表达式迭代。怎么能画出某两个变量的函数曲线...
  6. C语言函数未声明错误,switch 调用函数 错误未定义???
  7. 素数猜想对 c语言,1007 素数对猜想 (20 分)(C语言实现)
  8. 简单的maven引入外部jar项目打包
  9. WPF-遍历页面所有TextBox做数据校验
  10. ActiveMQ 持久化