简介(DI / CDI基础)

首先,我认为对此会有一些困惑,但事实是,它们是相同的–不同之处在于用法及其用途。

DI(依赖注入)是通用术语–该功能基本上是在任何应用程序上进行Bean发现和Bean连接过程的功能。 它不仅可以在应用程序中使用它,还可以在单​​元测试和模拟中使用它。 当然,那里有很多DI框架,包括:Guice,Seam,Spring(Seam和Spring扩展了DI方案,并建立了自己的框架),EJB 3.x和CDI本身。

另一方面,CDI结合了所有这些技术,并向组件引入了生命周期–这使得DI技术得以统一,从而使新功能的开发变得直截了当且可行。 您可以将Seams生命周期映射与以JPA作为其持久层的Spring MVC结合在一起-这些技术都是单独创建的,但都与CDI结合使用,应用程序开发人员可以将它们结合在一起以创建和开发JEE应用程序。

我将需要分解主题,因为我肯定会在这里用单词和字母让每个人感到无聊,所以:

  1. DI / CDI基础
  2. 基本注射
  3. 资格赛,范围
  4. DI / CDI高级

我将为每个人创建单独的帖子!

让我们开始!

SPI(服务编程接口)

它还具有所谓的SPI-显然是与API一起提供的功能集,但完全具有不同的用途。

  • API是您为实现目标而调用并使用的类/接口/方法/…的描述。
  • SPI是您为实现目标而扩展和实现的类/接口/方法/…的描述。

使用SPI,您实际上可以扩展JEE6以创建自己的不同框架,从而展示可移植性和可扩展性。 ( 但我稍后会介绍 )。

为什么选择CEE for JEE6?

CDI已经出现在JEE5(J2EE)中,并取得了巨大的成功。 它的方法使很多新开发受益,最终简化了整个开发过程。 在JEE6中改进CDI的几个原因。

  • JEE5确实支持资源注入,但是它仍然缺乏通用的依赖关系–它仅支持@ EJB,@ PersistenceContext,@ PersistenceUnit,@ Resources)–当然,除了Spring引入了用于管理bean生命周期的不同注释外
  • 非基于类型的注入(弱)–字符串名称和XML注入确实很脆弱。 改进基于类型的注入通常可以实现更好的工具。

术语

CDI –上下文和依赖注入

焊接

  • JSR 299参考实现–参考实现是用于扩展JSR特定实现的SPI。
  • 为Servlet容器提供扩展的CDI支持。
  • 扩展编写器的CDI增强功能。
  • CDI和Java EE的Maven原型(我喜欢maven!)。

CDI主题:松耦合和强类型

松散耦合仅表示对象与使用或当前使用的对象在松散地独立。 CDI引入了用于解耦的新功能,例如限定符 ,增强了拦截器修饰器 ,消息生成器使用者及其底层事件机制。 将深入探讨有关CDI高级主题的每个示例。

强大的输入 -只是意味着通过让容器创建特定的名称并将其映射到对象来严格声明bean。 这样就不需要对字符串进行基于字符串的命名,几乎不需要铸造,因为铸造是由容器完成的(利用限定符)。

豆(什么?)

从技术上讲,您拥有多种形式的Bean:JSF Bean,EJB Bean,Spring,Seam,Guice CDI,实体Bean等,但最终,Bean只是具有特殊定义的POJO(由Managed Bean 1.0定义) – Java EE6中制定的规范。 这意味着任何POJO都可以是任何类型的bean,只要它符合规范标准即可–从而进一步简化了声明和开发过程。 容器负责管理POJO,并通过提供/引入常见的基本服务来增加对它的支持,例如:

  • 生命周期管理(@ PostConstruct,@ PreDestory)
  • 注入资源(@Resource)
  • 拦截器(@ Interceptors,@ ArounInvoke)
