Java EE 7中的资源和依赖注入

1.概述

上下文和依赖注入(CDI)是Java EE的一项功能,可帮助融合Java EE 6和更高版本中包含的平台的Web层和事务层。 从技术角度来看,这意味着CDI提供了依赖项注入框架,并且还管理了依赖项的生命周期。

今天在本教程中,我们将介绍Java EE 7的CDI。

1.1上下文和依赖注入规范

如Oracle的Java EE 7网站上所述 ,Java EE 7使用CDI 1.1,在JSR 346中对此进行了概述。

正如CDI负责人Pete Muir在本博客中提到的, CDI 1.1带来了许多重大更改,例如:

  • 全局启用拦截器,全局启用装饰器,以及使用@Priority批注的替代方法
  • 对构造函数的@AroundConstruct生命周期回调的支持
  • EventMetadata允许检查事件元数据
  • 允许将拦截器绑定到构造函数

如前所述,博客文章中还提到了其他重大更改,建议将它们全部复习。

2.比较依赖注入和资源注入

射出类型 可以直接注入JNDI资源 可以直接注入常规课程 解决依据 类型安全
资源注入 真正 资源名称 没有
依赖注入 真正 类型

2.1依赖注入

依赖注入使我们能够将常规Java类转换为托管对象,并将这些托管对象注入其他托管对象。 障碍是确保我们在正确的时间提供正确的管理对象。

在这里,我们有一个@Inject批注,它表示我们将提供(也称为注入)此构造函数的依赖项:

@Injectpublic MaskingDataProcessor(MaskingData maskingData) {this.maskingData = maskingData;}

那么,这种依赖关系从何而来?

在此示例中,我们有两个类: SSNDataMaskerBirthdayMasker ,它们都实现相同的接口。

SSNDataMasker注释为默认值,因此,如果可用,将默认选择:

@Default
public class SSNMasker implements MaskingData {...
}

BirthdayMasker被注释为替代依赖项,因此,如果SSNDataMasker不可用,则会选择它:

@Alternative
public class BirthdayMasker implements MaskingData {...
}

2.2资源注入

资源注入使我们能够将JNDI名称空间中可用的任何资源注入到容器管理的任何对象中。 例如,我们可以使用资源注入来注入连接器,数据源或JNDI名称空间中可用的任何其他资源。

在下面的代码中,我们将数据源对象注入到字段中,这种资源注入被适当地称为基于字段的注入:

public class MyClass {@Resource(name="java:comp/SomeDataSource")private DataSource myDataBase;...
}

注入资源的另一种方法是基于方法的注入 。 在基于方法的注入中,所传递的参数与资源一起注入:

public class MyClass {private DataSource myDataBase;...@Resource(name="java:comp/SomeDataSource")public void setMyDataSource(DataSource dataSource) {myDataBase = dataSource;}
}

3. EJB和CDI有什么区别?

正如Oracle网站上的这篇文章所述 ,CDI中的“ C”是EJB bean和CDI bean之间的主要区别。 EJB组件可能是有状态的,但并不是固有的上下文关系。 当我们引用有状态组件实例时,必须在客户端之间显式传递该实例,并由应用程序销毁它。 CDI通过上下文生命周期管理改进了EJB组件模型 。 但是,有时候我们想彼此使用。

3.1何时使用EJB

只有通过添加@ Stateful,@ Stateless或@Singleton来使CDI bean成为EJB时,才有几种有用的容器服务可用。

示例包括:

  • 当我们公开一个JAX-WS @WebService时 ,使其成为EJB使得我们不必列出它并将其映射为xml文件中的servlet。 @Stateless和@Singleton可以使用此功能
  • 当我们通过@Path公开JAX-RS资源时。 当RESTful服务是EJB时,我们将获得自动发现,不需要将其添加到JAX-RS Application子类或其他地方。 @Stateless和@Singleton可以使用此功能
  • 当我们并行工作时, @Asynchronous方法调用非常有用。 众所周知,线程过多会降低性能。 @Asynchronous批注允许我们并行化使用容器的线程池执行的操作。 @ Stateful,@ Stateless和@Singleton可以使用此功能

3.2何时使用CDI

简而言之,当我们受益于CDI时,就应该使用CDI。 当我们需要注入,事件,拦截器,修饰器,生命周期跟踪以及CDI提供的其他功能时。

4。结论

