CDI技术第一步 Hello World!
来源:互联网 发布:日志记录访问次数java 编辑:程序博客网 时间:2024/05/16 15:39
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; @Dependentpublic 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!
- REST技术第一步 Hello world!
- Strophe第一步 hello world
- Red5开发第一步-Hello World
- 自学Java第一步:Hello World!
- Android开发第一步------Hello World!
- Red5开发第一步-Hello World
- 一、java第一步,Hello world
- 万里长征第一步——Hello World
- CDI进阶第一步 CDI拦截器
- 学习语言的第一步——Hello World
- IntelliJ IDEA Kotlin第一步从hello world开始
- CDI技术第八步 动态CDI BEAN
- 前端技术Bootstrap的hello world
- 前端技术Bootstrap的hello world
- Hello World!【Hello World】
- 19-activity跳转第一步点击按钮跳转到hello,world布局文件
- 我的Android第一步:开发环境搭建ADT-Bundle及Hello World
- linux 设置connect 超时
- 建立QT交叉编译环境
- 支持向量机通俗导论(理解SVM的三层境界)
- 如何阅读别人的源代码
- 一段通过grep自定义选择执行程序并kill的脚本
- CDI技术第一步 Hello World!
- socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto
- PHP搭建自己的web框架-控制器
- 一维元胞自动机 Python 实现
- linux c socket之异步IO
- spring mvc web应用程序框架的搭建
- mysql 删除重复数据只保留一条
- 在Lua中调用c++函数
- Apache与Nginx的优缺点比较