php cdi_DI / CDI –基础
php cdi
簡(jiǎn)介(DI / CDI基礎(chǔ))
首先,我認(rèn)為對(duì)此會(huì)有一些困惑,但事實(shí)是,它們是相同的–不同之處在于用法及其用途。
DI(依賴(lài)項(xiàng)注入)是一個(gè)通用術(shù)語(yǔ)–此功能基本上是在任何應(yīng)用程序上進(jìn)行Bean發(fā)現(xiàn)和Bean連接過(guò)程的功能。 它不僅可以在應(yīng)用程序中使用它,還可以在單??元測(cè)試和模擬中使用它。 當(dāng)然,這里有很多DI框架,包括:Guice,Seam,Spring(Seam和Spring擴(kuò)展了DI方案,并制定了自己的框架),EJB 3.x和CDI本身。
另一方面,CDI結(jié)合了所有這些技術(shù),并向組件引入了生命周期–這使得DI技術(shù)得以統(tǒng)一,從而使新功能的開(kāi)發(fā)變得直截了當(dāng)且可行。 您可以將Seams生命周期映射與以JPA作為其持久層的Spring MVC結(jié)合在一起-這些技術(shù)都是單獨(dú)創(chuàng)建的,但都與CDI結(jié)合使用,應(yīng)用程序開(kāi)發(fā)人員可以將它們結(jié)合在一起以創(chuàng)建和開(kāi)發(fā)JEE應(yīng)用程序。
我將需要分解主題,因?yàn)槲铱隙〞?huì)在這里用單詞和字母讓每個(gè)人感到厭煩:
我將分別為每個(gè)帖子創(chuàng)建帖子!
讓我們開(kāi)始!
SPI(服務(wù)編程接口)
它還具有所謂的SPI-顯然是與API一起提供的功能集,但完全具有不同的用途。
- API是您為實(shí)現(xiàn)目標(biāo)而調(diào)用和使用的類(lèi)/接口/方法/…的描述。
- SPI是您為實(shí)現(xiàn)目標(biāo)而擴(kuò)展和實(shí)現(xiàn)的類(lèi)/接口/方法/…的描述。
使用SPI,您實(shí)際上可以擴(kuò)展JEE6以創(chuàng)建自己的不同框架,從而展示可移植性和可擴(kuò)展性。 ( 但我稍后會(huì)介紹 )。
為什么選擇CEE for JEE6?
CDI已經(jīng)出現(xiàn)在JEE5(J2EE)中,并取得了巨大的成功。 它的方法使很多新開(kāi)發(fā)受益,最終簡(jiǎn)化了整個(gè)開(kāi)發(fā)過(guò)程。 在JEE6中改進(jìn)CDI的幾個(gè)原因。
- JEE5確實(shí)支持資源注入,但是它仍然缺乏通用的依賴(lài)關(guān)系–它僅支持@ EJB,@ PersistenceContext,@ PersistenceUnit,@ Resources)–當(dāng)然,除了Spring引入了用于管理bean生命周期的不同注釋外
- 非基于類(lèi)型的注入(弱)–字符串名稱(chēng)和XML注入確實(shí)很脆弱。 改進(jìn)基于類(lèi)型的注入通??梢詫?shí)現(xiàn)更好的工具。
術(shù)語(yǔ)
CDI –上下文和依賴(lài)注入
焊接
- JSR 299參考實(shí)現(xiàn)–參考實(shí)現(xiàn)是用于擴(kuò)展JSR特定實(shí)現(xiàn)的SPI。
- 為Servlet容器提供擴(kuò)展的CDI支持。
- 擴(kuò)展編寫(xiě)器的CDI增強(qiáng)功能。
- CDI和Java EE的Maven原型(我喜歡maven!)。
CDI主題:松散耦合和強(qiáng)類(lèi)型
松散耦合只是意味著對(duì)象與使用或當(dāng)前使用的對(duì)象在松散地獨(dú)立。 CDI引入了用于解耦的新功能,例如限定符 ,增強(qiáng)了攔截器 , 修飾器 ,消息生成器 , 使用者及其底層事件機(jī)制。 將深入探討有關(guān)CDI高級(jí)主題的每個(gè)示例。
強(qiáng)大的輸入 -只是意味著通過(guò)讓容器創(chuàng)建特定的名稱(chēng)并將其映射到對(duì)象來(lái)嚴(yán)格聲明bean。 這樣就不需要對(duì)字符串進(jìn)行基于字符串的命名,幾乎不需要鑄造,因?yàn)殍T造是由容器完成的(利用限定符)。
豆(什么?)
從技術(shù)上講,您擁有多種形式的bean:JSF Bean,EJB Bean,Spring,Seam,Guice CDI,實(shí)體Bean等,但是最終,bean只是具有特殊定義的POJO(由Managed Bean 1.0定義) – Java EE6中制定的規(guī)范。 這意味著任何POJO都可以是任何類(lèi)型的bean,只要它符合規(guī)范標(biāo)準(zhǔn)即可–從而進(jìn)一步簡(jiǎn)化了聲明和開(kāi)發(fā)過(guò)程。 容器負(fù)責(zé)管理POJO,并通過(guò)提供/引入常見(jiàn)的基本服務(wù)來(lái)增加對(duì)它的支持,例如:
- 生命周期管理(@ PostConstruct,@ PreDestory)
- 注入資源(@Resource)
- 攔截器(@ Interceptors,@ ArounInvoke)
考慮到這一點(diǎn), EJB , REST和CDI bean呢?
- EJB bean服務(wù)–托管bean,具有公共服務(wù)(上述)并支持事務(wù),安全性,線程安全性和持久性。
- REST bean服務(wù)–具有HTTP支持的托管bean
- CDI bean –具有生命周期的托管bean支持:
- 自動(dòng)發(fā)現(xiàn)
確切地說(shuō),Manage Bean最終是針對(duì)特定用途而擴(kuò)展的SPI。 EJB,Rest和實(shí)體Bean都是托管Bean,但是容器提供了其他服務(wù)。 因此,如果您使用@Stateless或@Stateful批注定義POJO,則容器會(huì)自動(dòng)檢測(cè)到它是EJB bean,并且需要特定于容器的支持,例如事務(wù),安全性,線程安全性,擴(kuò)展等。
package mypackage; import javax.ejb.Stateless;@Stateless public class GreetingBean {public String greet(String name){return "Hello " + name;} }一個(gè)簡(jiǎn)單的POJO類(lèi)就用一個(gè)手指(實(shí)際上是敲入)就變成了一個(gè)Stateless bean,從而產(chǎn)生了一個(gè)@Stateless代碼。 與在先驗(yàn)3.x上定義EJB的方式不同(這很痛苦)。
從此處下載示例(以上): 單擊我
自動(dòng)Bean發(fā)現(xiàn)
CDI容器是負(fù)責(zé)如何發(fā)現(xiàn)Bean的容器,但是它是如何做到的?
最終,引入DI / CDI是為了簡(jiǎn)化開(kāi)發(fā)過(guò)程,統(tǒng)一技術(shù)和整體以產(chǎn)生更強(qiáng)大,可擴(kuò)展的應(yīng)用程序。 讓所有容器按照標(biāo)記Bean的公共服務(wù)的方式工作,這使開(kāi)發(fā)人員的工作更加輕松,而且比避免以前的框架導(dǎo)致的陷阱更容易。 SPI –實(shí)際上是改進(jìn)的定義,它允許實(shí)際的JEE6框架可擴(kuò)展,從而創(chuàng)造了更加動(dòng)態(tài)的特性–業(yè)務(wù)應(yīng)用程序架構(gòu)師現(xiàn)在可以設(shè)計(jì)自己的框架和約定。 為自己的規(guī)則放置更多特定于業(yè)務(wù)的設(shè)計(jì)或注釋,并提供企業(yè)應(yīng)用程序始終需要的健壯性和靈活性。
下一主題: 基礎(chǔ)注射 –我不想將所有內(nèi)容放到一個(gè)帖子中,因此我將讓您先吸收它并檢查我創(chuàng)建的樣品。 從現(xiàn)在開(kāi)始,我將詳細(xì)介紹DI和CDI的示例。
參考: DI / CDI – Alvin“ Jay” Reyes博客博客上的JCG合作伙伴 Alvin Reyes的基礎(chǔ)知識(shí) 。翻譯自: https://www.javacodegeeks.com/2013/08/di-cdi-basics.html
php cdi
總結(jié)
以上是生活随笔為你收集整理的php cdi_DI / CDI –基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑双肩包哪个牌子好(电脑双肩包哪个牌子
- 下一篇: php cdi_教程:编写自己的CDI扩