Spring vs Guice:重要的一個關鍵區別

根據彈簧對象的名稱識別它們
不管使用XML還是Java配置都沒有關系,Spring范圍大致類似于Map <String,Object>結構。 這意味著您不能有兩個名稱相同的對象 。 為什么這是一件壞事? 如果您的大型應用程序包含許多@Configuration類或XML文件,則很容易意外地兩次使用相同的名稱。
最糟糕的是,它們與多個對象一起使用時,它們會默默地相互覆蓋,直到實際上只有一個保留在ApplicationContext中為止。 這些對象也可以是不同的類型,而聲明順序才是真正確定哪個對象獲勝的因素。 這里的問題是,如果您想基于Spring創建可重用的模塊,則基本上將被迫在名稱或其他名稱中使用前綴,以確保不會出現名稱沖突。
根據對象的類別識別Guice對象
Guice范圍基本上類似于Map <Class <?>,Object>結構。 這意味著如果不使用額外的元數據(例如,限定詞), 就不能擁有兩個相同類型的對象 。 這種設計選擇有不同的優缺點,但總的來說,我認為這是比較明智??的選擇。 如果創建可重用的模塊,則必須確保不導出任何通用類型的對象(例如,字符串)。 使用基于類型的作用域,您始終可以為常見類型創建一個包裝的類,而使用基于名稱的作用域,您將始終不得不根據幸運的猜測使用唯一的名稱。 Guice還具有PrivateModules,因此您可以對所有注入使用Guice,但僅導出范圍中的某些對象。 ?
范例程式碼
這是一個Spring應用程序的幼稚示例,由于無聲Bean覆蓋而中斷了運行時。

Main.java

此類實例化應用程序上下文,注冊配置類并嘗試從上下文中獲取MyBean。

package springbreak;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();ctx.register(GoodConfig.class);ctx.register(EvilConfig.class);ctx.refresh();ctx.start();System.out.println(ctx.getBean(MyBean.class).getValue());ctx.stop();}
}

MyBean.java

這只是我們期望從應用程序上下文中獲得的一種示例類型的Bean。

package springbreak;public interface MyBean {String getValue();
}

GoodConfig.java

這是一個導出MyBean的配置類

package springbreak;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class GoodConfig {private static class MyBeanImpl implements MyBean {public String getValue() {return "I'm a bean";}}@Beanpublic MyBean myBean() {return new MyBeanImpl();}}

EvilConfig.java

此配置類導出名為myBean的String。 這不是一個非常現實的示例,但顯示了基本思想。

