基本的CDI的功能:

  • 类型安全:CDI使用Java类型来解析注入,而不是通过(字符串)名称注入对象。当类型不足时, 可以使用限定符 注释。这允许编译器轻松检测错误,并提供简单的重构。
  • POJO:几乎每个Java对象都可以由CDI注入!这包括EJB,JNDI资源,持久性单元和持久性上下文,以及之前由工厂方法创建的任何对象。
  • 可扩展性:每个CDI容器都可以通过使用便携式“扩展”来增强其功能。属性“portable”意味着无论哪个供应商,这些CDI Extensions都可以在每个CDI容器和Java EE 6服务器上运行。这是通过一个明确指定的SPI(服务提供者接口)实现的,该接口是JSR-299规范的一部
  • 分。
  • 拦截器:编写自己的拦截器从未如此简单。由于JSR-299的可移植性,它们现在也可以在每个经过EE 6认证的服务器和所有独立CDI容器上运行。
  • 装饰器:这些允许动态扩展现有的接口实现与业务方面。
  • 事件:CDI指定一种类型安全机制,用于发送和接收具有松散耦合的事件。
  • 统一EL集成:EL-2.2在灵活性和功能方面开辟了新的视野。CDI为它提供开箱即用的支持!

CDI的基本机制

依赖注入:DI有时被称为“好莱坞原则” - “不要打电话给我们,我们称之为你”。这意味着我们让容器管理实例的创建并注入它,而不是使用new运算符自己创建它们。当然,即使在DI容器中,没有任何人触发这个过程也没有任何反应。对于JSR-299容器,此触发器是对其中一个方法的调用。

T BeanManager#getReference(Bean<T> type, Qualifier... qualifiers);

返回给定类型T的实例。通过这样做,它不仅会 以递归方式创建返回的实例,还会创建所有@Inject-注释的子节点

通常, getReference(Bean <T>) 方法不是手动调用,而是由Expression Language Resolver在内部调用。写点东西

<h:inputText value="#{mailForm.text}"/>

ELResolver将查找名为“mailForm” 的Bean <T>并解析该实例。

范围,上下文,单例:每个CDI容器的管理对象都是Ward Cunningham指定的原始意义上的“单例”,他不仅发明了Wiki,而且还与Kent Beck一起发明了1987年的计算机科学设计模式。

在这种意义上,“单身人士”意味着在指定良好的环境中只有一个实例。在Joshua Kerievsky对“重构模式”的评论中,Ward指出:

每个计算都有适当的上下文。面向对象编程的大部分内容都是关于建立上下文,关于平衡变量生命周期,使它们生活在合适的时间长度然后优雅地死亡。

CDI就是在一个明确的环境中创建单身人士。在我们的例子中,实例的生命周期由它们的范围定义。一个@ SessionScoped-注解豆每会话存在一次。

我们也可以将它命名为“会话单身人士”。如果用户 第一次访问我们的@SessionScoped bean,它将被创建并存储在会话中。每个后续访问都将返回完全相同的实例。会话结束时,存储在其中的所有CDI管理的实例也将被正确销毁。

如果我们有一个 @RequestScoped bean,我们可以称之为'request singleton',@ ConversationScoped bean是'conversation singleton'等。

Terminus'Managed Bean'

CDI规范中使用了一些术语,需要简短说明。Java中的术语“Bean”已经非常成熟,意味着带有getter和setter的POJO(Plain Old Java Object)。终端技术'Managed Bean'现在意味着完全不同的东西。它不是指类的实例,而是指可用于创建这些实例的元信息。它由接口 Bean <T>表示 ,将通过类路径扫描在容器启动时收集。

终点'上下文实例'

上下文实例正是我们每个范围的单例实例,我们的'会话单例','请求单例'等。通常用户从不直接使用上下文实例,而只是通过其'上下文参考'

终端'上下文引用'

默认情况下,CDI容器通过代理包装所有上下文实例,并仅注入代理而不是实例。在CDI规范中,这些代理称为“上下文引用”。CDI默认使用代理的原因有很多:

  • 序列化:我们只需序列化代理,而不是序列化整个对象。在反序列化时,它将再次自动“连接”到正确的上下文实例。
  • 范围差异:使用代理,可以将 @SessionScoped UserSettings 注入 @ApplicationScoped MailService, 因为代理将“连接”到正确的UserSettings本身。
  • 拦截器和装饰器:代理是以非侵入方式实现拦截器和装饰器的完美方式。

CDI容器的生命周期

让我们看一个简单的场景,在一个普通的Servlet引擎(如Apache Tomcat)中有一个CDI容器。如果WebApplication 启动, ServletFilter 将自动启动您的CDI容器,该容器将首先注册 ClassPath 上可用的所有CDI-Extensions ,然后从类扫描开始。 将扫描具有META-INF / beans.xml的所有ClassPath 条目, 并且将解析所有类并将其作为“Managed Bean”(接口Bean <T> )元信息存储在CDI容器内。在启动时扫描此信息的原因是:首先。及早发现错误,在运行时大大提高性能。

