DI / CDI –基础

简介(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

引导界面图标好大_游戏里那些图标和界面,原来是这么设计出来的?

UI设计最硬核的思维 就是功能微信现在在做一种全面连接的功能,而游戏需要实现的是人机互动的功能。实现并完善功能,是互联网、游戏、网站、渴望UI人才的根本原因。如果说有电脑的世界是一片很大的面,那么可视化的操作,都是UI设计师…

爬格子呀9.17(图论)

刘汝佳的紫书差不多就告一段落吧,我觉得可以了,怎么说呢,这书也陪着自己走了一年多了吧,也目睹了从一个啥也不会的萌新到一个稍微会一点的萌新的转变。 差不多开始下本书吧,自己也大三了,时间真的有点紧啊w…

一个vue加egg.js的博客

之前自己的博客是用hexo做的,后面想做一个有后台的博客就打算用vue加node来试试,于是就有了这个博客。 项目地址 W-Blog W-Blog是一个基于vue和node的小小小博客 前端用vue,后端用egg.js 快速入门 技术栈 前端: 用户端&#…

js判断处理undefined类型的数据

code: resFlag response.result.data.result; /查询客户为白名单用户时,将"*该企业已被列入黑名单"标记清除 if(typeof resFlag "undefined"){$("#companynameisblack").text(""); }转载于:https://www.cnblogs.com/YLQBL/p/8819696…

批处理写入以及动态与参数化SQL,数据库的性能如何?

批处理写入是最有效的数据库优化之一。 批处理写入受大多数现代数据库和JDBC标准的一部分支持,并且受大多数JPA提供程序支持。 普通数据库访问包括在单独的数据库/网络访问中将每个DML(插入,更新,删除)语句发送到数据…

android音量图标不见了,电脑声音图标不见了如何解决?

最近有电脑用户反映,看视频时觉得声音太小了,要调大点声,却发现任务栏上的声音图标不见了,想调个声音都难。那么,电脑声音图标不见了如何解决呢?我们一起往下看看。方法步骤一、XP系统下找回任务栏上的声音图标1、重启…

认识iOS系统架构

关于本文: 文章主要介绍iOS系统架构中的四层结构的内容、常用的框架、大致的功能,然后对iOS开发人员的发展提出自己的一些拙见。 一、iOS系统是基于UNIX系统,所有从系统稳定性上来说的确比其他操作系统的产品要好。 iOS在系统架构上分为4层&a…

r语言赋值为na_r语言将空白格替换成NA

有数据集类似user_id qid1371 000013046dc0ab29ef8773eb61aba623 02 0000cfcadfa43ef824669405081165b13 0006ee1acc5321260ba0fbff1fb8f6494 00083f7b8c6170a3fc976d7b99245259 …

Java泛型教程–示例类,接口,方法,通配符等

泛型是Java编程的核心功能之一,它是Java 5中引入的。如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它。 在集合类中使用泛型非常容易,但是它提供了比仅创建集合类型更多的功能,我们将在本文中…

html5中音乐播放器怎么写,打造属于自己的音乐播放器 HTML5之audio标签

我的音乐播放器HTML5中增加了Audio和Video标签,这两个标签的用法非常相似。功能却是相当强大,我们先来看一下Audio标签各个浏览器的支持情况。这里用的依然是Can I Use这个在线网站,相信学习前端的同学应该都不陌生。Can I Use我们可以看到&a…

初识react(四) react中异步解决方案之 redux-saga

回顾 初识react(一) 揭开jsx语法和虚拟DOM面纱初识react(二) 实现一个简版的html redux.js的demo初识react(三)在 react中使用redux来实现简版计数器初识react(四) react中异步解决方案之 redux-saga初识react(五) 数据流终极解决方案 dva(零配置) 今天demo是实现一个异步的计…

C# WinFrom 关于MDI

dev是一个牛B 到没边的控件 我们正常用winform做个原始mdi窗体 一点都不好看 但 用的dev只需要一个控件 就可让显示舒服多了 建一个项目 上边放一个 xtraTabbedMdiManager1 一个button1 button1.click如下: Form frm new Form(); frm.MdiParent this; frm.Text &…

Jfinal 文件上传

JFinal上传文件 uploadify 可以在http://www.uploadify.com/ 下载。 在原项目的基础上。 uploadify使用&#xff1a; <input id"file_upload_1" name"file_upload" type"file" multiple"true"> /** param uploader 文件上传方法…

轻量级的开源集成:Apache Camel还是Spring集成?

首先&#xff0c;为全面披露信息&#xff0c;在过去的1.5年中&#xff0c; 我一直担任 FuseSource&#xff08;现为Red Hat&#xff09; 的顾问&#xff0c;为零售&#xff0c;运输&#xff0c;银行/金融等不同行业的大型和小型公司提供SOA和集成项目支持。我的专长是使用该领域…

blue html中转换,Vue/Vue中Html和Markdown互相转换/README.md · bluemoon/LearningNotes - Gitee.com...

# Vue中Html和Markdown互相转换## 前言最近想实现的一个功能&#xff0c;就是将系统中的博客进行导出成Markdown格式&#xff0c;后面经过了调研发现有两种方法能够满足需求&#xff0c;一个是Java后台中将HTML转换成Markdown&#xff0c; 然后导出。第二种方式是在客户端将Htm…

WePY:在质疑中前进 | 文末福利

WePY 作者介绍 Q: 先介绍一下自己吧~ Gcaufy: 我 2011 年大学毕业之后&#xff0c;阴错阳差的走上了 Web 开发的道路。15 年之前算是自由职业 SOHO 工作&#xff0c;主要给一些国外的大公司做外包系统&#xff0c;更多的是做后端开发。15 年之后以前端工程师的身份加入腾讯&a…

表单必填标星_怎么用JS做form表单验证,要详细代码,求救!(带星号的是必填项)...

匿名用户1级2014-06-17 回答举个例子吧&#xff1a;<input type”text” id”telephone” ><input type“button” οnclick“functioncheck1”value“检测”>如果要检测它是否符合标准&#xff0c;那我就会在页面中导入js包然后写一个<script> f…

MySQL/MariaDB表表达式(3):视图

视图是表表达式的一种&#xff0c;所以它也是虚拟表。对视图操作的时候会通过语句动态的从表中临时获取数据。 1.创建、修改视图 CREATE [OR REPLACE][ALGORITHM {UNDEFINED | MERGE | TEMPTABLE}]VIEW [IF NOT EXISTS] view_name [(column_list)]AS select_statement[WITH [C…

使用Arquillian(包括JPA,EJB,Bean验证和CDI)测试Java EE 6

很长时间以来&#xff0c;我听到很多人对Arquillian说好话 。 虽然我一直在阅读有关其用法的文章&#xff0c;但实际上我无法在一篇文章中找到涵盖我认为重要的某些方面的文章。 当然&#xff0c;我看起来还不够努力。 我要讲的要点是&#xff1a; 使用JPA。 我只是在这里使用…

xpath和css selector

参考&#xff1a;https://www.cnblogs.com/captainmeng/p/7852044.html css selector解释&#xff1a;https://www.cnblogs.com/feng0815/p/8367672.html 转载于:https://www.cnblogs.com/Mezhou/p/9671284.html