日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

guice spring_Spring vs Guice:重要的一个关键区别

發布時間:2023/12/3 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 guice spring_Spring vs Guice:重要的一个关键区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

guice spring

根據彈簧對象的名稱識別它們 不管使用XML還是Java配置都沒有關系,Spring范圍大致類似于Map <String,Object>結構。 這意味著您不能有兩個名稱相同的對象 。 為什么這是一件壞事? 如果您的大型應用程序具有許多@Configuration類或XML文件,則很容易意外地兩次使用相同的名稱。 最糟糕的部分是,將它們與多個對象一起使用時,它們會默默地相互覆蓋,直到在ApplicationContext中僅實際保留一個對象為止。 這些對象也可以具有不同的類型,而聲明順序才是真正確定哪個對象獲勝的因素。 這里的問題是,如果要基于Spring創建可重用的模塊,則基本上將被迫在名稱或其他名稱中使用前綴,以確保不會出現名稱沖突。 Guice對象根據其類別進行識別 Guice范圍基本上類似于Map <Class <?>,Object>結構。 這意味著如果不使用額外的元數據(例如,限定詞), 就不能擁有兩個相同類型的對象 。 這種設計選擇各有利弊,但總的來說,我認為這是比較明智??的選擇。 如果創建可重用的模塊,則必須確保不導出任何通用類型的對象(例如String)。 使用基于類型的作用域,您始終可以為常見類型創建一個包裝的類,而使用基于名稱的作用域,您將始終不得不根據幸運的猜測使用唯一的名稱。 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!";}} 分析例子 您可以猜測運行示例時會發生什么嗎? 這是基本思想:
  • GoodConfig導出名稱為“ myBean”的MyBeanImpl。
  • 即使類型不匹配 ,EvilConfig 也會導出一個名稱為“ myBean”的字符串,以替換GoodConfig中的字符串
  • 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

    guice spring

    總結

    以上是生活随笔為你收集整理的guice spring_Spring vs Guice:重要的一个关键区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。