@javax.annotation.ManagedBean
public class MyPojo {@Resource   // Resource injection
private Datasource ds;@PostConstruct  // Life-cycle
private void init() {....
}
@Interceptors(LoggingInterceptor.class)public void myMethod() {...}
}

考虑到这一点, EJBRESTCDI bean呢?

  • EJB bean服务–托管bean,具有公共服务(上述)并支持事务,安全性,线程安全性和持久性。
  • REST bean服务–具有HTTP支持的托管bean
  • CDI bean –具有生命周期的托管bean支持:
    • 自动发现

确切地说,Manage Bean最终是针对特定用途而扩展的SPI。 EJB,Rest,实体Bean都是托管Bean,但是容器提供了其他服务。 因此,如果您使用@Stateless或@Stateful批注定义POJO,则容器会自动检测到它是EJB bean,并且需要特定于容器的支持,例如事务,安全性,线程安全性,扩展等。

package mypackage;
import javax.ejb.Stateless;@Stateless
public class GreetingBean {public String greet(String name){return "Hello " + name;}
}

一个简单的POJO类就用一个手指(实际上是敲入)就变成了一个Stateless bean,从而产生了一个@Stateless代码。 与先验3.x上定义EJB的方式不同(这很痛苦)。

从此处下载示例(以上): 单击我

自动Bean发现

CDI容器是负责如何发现Bean的容器,但是它是如何做到的?

  1. 它首先扫描包含应用程序和容器档案的类路径。

    1. 它尝试扫描类路径,并查看标记为发现的POJO(即托管Bean)。 您可以考虑将其放入一个池中,并且当另一个Managed Bean通过注入对其进行调用时可以随时使用(有关下一个博客主题的更多信息)
  2. 然后,它检测到bean.xml(或任何上下文xml文件定义)的存在。
    1. 对于Spring爱好者来说,这很像一个applicationContext.xml(至少是约定,但很松散)–您将XML传递到contextConfiguration侦听器(直通参数)上,Spring CDI Container会自动在其中标记对象(beans)以便发现–当然,您需要定义扫描机制(组件扫描)。

最终,引入DI / CDI是为了简化开发过程,统一技术以及整体以产生更强大,可扩展的应用程序。 让所有容器按照标记Bean的公共服务的方式工作,这使开发人员的任务更加轻松,而且比避免以前的框架导致的陷阱更重要。 SPI –实际上是改进的定义,它允许实际的JEE6框架可扩展,从而创造了更加动态的特性–业务应用程序架构师现在可以设计自己的框架和约定。 为自己的规则放置更多特定于业务的设计或注释,并提供企业应用程序始终需要的健壮性和灵活性。

下一主题: 基本进样 –我不想将所有内容放到一个帖子中,因此我将让您先吸收它并检查我创建的样本。 从现在开始,我将详细介绍DI和CDI的示例。

参考: DI / CDI – JCG合作伙伴 Alvin Reyes在Alvin“ Jay” Reyes博客博客上的基础知识 。

翻译自: https://www.javacodegeeks.com/2013/08/di-cdi-basics.html

