欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Servlet CDI Example Analysis

程序员文章站 2022-06-22 13:07:38
来源于官方文档: https://javaee.github.io/tutorial/cdi-basic001.html 上下文和依赖注入(CDI)使您的对象能够自动为它们提供依赖项,而不是创建它们或将它们作为参数接收。CDI还为您管理这些依赖项的生命周期。 来源于官方文档: https://jav ......

来源于官方文档: https://javaee.github.io/tutorial/cdi-basic001.html

 

上下文和依赖注入(cdi)使您的对象能够自动为它们提供依赖项,而不是创建它们或将它们作为参数接收。cdi还为您管理这些依赖项的生命周期。

例如,考虑以下servlet:

@webservlet("/cdiservlet")
public class newservlet extends httpservlet {
    private message message;

    @override
    public void init() {
        message = new messageb();
    }

    @override
    public void doget(httpservletrequest request, httpservletresponse response)
                  throws ioexception {
        response.getwriter().write(message.get());
    }
}

  

这个servlet需要一个实现message接口的对象实例 

public interface message {
    public string get();
}

  

servlet创建自己的以下对象的实例:

public class messageb implements message {
    public messageb() { }

    @override
    public string get() {
        return "message b";
    }
}

  

使用cdi,这个servlet可以声明它对message 实例的依赖性,并让它由cdi运行时自动注入。新的servlet代码如下:(详细分析此段代码)

@webservlet("/cdiservlet")      //url映射,即@webservlet告诉容器,如果请求的url是"/cdiservlet",则由newservlet的实例提供服务。
public class newservlet extends httpservlet {    //声明一个newservlet类 并继承httpservlet
    @inject private message message;   //表示运行时将动态注入(实例化)一个message
    @override     //重写父类doget()方法
    public void doget(httpservletrequest request, httpservletresponse response)
                  throws ioexception {
        response.getwriter().write(message.get());    //带文本格式打印输出message.get()返回的文本
    }
}

  

cdi运行时查找实现message 接口的messageb,查找类,创建它的新实例,并在运行时将其注入servlet。要管理新实例的生命周期,cdi运行时需要知道实例的范围应该是什么。在此示例中,servlet仅需要实例来处理http请求; 然后可以对实例进行垃圾回收。这是使用javax.enterprise.context.requestscoped 注释指定的

@requestscoped
public class messageb implements message { ... }

 

messageb类是一个cdi bean。cdi bean是cdi可以自动实例化,管理和注入以满足其他对象的依赖关系的类。几乎所有java类都可以由cdi管理和注入。