您的位置:首页 > 其它

CDI技术第一步 Hello World!

2016-01-08 00:05 288 查看
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程序就写完了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: