Context Depedency Injection(一)

来源:互联网 发布:数据库怎么加密 编辑:程序博客网 时间:2024/05/16 15:19

一、概述

       CDI是JavaEE6中对java 依赖注入控制反转以及面向切面编程提出的新的标准和规范。CDI受流行的依赖注入(DI)和面向切面编程的影响,各种实现没有统一的规范,需要有这么一套标准或者规范去约束java在DI和AOP方面的编程,目的是将来可以在这基础上继续定制统一的规范和标准。DI和Aop作为许多java 框架的基础,CDI的出现会使得他们成为更高一级技术标准和规范的基础。

        这篇文章主要讨论依赖注入和控制反转,文中涉及到了许多CDI的新特性,如类型安全、CDI alternatives 等等。这篇教程分为两部分,第一部分主要是依赖注入的基础如@Inject,@Porduces及@Qualifiers等注解标签,第二部分主要是一些高级的讨论话题,如如何创建课插拔的实例化组件及一些注解处理配置等等。

二、应用CDI的好处

       CDI 作为Java EE 6面向切面编程的基础,很快就被各种企业级应用服务器支持,如Caucho 的 Resin,IBM的 WebSphere 及Oracle的Glassfish,红帽公司的Jboss还有一些其他的应用服务器。CDI跟spring及谷歌的Guice框架中的DI 和Aop 相似。就像JPA是ORM的规范一样,CDI声明规定了DI和Aop开发的接口。如果你曾经使用过spring和Guice框架,你会发现CDI学起来和用起来都很简单。然而你刚刚接触依赖注入概念的话,那么CDI将是你快速学习依赖注入的基石。
       CDI也可以单独被使用在任何框架中集成到各种应用中。
       依赖注入(DI)是指处理过程向软件提供一个外部依赖组件,这能帮助你的代码架构上解耦,减少对象间的直接依赖关系。
       这样设计的目的是在接口设计以及测试驱动开发通过提供一个一致的方式注入依赖项。例如,一个数据访问对象(DAO)依赖注入于一个数据库连接,而不是与JNDI查找数据库连接。
      考虑像CDI, DI框架的一个方法是使用JNDI去依赖查找注入,而不是一个对象查找其他对象,它需要完成工作(依赖性),DI容器再注入依赖对象。这就是所谓的好莱坞原则,“别叫我们‚”(查找对象),“我们会打电话给你”(注入对象)。
如果你曾开发过crc cards应用,就能想到的依赖作为一个合作者。合作者是一个对象,另一个对象需要执行的角色,就像一个DAO(数据访问对象)需要一个JDBC连接对象。

 

三、CDI 编程步骤

使用CDI编程需要做以下几步
1.在META-INF资源文件下创建空的bean.xml文件
2.在需要注入依赖的类中相应的setter方法上添加@Inject注解
3.使用@Default注解相应的类文件
4.使用@Alternative注解相应的可选择属性
5.使用CDI对象管理容器查找相应的对象

四、实例

1.创建web项目,在META-INF资源文件下创建空bean.xml

        CDI实现需要在你的jar文件或者classpath或者web应用的WEB-INF文件路径下的META-INF路径下创建bean.xml文件。bean.xml文件可以是空文件,如果你的war包或者是jar包中没有bean.xml文件,则他们不会被CDI管理起来。负责CDI会自动扫描相应的war包或者jar 包中的bean.xml是否为空。
代码示例
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/beans_1_0.xsd"></beans>

2.创建servlet,命名为CDIServlet。在CDIServlet中的set方法中添加@Inject注解。

        @Inject注解用来标记需要依赖注入的地方。@Inject标签可以用在属性上,构造方法上及set方法上。在这个例子中我们用在set方法上。
代码示例
package com.zhouxiang;import java.io.IOException;import javax.inject.Inject;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class CDITest */public class CDITest extends HttpServlet {private static final long serialVersionUID = 1L;    @Inject    private Test1 test;        /**     * @see HttpServlet#HttpServlet()     */    public CDITest() {        super();        // TODO Auto-generated constructor stub    }/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoPost(request,response);}/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("dsfsdfsd");test.test(); }}


3.创建Test1类,并标注默认注入标签@Default

package com.zhouxiang;import javax.enterprise.inject.Default;import javax.inject.Inject;import javax.inject.Named;@Defaultpublic class Test1 {public void test()   {System.out.println("hello inject!");  }}



0 0
原创粉丝点击