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

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

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

 

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

 

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

 

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

 

这样开发编译就非常方便了。废话不多说,我们先写一个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程序就写完了。

 

0 0