实用范文
《JavaEECDI方式的依赖注入方法》Word格式可编辑含目录
精心整理放心阅读欢迎下载
文档信息
JavaEECDI方式的依赖注入方法
目录
2.构造器依赖注入
3.字段依赖注入
4.初始化方法依赖注入
6.注入到生产者方法中
7. CDI代理
正文
Java EE CDI方式的依赖注入方法
Java EE CDI主要使用@Inject注解来实现依赖注入把受管理的bean注入到由容器管理的其它资源中去。在本教程中我们将会介绍在CD I环境下几种不同的可选策略来实现依赖注入。
本教程基于如下环境
JDK
Weld
Weld是CDI的参考实现。
2.构造器依赖注入
public class SomeBean {private final Service service;
@Injectpublic SomeBean(Service service)
= service;
当CDI容器在初始化一个S omeBean类型的bean实例时它将会查找该类的默认构造器(无参构造器)并用它来创建bean实例。但是有一个例外情况就是当我们还有一个使用@Inject进行了注解的构造器时这种情况下容器会改用有注解的构造器而不是无参构造器并且把通过构造器参数传入的依赖资源注入到b e an实例中来。
注意:记住一个类只允许有一个@Inject注解的构造器。
在上面的例子中容器将会获取到一个Service的实例并把它注入到SomeBean的注解构造器中。
3.字段依赖注入public class SomeBean {
@Injectprivate Service service;
这种情况下 当容器初始化一个SomeB ean类型的b ean时它会把一个正确的Service实例注入给该字段 即使该字段是一个私有字段并且不需要有任何setter方法。
4.初始化方法依赖注入public class SomeBean {private Service service;
@Injectpublic void setService(Service service) {
= service;
这种情况下 当容器初始化一个SomeB ean类型的b ean时它会调用所有由@Inject注解了的方法并且通过方法参数的方式把依赖注入进来。
@Any修饰符
为了提供完全松耦合的应用我们通常把接口注入到受管理的资源中。当我们有多个实现了给定接口的bean时该怎么办呢?我们可以同时使用@Any修饰符和CDI的Itance接口来把所有该接口的实现b ean都注入进一个受管理的b ean中
The @Any qualifier
public class SomeBean {
@Injectpublic void listServiceImplementatio(
@Any Itance serviceList) {for(Service service : serviceList)
( () .getCanoni calName(
@Any修饰符告诉容器任何可供使用的依赖都适用于该注入点所以容器会把他们都注入进来。 如果我们有接口的多个实现而我们只注入其中的一个-并且没有做任何排除工作-那么容器将会抱怨并且无法成功的初始化组件。我们将会在其他教程中介绍依赖排除问题。
6.注入到生产者方法中
生产者方法的参数也可以经由CDI容器进行注入。请查看Java EECDI Producer methods tutorial。
7. CDI代理
如果我们不涉及CDI代理机制那么本教程将是不完整的。当我们把一个在不同于@Dependent范围下创建出来的bean注入到另外一个托管资源时 CD I容器不会注入一个被注入bean的直接引用。
CDI中bean的范围请看Java EE CDI bean scopes
为什么CDI使用代理?因为如果bean的直接引用被注入将会给被管理的b ean造成诸如线程安全或并发访问的问题。
设想一下一个Session范围的bean被注入到一个Application范围的bean中去的情形。 由于appl ication范围的bean在所有客户端间共享如果多个客户端同时访问一个application范围的bean那么将会存在很高的风险出现这种情况一个客户端访问了其他客户端正在访问的session范围的bean。
为了处理这种问题 CDI创造了代理并把代理注入进注入点。 由代理负责处理对被注入b e an的调用并实际去调用正确的b ean实例。
CDI创建的代理继承自被注入bean的类型。设想一下下面的情形
Application和Session范围的bean
@Sessiocopedpublic class Service {public void doWork() {
("Working.
@Applicatiocoped
public class SomeBean {
@Injectprivate Service service;public void test(
CDI将把一个session范围的bean的代理注入进一个application范围的'bean中去。每一次对session范围bean的调用都将通过代理进行代理会把调用重定向到正确的session范围bean的实例那个从属于正确的HTTP request session的bean。
CDI创建代理是通过继承原来bean的类并重写所有非私有方法。一个简单的典型的代理的例子可以像下面这样
CDI代理示例ublic class Service$Proxy$_$$_WeldClientProxyextends Service {
@Overridepublic void doWork() {
Service itance = . . . resolve bean itance
由于CDI代理通过继承bean的类来创建所以当我们讨论非依赖性bean范围的时候你应当明白CD I有如下一些限制
CDI不能注入原始类型bean的类必须有一个非私有的默认构造器bean的类不能是f inal类型的并且不能有任何f inal方法
为提高学习交流本文整理了相关的实用范文有 《JavaEE新手入门》 、
《JavaEE性能的测试与调优》 、 《JavaEE开发常用框架》 、 《影响JavaEE性能的因素》 、 《j2ee与java的区别》 、 《j2ee与java web的区别》 、 《Java EE的Web服务体系结构》 、 《Java多线程的实现方式》 读者可以在平台上搜索。
“Ja vaEECDI方式的依赖注入方法”文档源于网络本人编辑整理。本着保护作者知识产权的原则仅供学习交流请勿商用。如有侵犯作者权益请作者留言或者发站内信息联系本人我将尽快删除。谢谢您的阅读与下载
青果网络怎么样?青果网络隶属于泉州市青果网络科技有限公司,青果网络商家成立于2015年4月1日,拥有工信部颁发的全网IDC/ISP/IP-VPN资质,是国内为数不多具有IDC/ISP双资质的综合型云计算服务商。青果网络是APNIC和CNNIC地址分配联盟成员,泉州市互联网协会会员单位,信誉非常有保障。目前,青果网络商家正式开启了618云特惠活动,针对国内外机房都有相应的优惠。点击进入:青果网络官方...
古德云(goodkvm)怎么样?古德云是一家成立于2020年的商家,原名(锤子云),古德云主要出售VPS服务器、独立服务器。古德云主打产品是香港cn2弹性云及美西cn2云服务器,采用的是kvm虚拟化构架,硬盘Raid10。目前,古德云香港沙田cn2机房及美国五星级机房云服务器,2核2G,40G系统盘+50G数据盘,仅35元/月起,性价比较高,可以入手!点击进入:古德云goodkvm官方网站地址古德...
云基成立于2020年,目前主要提供高防海内外独立服务器用户,欢迎各类追求稳定和高防优质线路的用户。业务可选:洛杉矶CN2-GIA+高防(默认500G高防)、洛杉矶CN2-GIA(默认带50Gbps防御)、香港CN2-GIA高防(双向CN2GIA专线,突发带宽支持,15G-20G DDoS防御,无视CC)、国内高防服务器(广州移动、北京多线、石家庄BGP、保定联通、扬州BGP、厦门BGP、厦门电信、...