上下文和依赖注入(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管理和注入。

最新文章

  1. 【经验之谈】Git使用之Windows环境下配置
  2. Linux:Ubuntu16.04下创建Wifi热点
  3. 2017年1月4日-linux学习
  4. ehcache2拾遗之write和load
  5. Core Data 概述
  6. scala言语基础学习
  7. python学习应用笔记(一)
  8. NopCommerce架构分析之八------多语言
  9. 虚拟主机导入MySQL出现Unknown character set: ‘utf8mb4’
  10. 2.10linux学习(2)
  11. linux下串口函数
  12. 基于redis的分布式锁(转)
  13. 纯CSS+HTML实现checkbox的思路与实例
  14. 修改/dev/shm大小 tmps
  15. ReentrantLock synchronized
  16. reCaptcha for ASP.NET
  17. Cass环境下光标无显示
  18. [Laravel] mac下通过 homestead 搭建环境 到运行项目
  19. docker微服务部署之:二、搭建文章微服务项目
  20. 12个值得关注的顶级可视化JS库 涉及图表、动画、时间处理,表格操作

热门文章

  1. 第三方jar包上传私服和项目使用
  2. 使用aspx 直接生成excel
  3. Git随笔 -- 初始化远程仓库
  4. jsp页面在Android系统和ISO系统的兼容性问题
  5. Derivative of Softmax Loss Function
  6. sonarqube安装部署
  7. standby_file_management参数为MANUAL导致添加数据文件错误
  8. radhat6.6上安装oracle12c RAC (三)
  9. opencv学习之路(41)、人脸识别
  10. Windows环境下最新OpenCV和Contribute代码的联合编译【20180926更新红字】