为了快速测试我们回顾的有关CDI的概念,让我们将Weld添加到Maven项目中:

<dependency><groupId>org.jboss.weld.se</groupId><artifactId>weld-se-core</artifactId><version>2.4.1.Final</version>
</dependency>

假设我们已经有要测试的代码(例如博客文章中先前提到的代码),我们只需要执行Weld,例如:

public static void main(String[] args) {Weld weld = new Weld();WeldContainer container = weld.initialize();MaskingDataProcessor maskingDataProcessor = container.select(MaskingDataProcessor.class).get();container.shutdown();}

翻译自: https://www.javacodegeeks.com/2018/10/resource-dependency-injection-java-ee-7.html

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

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

相关文章

java wrap方法_Java WritableCellFormat.setWrap方法代码示例

import jxl.write.WritableCellFormat; //导入方法依赖的package包/类/*** param workSheet to add the help to* param table to fetch metadata from* param startRow to start adding rows at* param helpTextRowNumbers - map to insert row numbers for each help field i…

python创建tcp socket_Python Socket如何建立TCP连接

在 Python 程序中创建 TCP 服务器时&#xff0c;创建通用 TCP 服务器的一般演示代码如下。需要记住的是&#xff0c;这仅是设计服务器的一种方式。一旦熟悉了服务器设计&#xff0c;可以修改下面的代码来操作服务器。ss socket() #创建服务器套接字ss.bind() #绑定套接字与地址…

ubantu java编辑器_Linux Ubuntu中最好的代码编辑器 程序员都这么看吗?

【IT168 应用】Linux Ubuntu 中最好的代码编辑器是哪个 ? 这要看程序员的使用习惯和喜好了&#xff0c;Atom、Brackets、Sublime Text 是最常用的三个&#xff0c;也许程序员们还有更喜欢的。AtomAtom 是流行&#xff0c;而且十分友好的文本编辑器&#xff0c;而且还可以嵌入到…

apache camel_Apache Camel –从头开始开发应用程序(第1部分/第2部分)

apache camel开始之前 前段时间&#xff0c;我写了一篇关于Spring Integration的教程&#xff0c;以演示如何在受现实发票处理系统启发的示例应用程序中使用Spring Integration。 我对此非常满意&#xff0c;因此我决定向您展示如何使用Apache Camel&#xff08;Spring Integra…

python websocket异步高并发_高并发异步uwsgi+web.py+gevent

为什么用web.py&#xff1f;python的web框架有很多&#xff0c;比如webpy、flask、bottle等&#xff0c;但是为什么我们选了webpy呢&#xff1f;想了好久&#xff0c;未果&#xff0c;硬要给解释&#xff0c;我想可能原因有两个&#xff1a;第一个是兄弟项目组用webpy&#xff…

提示:通过URL激活并发送参数

世界上最安全的密码是不存在的密码。 使用完全随机的密钥从等式中删除用户。 公平地说&#xff0c;这有一些缺点&#xff0c;并且密码仍然存在于某个地方&#xff08;在您的电话/电子邮件中&#xff09;&#xff0c;但通常效果很好。 诀窍很简单&#xff0c;如果我们想对用户进…

weblogic创建域后启动不了_摩托车淋雨后启动不了什么原因?如何解决?

图文是工作&#xff0c;视频是生活。大家好&#xff0c;我是 骑士分享 欢迎您的关注&#xff01;摩托车淋雨后启动不了什么原因&#xff1f;如何解决&#xff1f;这种现象对于电喷车型来说发生的几率并不大&#xff0c;原因就在于电喷车型的线路防水能力会更强&#xff0c;供油…

前端开始学java_[Java教程]开启前端学习之路

[Java教程]开启前端学习之路0 2014-06-10 17:00:06前言第一次在博客园写博客&#xff0c;写写自己开启前端学习之路。应该是受邢师兄的影响吧&#xff0c;不得不说邢师兄人很好&#xff0c;学习也很认真&#xff0c;师兄的前端也是自学的&#xff0c;但是学的很好&#xff0c;大…

python 傅里叶_基于python的图像傅里叶处理

import numpy as npimport matplotlib.pyplot as pltx np.linspace(-10, 10, 1000)a np.cos(x)b a np.cos(3 * x)# d np.log(x)c b np.cos(7 * x)d c - np.cos(10 * x)plt.subplot(2, 2, 1)plt.plot(x, a, label‘$cos(x)$‘, color‘green‘, linewidth1)plt.title(&q…

