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 {
@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程序就写完了。
推荐阅读
- Tomcat|Tomat之——多项目jar包共享配置
- J2EE系列(Tomcat内存释放不了、Tomcat内存溢出原因、Tomcat内存管理[整理])
- mybatis|MyBites
- 1 | Dubbo(探讨标签路由的实现)
- ubuntu/linux下打包压缩war、解压war包和jar命令
- Maven搭建SpringMVC+Hibernate项目详解
- latex公式导出word(docx)实例
- j2ee|如何申请自己的域名邮箱
- J2SE|通过线程按照顺序循环输出ABC n次