php cdi_DI / CDI –基础

php 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标记-即Managed 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 – Alvin“ Jay” Reyes博客博客上的JCG合作伙伴 Alvin Reyes的基础知识 。

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

php cdi

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

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

相关文章

一条一条来,MySQL变量、流程控制与游标,完整详细可收藏

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) 文章目录1. 变量2. 定义条件与处理程序3. 流程控制4. 游标MyS…

ajax渲染后的点击事件,在ajax调用后渲染“喜欢”按钮

有几个问题类似于我的堆栈,但没有一个回答我的问题,所以…ajax调用返回用于创建类似按钮的标准HTML代码:当使用’inspect element’查看时,这个html确实显示在源中,但没有呈现,即按钮应该是空白的空格。有没…

无服务器:SLAppForge Sigma入门

! Cmere。 寻找某事? 无服务器,是吗? 在上面。 进入海峡,在“ Sigma”标志处右转。 (嗯,还不要怪我们;至少我们认为这很容易!) 我们的梦想目标之一是与S…

pks系统如何添加服务器,pks服务器的上电步骤.pdf

PKS 服务器的上电步骤一、服务器的安装与设置服务器为 DELL PowerEdge 2900 ,配置为内存 2GB (2x1GB), 667MHz, ECC,Single-Rank ,CPU 为 Quad-Core Intel Xeon Pro E5405 2GHz, 12MB Cache,1333MHz FSB ,硬盘 2 个: 146GB, 3.5&q…

自动,MySQL触发器,完整详细可收藏

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) 文章目录1. 触发器概述2. 触发器的创建3. 查看、删除触发器4.…

统计信号处理基础 - 估计与检测理论 估计部分习题3.7公式推导

统计信号处理基础 - 估计与检测理论 估计部分习题3.7公式推导题目证明结论得证题目 相信学习信号检测与估计的童鞋们肯定看到过Steven M.Kay大牛的书,非常厚的一本,不得不说,人家的书就是写得好,浅显易懂(当然是要从头…

ajax表格内容加按钮,单击按钮时,如何触发jquery数据表fnServerData通过AJAX更新表?...

我正在将datatables插件与服务器端数据一起使用,并使用AJAX更新表。我的dataTables设置如下所示:tblOrders parameters.table.dataTable( {"sDom": t,"sAjaxSource": "../file.cfc","bServerSide": true,"…

统计1到N的整数中,除了1和自身之外,至少还能被两个数整除的数的个数Java开方平方根

使用开方是重点。 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int N scanner.nextInt(); //输入Nint count 0;for (int i 1; i < N; i) { //统计1-N中符合条件的if (fun(i)){count…

机器学习大作业《Kaggle赛题之Kannada MNIST研究》论文和Python代码

一、赛题概述及分析 1、背景介绍 邮政系统每天都会处理大量的信件&#xff0c;最为要紧的一环是要根据信件上的收信人邮编进行识别和分类&#xff0c;以便确定信件的投送地。原本这项任务是依靠大量的人工来进行&#xff0c;后来人们尝试让计算机来替代人工。然而&#xff0c…

neo4j图形界面_图形处理:betweeness中心性– neo4j的密码与graphstream

neo4j图形界面上周&#xff0c; 我写了关于中间性中心算法以及我尝试使用graphstream 理解它的尝试 &#xff0c;在阅读源代码的同时&#xff0c;我意识到我可以使用neo4j的所有最短路径算法将某些东西放在一起。 概括地说&#xff0c;中间性中心度算法用于确定图中节点的负载…

打开服务器文件提示内存不够,打开服务器文件提示内存不够

打开服务器文件提示内存不够 内容精选换一换本节操作指导您完成Windows操作系统云服务器磁盘空间清理。弹性云服务器匀出一部分磁盘空间来充当内存使用&#xff0c;当内存耗尽时&#xff0c;云服务器可以使用虚拟内存来缓解内存的紧张。但当内存使用率已经非常高时&#xff0c;…

【自适应(盲)均衡1】LMMSE、Godard、CMA常模、Sato等算法在信道均衡中的应用理论与MATLAB仿真(代码见CSDN同名资源)

1.实验背景 考虑如图所示的基带等效数据传输系统,发送符号经过ISI失真信道传输,叠加高斯加性白噪声。 设发送信号采用QPSK调制,即 x k = ( 1 j ) / 2 {x_k} = ( \pm 1 \pm j)/\sqrt 2 x

Java代码样式运算符换行格式

上周&#xff0c;我发现了什么决定了我长期以来苦苦挣扎的决定&#xff1a;是否放置&& &#xff0c; ||之类的运算符。 或在同一行或下一行。 在构造布尔表达式或隐含字符串时&#xff0c;我们可能需要中断长行。 根据《 Google Java样式指南》 &#xff0c;该中断应出…

在一个由小写英文字母(a-z)组成的字符串中,查找最长子串,其头尾字母相同,且中间不包含该头尾字母,并输出最左边的该类子串

输入&#xff1a; ①adfasjdoiasldhlfa ②a ③aa ④abcd 输出&#xff1a; ①fasjdoiasldhlf ②a ③aa ④a import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String str scanner.next();Str…

无线打印机与手机连接到服务器,图文详解手机通过无线Wifi连接打印机的方法...

打印机是我们在办公过程中经常会用到的打印设备&#xff0c;特别是当需要大量的文件资料时&#xff0c;打印机可以帮助我们快速的打印和记录。随着打印机使用的不断广泛&#xff0c;打印机的种类也在不断的增多&#xff0c;为了能够适应现在这个网络智能时代的发展&#xff0c;…

卷积码Viterbi译码算法基本原理及C语言实现

配套代码:https://download.csdn.net/download/wlwdecs_dn/14463620 界面 (3, 1, 3)卷积码状态转移框图 源文件 编码文件: 译码文件:

在一个小写英文字母(a-z)组成的字符串的最短子串,其包含这个字符串中出现过的所有字母,输出最左边的该类子串

import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String str scanner.next();String subStr str;//两层循环使得各种字串情况可以详尽for (int i 0; i < str.length(); i) {for (int j …

Win32编程之基于MATLAB与VC交互的幻方阵(魔方阵)输出

运行环境 Matlab R2018b x64 or x32 Visual Studio 2017 企业版 程序下载 配套代码下载地址 程序预览 程序功能描述 矩阵运算是大多数科学运算的必要工具。通常情况下,Matlab是实现矩阵运算的最佳工具,但是大多数Matlab运算都是基于double类型,占据空间很大,遇到大型数…

java中使用es的dsl_基于DSL的基于图论的Java程序中输入图数据的方法

java中使用es的dsl我们大多数人已经编写了一些处理图论算法的程序&#xff0c;例如找到两个顶点之间的最短路径&#xff0c;找到给定图的最小生成树等等。 在这些算法的每一种中&#xff0c;表示图形的编程方式是使用邻接矩阵或邻接列表 。 两者都不是定义图形输入的非常直观的…

leetcode 495. 提莫攻击(esay)(优质解法)

链接&#xff1a;495. 提莫攻击 代码&#xff1a; class Solution {public int findPoisonedDuration(int[] timeSeries, int duration) {int time0;for(int i1;i<timeSeries.length;i){if(timeSeries[i]-timeSeries[i-1]<duration){timetimeSeries[i]-timeSeries[i-1];…