基本的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. 修改Linux系统的默认语言编码集

    RedHat 今天晚上发现服务器上vi的界面提示变成了乱码,只能将XShell的编码改为GBK才能正常显示,导致consolas字体无法使用,GBK编码下的字体丑陋无比,无法忍受,一轮google之后 ...

  2. murmur3 hash(hash算法)

    HashUtil.java package com.example.test.util; import com.google.common.base.Charsets; import com.goog ...

  3. HCNA Routing&Switching之地址转换技术NAT

    前文我们了解了包过滤工具ACL相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15156308.html:今天我们来聊一聊地址转换技术NAT相关话题: ...

  4. Bootstrap 使用小记

    1,使用Bootstrap做页面布局,使用card容器 <div class="card"> <div class="card-header" ...

  5. nvcatmysql安装注册流程以及远程登陆配置步骤

    前言:网络上下载工具良莠不齐,找到合适的比较困难.因为nvcat回收了网络上的大部分注册码,这个nvcatformysql下载到可以破解的费了点时间,最后经过配置成功远程登陆到mysql,在此记录一下 ...

  6. 【网络编程】TCPIP-8-套接字的多种选项

    目录 前言 8. 套接字的多种选项 8.1 API getsockopt(); & setsockopt(); 8.2 套接字选项 8.3 缓冲区相关可选项 8.4 端口复用 8.4.1 ti ...

  7. .net core 通过动软连接数据库

    .net core 与动软 首先创建asp.net core 或者 .net core 控制台程序.不需急着创建web.config 文件. 通过NuGet加个ado的包 System.Data.Sq ...

  8. MongoDB 数据库创建删除、表(集合) 创建删除、数据增删改查

    使用数据库.创建数据库 use student 如果真的想把这个数据库创建成功,那么必须插入一个数据. 数据库中不能直接插入数据,只能往集合(collections)中插入数据.不需要专门创建集合,只 ...

  9. 3、二进制安装K8s之部署kube-apiserver

    二进制安装K8s之部署kube-apiserver 一.生成 kube-apiserver 证书 1.自签证书颁发机构(CA) cat > ca-config.json <<EOF ...

  10. ElasticSearch之配置文件详解

    ################################### Cluster ################################### #定义集群名称,默认是elasticse ...