xalan_如何以10倍速加速Apache Xalan的XPath处理器

xalan一段时间以来&#xff0c; Apache Xalan中存在一个令人尴尬的错误&#xff0c;该错误是XALANJ-2540 。 此错误的后果是Xalan每次XPath表达式求值将内部SPI配置文件加载数千次 &#xff0c;可以很容易地进行如下测量&#xff1a; 这个&#xff1a; Element e (Element)do…

EMUI10安装java_linux ubuntu系统安装java jdk和配置环境,pycharm安装

最近想使用pycharm,可是要想搭建java 环境&#xff0c;搞了很久才搞定&#xff0c;网上很多资料都是没用的。记录下来以后有用。首先加下载jdk安装包。我下的是jdk-6u37-linux-x64.bin&#xff0c;我把jdk安装在usr/lib/jvm1.sudo cp jdk-6u37-linux-x64.bin /usr/lib/jvm #将安…

python gevent async_python的异步初体验(gevent、async、await)

网络爬虫&#xff0c;这种io高密集型的应用由于大部分的时间在等待响应方面&#xff0c;所以CPU的使用率一直不高&#xff0c;速度也不快&#xff0c;为了解决这些问题&#xff0c;我们使用异步的方式来进行爬虫程序。串行的时候&#xff0c;如果我们要爬一个网站&#xff0c;那…

JEP 181不兼容,嵌套类/ 2

JEP 181是基于嵌套的访问控制https://openjdk.java.net/jeps/181 。 它是在Java 11中引入的&#xff0c;它故意引入了与先前版本的不兼容性。 这是一个很好的例子&#xff0c;与Java的先前版本兼容并不是刻板的规则&#xff0c;而是保持语言的一致性和稳定发展。 在本文中&…

abap 导入队列末尾_在C#中将对象添加到队列的末尾-排队操作

要将对象添加到队列的末尾&#xff0c;代码如下-示例using System;using System.Collections.Generic;public class Demo {public static void Main(){Queue queue new Queue();queue.Enqueue("Electronics");queue.Enqueue("Accessories");queue.Enqueue…

vim循环下表复制_Vimrc Init.vim太长了?不存在的

精简配置刚开始接触vim&#xff0c;你会被它各种好看的外观以及实用的插件吸引&#xff0c;各种折腾&#xff0c;不知不觉你的vimrc或者init.vim变得特别长&#xff0c;我之前的init.vim有多长&#xff1f;596行&#xff1f;wtf&#xff1f;每次维护的时候不知道有多麻烦&#…

C语言与JAVA内存管理_C语言内存管理

本章将介绍C语言动态内存管理. C语言编程语言提供了多种功能的内存分配和管理。这些函数可以在头文件中找到。S.N.函数与说明1void *calloc(int num, int size);此函数分配num元素其中每一个字节大小为(size)的数组2void free(void *address);此函数释放由地址指定的存储器块的…

使用LocalDate,LocalTime和LocalDateTime

Java 8对日期和时间API进行了重大更改&#xff0c;这是在JSR 310&#xff1a;日期和时间API的 JDK中包括了Joda Time API 。 此JSR由Joda Time的创建者Stephen Colebourne领导。 有许多惊人的API可用于日期和时间。 在本文中&#xff0c;我将介绍最常用的&#xff1a; java.ti…

visual studio odbc数据源设计器_NEW!WinForm界面开发设计时正式支持.NET 5

点击“了解更多”获取DevExpress v20.2完整版下载早在今年7月&#xff0c;官方技术团队宣布对DevExpress控件进行功能增强&#xff0c;使其支持最新的.NET 5 Preview。 但是尽管技术团队一直在努力确保WinForms控件与.NET 5兼容但在Visual Studio中对设计器的支持却是另一回事。…

java 接口的观察者模式_java观察者模式

观察者模式又叫做发布-订阅(Publish/Subscribe)模式。观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自己更新自己。Observer结构图.pngSubj…

java 构建者模式_Java方法中的参数太多,第3部分:构建器模式

java 构建者模式在我的前两篇文章中&#xff0c;我研究了如何通过自定义类型和参数对象减少构造函数或方法调用所需的参数数量。 在本文中&#xff0c;我将讨论如何使用构建器模式来减少构造器所需的参数数量&#xff0c;并讨论该模式如何甚至可以帮助采用过多参数的非构造器方…