为了能够正确处理所有CDI作用域,CDI容器只使用标准的Servlet回调,如 ServletRequestListener 和HttpSessionListener

CDI Features inJavaEE 的上下文和依赖注入的更多相关文章

  1. CDI Features

    概述 如果说EJB,JPA是之前JEE(JEE5及JEE5之前)中里程碑式的规范,那么在JEE6,JEE7中CDI可以与之媲美,CDI(Contexts and Dependency Injectio ...

  2. ASP.NET Core中如影随形的”依赖注入”[上]: 从两个不同的ServiceProvider说起

    我们一致在说 ASP.NET Core广泛地使用到了依赖注入,通过前面两个系列的介绍,相信读者朋友已经体会到了这一点.由于前面两章已经涵盖了依赖注入在管道构建过程中以及管道在处理请求过程的应用,但是内 ...

  3. 开涛spring3(12.2) - 零配置 之 12.2 注解实现Bean依赖注入

    12.2  注解实现Bean依赖注入 12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的 ...

  4. Unity文档阅读 第三章 依赖注入与Unity

    Introduction 简介In previous chapters, you saw some of the reasons to use dependency injection and lea ...

  5. EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下?

    前言 这个问题从未遇见过,是一位前辈问我EF Core内存泄漏问题时我才去深入探讨这个问题,刚开始我比较惊讶,居然还有这种问题,然后就有了本文,直接拿前辈的示例代码并稍加修改成就了此文,希望对在自学E ...

  6. Asp.NetCore依赖注入和管道方式的异常处理及日志记录

    前言     在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平:本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog ...

  7. CDI Features(EL(SPEL),Decorator,Interceptor,Producer)

    一.EL(SPEL) EL 1.概述:EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作.EL在得到某个数据时,会自动进行数据类型 ...

  8. 注解实现Bean依赖注入

    12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的数据将覆盖基于注解配置中的依赖注入的数 ...

  9. ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    ExpandoObject与DynamicObject的使用   using ImpromptuInterface; using System; using System.Dynamic; names ...

随机推荐

  1. 用expect做自动运行脚本

    下面的脚本演示了在Ubuntu上安装expect,写一个切换用户的expect脚本,并运行脚本看到效果的过程. root@guserver:~# apt-get install expect godu ...

  2. iNeuOS工业互联平台,聚合和变化率计算、设备IO和通讯状态、组态快捷键、创建文件夹、选择应用图标等,发布:v3.6版本

    目       录 1.      概述... 2 2.      平台演示... 2 3.      聚合和变化率计算... 2 4.      设备IO和通讯状态监测... 3 5.      组 ...

  3. NOIP 模拟 $33\; \rm Defence$

    题解 \(by\;zj\varphi\) 题意就是维护 \(\rm max\{01mx,01l+01r\}\) 就是最长连续的一段 \(0\),左右 \(0\) 区间的加和. 可以启发式合并,也可以直 ...

  4. NOIP 模拟 $17\; \rm 世界线$

    题解 \(by\;zj\varphi\) 此题经简单观察可发现,一个点的贡献就是这个点所能到的点减去它的出度 那么我们就可以暴力搜索,但是显然会超时,所以我们可以使用一个黑科技 \(\rm bitse ...

  5. "image watch" for QtCreator

    Image Watch Image Watch 是Visual Studio的一个插件,用来在C++ 调试时显示内存中的位图图像.可以直观的看到图像的变化而不用添加额外的显示代码.其内建了对OpenC ...

  6. C# WPF 后台调整怎样使用代码把指定控件的Z序调整到最前面呢?

    Panel.SetZIndex(rectangle1, 2); //把前台名称为rectangle1的矩形的ZIndex设置为2

  7. WPF日积月累之DataGrid样式以及操作数据模板中的控件

    一.效果图 二.代码预览 1 <Window x:Class="Test.MainWindow" 2 xmlns="http://schemas.microsoft ...

  8. 有限次数的Undo&Redo的C#实现

    为了实现Undo和Redo,必须要在程序中保存起程序的运行状态,从而能够在Undo时跳转到前一个状态和在Redo时跳转到下一个状态.为了实现状态的维护,我采用了两个栈来分别保存Undo操作的状态和Re ...

  9. golang 模板 html/template与text/template

    html模板生成: html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用t ...

  10. Python之psutil-进程管理

    在给PC端应用做自动化测试或者监测应用性能时,不可避免的会与进程管理打交道,python中的psutil模块能够帮助我们处理进程,它主要用于系统监视.分析和限制进程资源以及管理正在运行的进程.一起来了 ...