CDI全称是Contexts and Dependency Injection,上下文和依赖注入。在当前的J2EE开发领域,spring无疑是最流行的依赖注入技术。这有个问题,为什么要用依赖注入?因为现在J2EE的开发,大部分都是利用MVC模型进行开发的。MVC开发中就会有分层问题,控制器层要调用service层,service层要调用dao层。那么就存在一个装配问题,就是将dao层的对象装配到service对象中,将service层对象再装配到controller层里面。如果使用传统的方式,new一个对象,然后用set方法装配,造成了高度的耦合,程序无法解耦。流行的方式就是将dao对象,service对象,controller这些对象全部交给容器来管理,由容器来解决这些对象之间的依赖问题。容器底层使用发射来创建对象,并使用反射来注入对象,这样实现类解耦,将来修改依赖时只要修改配置就够了,无须改动代码。

J2EE 7的CDI技术就是诞生在这种背景下的。目前J2EE7规范中CDI的版本是1.1,属于JSR-346规范。现在支持了完整的J2EE 7特性的服务器有red hat的wildfly 8服务器,还有oracle的glassfish 4.1等服务器。而常见的tomcat服务器只实现了J2EE的web技术,也就是四大核心技术,servlet,jsp ,el, web socket。所以tomcat是不支持CDI技术的。

在支持CDI技术的J2EE应用服务器中,web项目的web-inf/lib里面不需要加任何东西就可以使用cdi的那些接口、类、注解等。因为在如glassfish等服务器里面已经带有这些jar文件了。就比如我下面要写的hello world项目,这个项目只需要3个java文件,web.xml中也不需要再加任何配置就可以直接在glassfish中正常运行了。

编译的时候需要将J2EE的CDI jar文件放入classpath中进行编译。如果使用开发工具,可以很方便地编译,打包。开发工具可以使用eclipse,也可以使用netbeans。我拿eclipse Mars为例子,开发CDI应用首先需要的是一个J2EE服务器。Eclipse可以在eclipse的servers里右击一个new server。如果eclipse没有安装这种服务器的插件,就会有一个下载的小箭头,比如我的eclipse里没有web logic插件,就是下图这种情况。

出现这种箭头就是可以去下载对应的服务器插件。然后重启eclipse就完成了服务器插件的安装。这一步完成之后,将J2EE服务器添加进来让eclipse管理就完成了开发工具的配置。以我的eclipse为例子,它管理了2个J2EE服务器用来开发。

这样在新建web项目的时候就可以选择项目运行的服务器环境。如下图,我的eclipse就可以选择glassfish4或者wildfly 8.x两种服务器环境。

加入了服务器运行环境的项目。它的classpath里面就会有服务器自带的J2EE API。如下图所示(图中圈出来的是CDI的API):

这样开发编译就非常方便了。废话不多说,我们先写一个demo。首先写一个实体类与一个一个接口。这是我们要注入servlet中的东西。

package com.rschy.cdidemo;public interface HelloInterface {String info();
}

下面是实现类

package com.rschy.cdidemo;
import javax.enterprise.context.Dependent;@Dependent
public class HelloClass implements HelloInterface {@Overridepublic String info() {return "Hello world!";}}

可以看到接口不需要任何改变。但是实现类需要写注解。

注入servlet非常简单。看下面的代码:

package com.rschy.cdidemo;import java.io.IOException;import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/hello.html")
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;@Injectprivate HelloInterface hello;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter().append(hello.info());}}

然后我们运行一下。

这样一个最简单的CDI程序就写完了。

