CDI|CDI技术第一步 Hello World!


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插件,就是下图这种情况。
CDI|CDI技术第一步 Hello World!
文章图片

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

这样在新建web项目的时候就可以选择项目运行的服务器环境。如下图,我的eclipse就可以选择glassfish4或者wildfly 8.x两种服务器环境。
CDI|CDI技术第一步 Hello World!
文章图片

加入了服务器运行环境的项目。它的classpath里面就会有服务器自带的J2EE API。如下图所示(图中圈出来的是CDI的API):
CDI|CDI技术第一步 Hello World!
文章图片

这样开发编译就非常方便了。废话不多说,我们先写一个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 { @Override public 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; @Inject private HelloInterface hello; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append(hello.info()); } }

然后我们运行一下。

CDI|CDI技术第一步 Hello World!
文章图片

【CDI|CDI技术第一步 Hello World!】这样一个最简单的CDI程序就写完了。

    推荐阅读