DI / CDI –基础相关推荐

  1. php cdi_DI / CDI –基础

    php cdi 简介(DI / CDI基础) 首先,我认为对此会有一些困惑,但事实是,它们是相同的–不同之处在于用法及其用途. DI(依赖项注入)是一个通用术语–此功能基本上是在任何应用程序上进行Be ...

  2. cdi name 日志_DI / CDI –基础

    cdi name 日志 简介(DI / CDI基础) 首先,我认为对此会有一些困惑,但事实是,它们是相同的–不同之处在于用法及其用途. DI(依赖注入)是通用术语–该功能基本上是在任何应用程序上进行B ...

  3. 手写实现Spring(IOC、DI),SpringMVC基础功能

    手写实现Spring(IOC.DI),SpringMVC功能 spring和springMVC的用法相信大家都不陌生,我简单讲下我实现的思路 spring阶段 事项 配置 配置web.xml: ini ...

  4. sql 注射_基本注射/资格赛,范围

    sql 注射 这是上周解决的DI / CDI基础知识的延续-在本文中,我将讨论基础注入,限定词和范围. 在上一个主题中,我们提供了有关DI / CDI概念的大量信息,我们还讨论了如何使用注释加载这些b ...

  5. 基本注射/资格赛,范围

    这是上周解决的DI / CDI基础知识的延续-在本文中,我将讨论基础注入,限定词和范围. 在上一个主题中,我们提供了有关DI / CDI概念的大量信息,我们还讨论了如何使用注释加载这些bean或类-这 ...

  6. FFT快速傅里叶变换 超详细的入门学习总结

    FFT快速傅里叶变换 说明 本文创作的目的是为自己巩固该算法,加深印象并深入理解,同时也为FFT入门学者提供一份可鉴的学习总结. 原文链接:https://blog.csdn.net/qq_39565 ...

  7. [转贴]改好DEBUG七处缺点的comexe实现报告

    改好DEBUG七处缺点的comexe实现报告 首先声明,本文所指DEBUG,系DOS 6.22,win 98及2k三者DEBUG.EXE. (1) DEBUG命令T及P的2处缺点 跟踪命令T,建立在8 ...

  8. 改好DEBUG七处缺点的comexe实现报告

    首先声明,本文所指DEBUG,系DOS 6.22,win 98及2k三者DEBUG.EXE. (1) DEBUG命令T及P的2处缺点 跟踪命令T,建立在8086标志寄存器第8位(自陷位)置1后,处理器 ...

  9. Python程序设计快速入门01

    Python程序设计入门到考试(Day01) 全系列共计6天,十二章.仅作基础入门到期末考试-- 第1章 Python语言概述 1.python的起源 Python由荷兰数学和计算机科学研究学会的[G ...

最新文章

  1. python在财务方面的应用-利用python开发财务工具
  2. PAT甲级1012 The Best Rank :[C++题解]4个成绩取排名最低:排序、二分(好题)
  3. php 得到 ts文件,获取TypeScript声明文件.d.ts步骤详解
  4. linux命令之创建符号连接-ln
  5. PMCAFF公选了最美咖友,结果却是……
  6. 目前最常用的计算机机箱类型为_服务器按照结构划分有几种类型
  7. 【Python】IDLE工具
  8. 【To Do!】程序员面试金典——11.8维护x的秩
  9. mongoDB的配置以及运行
  10. 百度运维部为一间房小学建立公益图书馆
  11. 计算两经纬度坐标间的距离
  12. abaqus更改计算机名,ABAQUS 2016 安装教程
  13. Webstorm返回上一步操作快捷键 格式化代码快捷键
  14. 一步一步搭建自己的web系统(一):搭建后端服务
  15. 蓝牙音箱电路板原理图_一种蓝牙音箱电路板的制作方法
  16. 一分钟建立自己单位的故障报修平台
  17. pandas数据分析之数据重塑透视(stack、unstack、melt、pivot)
  18. IDEA鼠标悬停显示注释
  19. obs无法录屏或无法保存视频的解决方法
  20. PS(PhotoShop)替换纯色图片的颜色

热门文章

  1. vmware启动多个虚拟机
  2. 韩文博 php,No releases available for package pear.php.net/HTTP_Upload
  3. java本地连接zk集群
  4. jakarta ee_Jakarta EE的拟议命名空间
  5. jaxb注解使用_使用JAXB时
  6. kafka streams_Kafka REST Proxy MapR Streams入门
  7. Selenium 4相对定位器如何改变您的测试方式?
  8. q7goodies事例_Java 8 Friday Goodies:SQL ResultSet流
  9. 将Spring Boot应用程序与Amazon Cognito集成
  10. JAX-RS和OpenAPI对Hypermedia API的支持:任重而道远