package springbreak;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class EvilConfig {@Beanpublic String myBean() {return "I'm a string!";}}
分析例子
您可以猜測運行示例時會發生什么嗎? 這是基本思想:
  1. GoodConfig導出名稱為“ myBean”的MyBeanImpl。
  2. 即使類型不匹配 ,EvilConfig 也會導出一個名稱為“ myBean”的字符串替換GoodConfig中的字符串
  3. Main獲得NoSuchBeanDefinitionException“未定義[springbreak.MyBean]類型的唯一bean”
    因此,基本上將MyBeanImpl替換為String,并且不會有實現MyBean的bean。 最糟糕的部分是, 如果您顛倒@Configuration類的注冊順序,該代碼將起作用,因為然后String將被MyBeanImpl替換。 現在,假設您有20個封裝良好的模塊,這些模塊的名稱可能會發生沖突……我已經多次碰壁,試圖在這種情況下調試問題。
    Spring(從3.0.6版開始)無法更改@Configuration類導出的bean的命名。 如果要創建可安全重用的模塊,則必須在導出Bean的方法中使用某種完全限定的名稱(例如goodConfigMyBean,evilConfigMyBean)。
    我喜歡Spring(尤其是非DI容器部件),但是在新項目中,我將拒絕使用從根本上被破壞的庫。 是的,兩次使用相同的名稱是開發人員錯誤,但是容易出現此類錯誤的任何庫都可被認為比嘗試最小化這些錯誤的替代方法更糟。

    參考: Spring vs Guice: Jawsy Solutions技術博客博客上我們JCG合作伙伴 Joonas Javanainen的重要差異之一 。


    翻譯自: https://www.javacodegeeks.com/2012/06/spring-vs-guice-one-critical-difference.html

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/news/372626.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/news/372626.shtml
    英文地址,請注明出處:http://en.pswp.cn/news/372626.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    php 批量更新死鎖,php – 在嘗試獲取鎖定時,哪個查詢導致死鎖;嘗試重新啟動事務...

    我無法弄清楚哪個Query在嘗試獲取鎖定時導致死鎖;嘗試重新啟動事務.我的mysql包裝器有以下幾行if (mysql_errno($this->conn) 1213) {$this->bug_log(0,"Deadlock. SQL:".$this->sql);}bug_log寫入文件的位置.錯誤日志文件沒有死鎖錯誤,但/var/log/mysqld.…

    Task和BackTask

    一、總結性知識點&#xff1a; 1、Android應用運行時會創建任務Task&#xff0c;用于存放主窗口2、每一個任務包含一個堆棧數據結構&#xff0c;用于保存當前應用已創建的窗口對象&#xff0c;這個堆棧即回退棧BackStack3&#xff64; 位于回退棧頂的窗口會處于焦點狀態4&#…

    Java面試題二

    1、public、private、protected、Friendly的區別與作用域 public,protected,friendly,private的訪問權限如下&#xff1a; 關鍵字 當前類 包內 子孫類 包外 public √ √ √ √ protected…

    使用Spring Roo進行快速云開發–第1部分:Google App Engine(GAE)

    Spring Roo是在Java平臺上提供快速應用程序開發的工具。 我已經解釋了何時使用它&#xff1a; http : //www.kai-waehner.de/blog/2011/04/05/when-to-use-spring-roo 。 Spring Roo目前支持兩種針對云計算的解決方案&#xff1a;Google App Engine&#xff08;GAE&#xff09;…

    mysql 重裝,Windows系統中完全卸載MySQL數據庫實現重裝mysql

    一、在控制面板&#xff0c;卸載MySQL的所有組件控制面板——》所有控制面板項——》程序和功能&#xff0c;卸載所有和MySQL有關的程序二、找到你的MysQL安裝路徑&#xff0c;看還有沒有和MySQL有關的文件夾&#xff0c;全刪如果安裝在C盤&#xff0c;檢查一下C:\Program File…

    loadrunner 關聯

    1、記住關聯的位置&#xff08;之前&#xff09;&#xff0c;因為登錄之前需要token&#xff0c;才能驗證登錄是否成功&#xff0c;所以&#xff0c;放在登錄之前 轉載于:https://www.cnblogs.com/zyp1/p/5692343.html

    網頁上線后音頻不能自動播放

    一、問題描述 開發環境谷歌瀏覽器本地測試通過&#xff0c;網站上線后的音樂不播放&#xff0c;而是自動下載&#xff1f; 開發環境safari瀏覽器中&#xff0c;音頻不播放。 二、問題分析 用audio或者embed標簽都有問題&#xff0c;為了節省用戶的流量&#xff0c;安卓和ios都默…

    Akka STM –與STM Ref和Agent進行乒乓球比賽

    乒乓是一個經典示例&#xff0c;其中2個玩家&#xff08;或線程&#xff09;訪問共享資源–乒乓球桌并在彼此之間傳遞Ball&#xff08;狀態變量&#xff09;。 使用任何共享資源&#xff0c;除非我們同步訪問&#xff0c;否則線程可能會遇到潛在的死鎖情況。 PingPong算法非常簡…

    c mysql二進制,MySQL運用connector C/C+讀取二進制字段

    MySQL使用connector C/C讀取二進制字段MySQL使用connector C/C讀取二進制字段&#xff0c;兩種方法&#xff1a;用getStringvector vec;while (pResultSet->next()){string str pResultSet->getString("data");vec.insert(vec.end(), str.begin(), str.end())…

    在下一個項目中不使用JavaDoc的5大原因

    JavaDoc對于框架和庫的開發是絕對必要的&#xff0c;這些框架和庫為其他框架&#xff08;例如Spring Framework&#xff0c;JDK&#xff09;提供了公共接口。 對于內部企業軟件和/或產品開發&#xff0c;我有以下原因會在將來忽略“ 100&#xff05;JavaDoc策略”。 1&#xff…

    NPOI操作Excel輔助類

    /// <summary> /// NPOI操作excel輔助類 /// </summary> public static class NPOIHelper {#region 定義與初始化public static HSSFWorkbook workbook;[Flags]public enum LinkType{網址,檔案,郵件,內容};private static void InitializeWorkbook(){if (workbook …

    JSP九大內置對象,七大動作,三大指令

    JSP之九大內置對象 隱藏對象入門探索 Servlet 和JSP中輸出數據都需要使用out對象。Servlet 中的out對象是通過getWriter()方法獲取的。而JSP中沒有定義out對象卻可以直接使用。這是因為out是JSO的內置隱藏對象。JSP中的常見的9個內置隱藏對象如下 out輸出流對象 隱藏對象out是…

    matlab變步長的梯形公式,用變步長梯形法計算積分∫sinx/x*x的近似值(二分二次即可)...

    共回答了20個問題采納率&#xff1a;90%題目沒寫全吧?現假定積分區間為[0,1],教材《數值分析》(華中科技大學出版)第87頁,例題4.2就有詳細的解答.貌似題目也有錯?確定分母是【x^2】?現在附上該例題(分母是x)的全部解答過程&#xff1a;先對整個區間[0,1]使用梯形公式.對于函…

    使用Cloud SQL的Google App Engine全文搜索

    許多Google AppEngine開發人員一直在等待全文搜索功能&#xff0c;特別是來自網絡上最大的搜索引擎Google。 很高興看到Google團隊正在努力&#xff0c;您可以在Google I / O 2011大會上簽到&#xff1a; Bo Majewski和Ged Ellis進行的全文本搜索 。 據我所知&#xff0c;非常有…

    php 數組值sum,php sum數組值(如果特定列的值重復)

    我有一個陣列。我要檢查是否有重復的費用,如果有,我要用相同的費用列匯總所有值。[12] > Array([type] > Other Miscellaneous Fees[fee] > 158[amount] > -22.56[code] > COL_AUDIO[feedesc] > COLLEGE AUDIO VISUAL FEE)[13] > Array([type] > Other…

    hdu-5734 Acperience(數學)

    題目鏈接&#xff1a; Acperience Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem DescriptionDeep neural networks (DNN) have shown significant improvements in several application domains including computer vision and…

    Ninject依賴注入(一)

    Ninject學習筆記&#xff08;一&#xff09; Ninject學習筆記&#xff08;一&#xff09;理解依賴注入DI概念什么是DI&#xff1f;DI是如何工作的&#xff1f;什么是DI容器使用Ninject如何使用NinjectNinject對象生命周期暫時范圍單例范圍線程范圍請求范圍自定義范圍Ninject模塊…

    我如何向團隊解釋依賴注入

    最近&#xff0c;我們公司開始開發基于Java的新Web應用程序&#xff0c;經過一些評估過程&#xff0c;我們決定使用Spring。 但是許多團隊成員并不了解Spring和Dependency Injection的原理。 因此&#xff0c;我被要求給出一個速成班&#xff0c;介紹什么是Spring上的依賴注入和…

    可以添加自定義的Select控件

    1.控件dom <select name"WebSiteTarget" id"WebSiteTarget" class"w1" onchange"editable2(this);"><option value"-1">請選擇城市</option><option>福州</option><option>廈門</op…

    innodb_io_capacity =innodb_lru_scan_depth*inoodb_buffer_pool_instances。與 checkpoint

    innodb_lru_scan_depth:每個緩沖池刷臟頁的能力 innodb_io_capacity: iops inoodb_buffer_pool_instances8 :緩沖池的個數 .關系&#xff1a; innodb_io_capacity > innodb_lru_scan_depth * inoodb_buffer_pool_instances 轉載于:https://www.cnblogs.com/zengkefu/…