CDI技术第一步 Hello World!相关推荐

  1. 岑崟:手把手教你走好从技术转管理的第一步

    岑崟 读完需要 10 分钟 速读仅需 1 分钟 前好买财富 系统运维部副总监 负责应用运维及 DevOps 运维平台研发和运营,推动运维团队从传统运维向 DevOps 转变. 本文根据岑崟老师在[de ...

  2. 流量贵如金,APP推广如何迈好第一步?技术和策略缺一不可

    APP推广要有技术和策略的两大支持,二者缺一不可. 首先来看看技术上能有哪些支持,这里我分享一下ShareinstallSDK这个技术. 你也许对ShareinstallSDK还很陌生,不知道它是什么 ...

  3. 技术变现第一步:网站快速接入国际支付 Stripe

    我坚信,机会永远属于有准备的人,我们与其羡慕他人的成功,不如从此刻起,积累足够多的知识和经验,为将来实现财务自由做好充分的准备! 如果你有技术,稍加运营,就可以一个人打造出一台日入 100+美元的赚钱 ...

  4. 简历解析步骤(第一步)技术与实现(1)识文字,取信息

    简历解析步骤(第一步)技术与实现(1)识文字,取信息 在上篇文章中,我们讲解了简历解析的理论.一般情况下,我们会以图片或文档的形式收到简历,为了实现解析,首先需要将其中的文本提取出来,然后对文本进行算 ...

  5. 浪潮服务器nf5270m5做raid_服务器安装第一步RAID配置——企业服务器常用RIAD技术介绍及配置...

    其实服务器安装第一步是打开包装箱,呵呵,第二步是安装导轨,第三步服务器上机架,第四步接上显示器,第五步通电开机-为啥我说服务器安装第一步是RAID配置,因为它相当重要!这是你在服务器安装相关系统之前的 ...

  6. CDI技术第十步 给Bean取名字

    CDI技术第十步 给Bean取名字 Spring可以给Bean取名字,EJB也可以.那么我们的CDI可以吗? 答案肯定是可以的! 核心注解是@Named 加在类上,可以指定名字,也可以不指定.如果不指 ...

  7. 初学架构设计的第一步:需求、愿景与架构

    初学架构设计的第一步:需求.愿景与架构 了解<需求>.<愿景>与<架构>三者的关系.也就是<需求分析>.<观想愿景>与<架构设计> ...

  8. 使用html测试数据库连接与操作(含界面) 第一步界面设计

    前面写的那篇文章,只是实现了页面刷新就读取数据库的过程,还不能有人工干预,还不像一个正式的东东,这可能和我以前写c#养成的习惯似的,总想弄的完美点,第一步先吧界面弄出来,说实话,具体怎么通过按钮出发p ...

  9. 程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug

    来源:AI科技评论 本文约2700字,建议阅读10分钟 本文介绍了来自斯坦福大学的两位研究员研究了如何使用AI来自动修复程序,以期未来程序修复自动化可以大大提高编程和学习编程的效率. 众所周知,程序员 ...

最新文章

  1. 无线局域网安装与调试(Wireless LAN installation and commissioning)
  2. 怎么查看电脑内存和配置_电脑内存条如何选择?老司机带你如何选择电脑内存条...
  3. Mysql错误:服务名无效。 请键入 NET HELPMSG 2185 以获得更多的帮助。
  4. java环境搭建_记一次阿里云服务器Java相关环境搭建的过程
  5. android studio on/off 切换开关,如何使用android studio中的开关小部件来启用/禁用函数()?...
  6. dlgdata.cpp错误提示 解决方案
  7. [转]phonegap 2.9 IOS Xcode 搭建环境
  8. Perceptual Losses for Real-Time Style Transfer and Super-Resolution 运行程序
  9. select下拉框option默认选中(php模板渲染)
  10. 《编程之美》中买书问题算法。空间复杂度O(n),时间复杂度O(n),求挑战
  11. 字符叠加器 视频叠加器模块
  12. 浅谈简单线性回归(Simple linear regression)part3SEE,MSE,SSE的关系
  13. C++在linux环境下获取毫秒、微妙级别时间
  14. 视频无法播放是怎么回事
  15. java maven 引入有赞云SDK
  16. sql 高级查询语句总结
  17. ultraedit技巧积累
  18. PHP中空格占位数吗,html内的空格占位
  19. 2022年全球市场软铁氧体粉末总体规模、主要生产商、主要地区、产品和应用细分研究报告
  20. 电影制作和上映有什么不可控的因素?

热门文章

  1. c语言参悟之旅,Activity生命周期管理之三——S...-《C语言参悟之旅》-读书笔记...-C++函数参数小结_169IT.COM...
  2. 悬链线锚链力的求解方法
  3. 金蝶ERP实现单据编号按日自动重置
  4. 钢筋符号!每天学一点,进步惊人!收藏不会错!
  5. 基于区块链的防护物资捐赠监管系统(三):功能设计
  6. Java respa 中文乱码_Retrofit 中文乱码问题的解决
  7. React 报错与解决方法
  8. 磊科762虚拟服务器静态,路由器端口映射教程_磊科NW717路由器端口映射设置教程...
  9. 预制菜:“真”风口,“假”繁荣?
  10. 顺丰“牵手”唯品会,电商物流大战事的小缩影