CDI Features inJavaEE 的上下文和依赖注入
基本的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 的上下文和依赖注入的更多相关文章
- CDI Features
概述 如果说EJB,JPA是之前JEE(JEE5及JEE5之前)中里程碑式的规范,那么在JEE6,JEE7中CDI可以与之媲美,CDI(Contexts and Dependency Injectio ...
- ASP.NET Core中如影随形的”依赖注入”[上]: 从两个不同的ServiceProvider说起
我们一致在说 ASP.NET Core广泛地使用到了依赖注入,通过前面两个系列的介绍,相信读者朋友已经体会到了这一点.由于前面两章已经涵盖了依赖注入在管道构建过程中以及管道在处理请求过程的应用,但是内 ...
- 开涛spring3(12.2) - 零配置 之 12.2 注解实现Bean依赖注入
12.2 注解实现Bean依赖注入 12.2.1 概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的 ...
- Unity文档阅读 第三章 依赖注入与Unity
Introduction 简介In previous chapters, you saw some of the reasons to use dependency injection and lea ...
- EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下?
前言 这个问题从未遇见过,是一位前辈问我EF Core内存泄漏问题时我才去深入探讨这个问题,刚开始我比较惊讶,居然还有这种问题,然后就有了本文,直接拿前辈的示例代码并稍加修改成就了此文,希望对在自学E ...
- Asp.NetCore依赖注入和管道方式的异常处理及日志记录
前言 在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平:本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog ...
- CDI Features(EL(SPEL),Decorator,Interceptor,Producer)
一.EL(SPEL) EL 1.概述:EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作.EL在得到某个数据时,会自动进行数据类型 ...
- 注解实现Bean依赖注入
12.2.1 概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的数据将覆盖基于注解配置中的依赖注入的数 ...
- 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 ...
随机推荐
- 探讨UE4中的UBT和UHT
前言 UBT和UHT是编译工具,谁定义的呢,虚幻引擎自己定义的,拿来做什么呢,UBT和UHT是UE4用来简化多平台编译,去除用户自定义平台编译项目的操作 我们写的UE4代码不是标准的C++代码,是基于 ...
- 博客CSS样式 二
预览 可自行更改颜色 背景图 页面定制 CSS 代码中加入: url为背景图地址,可下载心仪背景图后上传到博客园相册后获取地址 body { color: #000; background: url( ...
- miniFTP项目集合
项目简介 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务进 ...
- 备战秋招之十大排序——O(nlogn)级排序算法
时间复杂度O(nlogn)级排序算法 五.希尔排序 首批将时间复杂度降到 O(n^2) 以下的算法之一.虽然原始的希尔排序最坏时间复杂度仍然是O(n^2),但经过优化的希尔排序可以达到 O(n^{1. ...
- idea打断点后发现被标记的断点处那一行整行被标记了其他颜色,前面没有断点标识的红点
问题如下: 最后发现有两种解决办法吧,直接走起! 第一种方法: 在View====>Active Editor====>Show Gutter Icons,勾选此选项,发现小红点出来了: ...
- c# 对 struct为什么不能继承类和结构的思考
1.类.结构在使用的时候可以不调用构造函数,如果能够继承类,这种情况下不能够初始化基类,因为不执行构造函数 2.结构.所有的结构类型都默认是 sealed,通过 反汇编可以看到 ,这就阻止了结构被继 ...
- ArcGIS Engine中实现ArcMap的捕捉效果
注意要将捕捉相关接口的对象放在OnCreate方法中,这样在初始化就可以有捕捉效果,(捕捉对象赋值放在OnClick中出现第一次点击之前不能捕捉的BUG) 这里是直接在工具中实现的 ,可以按需求将捕捉 ...
- 测试工具Wiremock介绍
WireMock是一个开源的测试工具,支持HTTP响应存根.请求验证.代理/拦截.记录和回放.最直接的用法: 为Web/移动应用构建Mock Service 快速创建Web API原型 模拟Web S ...
- JDBC中级篇(MYSQL)——在JDBC中如何获得表中的,自增长的字段值
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package c_increment; import java.sql.Connection; import java.sql.P ...
- 【C语言】第1章 程序设计与C语言
第1章 程序设计与C语言 程序:一组计算机能识别和执行的 指令. 计算机语言:人和计算机交流信息的.计算机和人都能识别的语言 C语言允许用两种注释方式: //:单行注释 可单独占一行 可出现在一行中其 ...