免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Google Guice 3.0 入門介紹

一. 概述

Guice是一個(gè)輕量級的DI框架。本文對Guice的基本用法作以介紹。

本文的所有例子基于Guice 3.0

本文的很多代碼來源于Guice主頁:http://code.google.com/p/google-guice/wiki/GettingStarted

考慮到是入門介紹,本文中并未涉及到AOP相關(guān)內(nèi)容,如有需要還請參考上面鏈接。

二. 舉例說明Guice的用法

Guice本身只是一個(gè)輕量級的DI框架,首先我們通過一個(gè)例子來看看怎么使用Guice。

首先有一個(gè)需要被實(shí)現(xiàn)的接口:

  1. public interface BillingService {  
  2.   
  3.   /** 
  4.    * Attempts to charge the order to the credit card. Both successful and 
  5.    * failed transactions will be recorded. 
  6.    * 
  7.    * @return a receipt of the transaction. If the charge was successful, the 
  8.    *      receipt will be successful. Otherwise, the receipt will contain a 
  9.    *      decline note describing why the charge failed. 
  10.    */  
  11.   Receipt chargeOrder(PizzaOrder order, CreditCard creditCard);  
  12. }  

然后,有一個(gè)實(shí)現(xiàn)該接口的實(shí)現(xiàn)類:
  1. class RealBillingService implements BillingService {  
  2.   private final CreditCardProcessor processor;  
  3.   private final TransactionLog transactionLog;  
  4.   
  5.   @Inject  
  6.   RealBillingService(CreditCardProcessor processor,   
  7.       TransactionLog transactionLog) {  
  8.     this.processor = processor;  
  9.     this.transactionLog = transactionLog;  
  10.   }  
  11.   
  12.   @Override  
  13.   public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard) {  
  14.     ...  
  15.   }  
  16. }  


現(xiàn)在接口有了,實(shí)現(xiàn)類也有了,接下來就是如何將接口和實(shí)現(xiàn)類關(guān)聯(lián)的問題了,在Guice中需要定義Module來進(jìn)行關(guān)聯(lián)
  1. public class BillingModule extends AbstractModule {  
  2.   @Override   
  3.   protected void configure() {  
  4.   
  5.      /* 
  6.       * This tells Guice that whenever it sees a dependency on a TransactionLog, 
  7.       * it should satisfy the dependency using a DatabaseTransactionLog. 
  8.       */  
  9.     bind(TransactionLog.class).to(DatabaseTransactionLog.class);  
  10.   
  11.      /* 
  12.       * Similarly, this binding tells Guice that when CreditCardProcessor is used in 
  13.       * a dependency, that should be satisfied with a PaypalCreditCardProcessor. 
  14.       */  
  15.     bind(CreditCardProcessor.class).to(PaypalCreditCardProcessor.class);  
  16.   }  
  17. }  


好了,現(xiàn)在萬事俱備,就讓我們一起看看怎么使用Guice進(jìn)行依賴注入吧:

  1. public static void main(String[] args) {  
  2.    /* 
  3.     * Guice.createInjector() takes your Modules, and returns a new Injector 
  4.     * instance. Most applications will call this method exactly once, in their 
  5.     * main() method. 
  6.     */  
  7.    Injector injector = Guice.createInjector(new BillingModule());  
  8.   
  9.    /* 
  10.     * Now that we've got the injector, we can build objects. 
  11.     */  
  12.    RealBillingService billingService = injector.getInstance(RealBillingService.class);  
  13.    ...  
  14.  }  


以上就是使用Guice的一個(gè)完整的例子,很簡單吧,不需要繁瑣的配置,只需要定義一個(gè)Module來表述接口和實(shí)現(xiàn)類,以及父類和子類之間的關(guān)聯(lián)關(guān)系的綁定。本文不對比guice和spring,只是單純介紹Guice的用法。

三. 綁定方式的介紹

從上面我們可以看出,其實(shí)對于Guice而言,程序員所要做的,只是創(chuàng)建一個(gè)代表關(guān)聯(lián)關(guān)系的Module,然后使用這個(gè)Module即可得到對應(yīng)關(guān)聯(lián)的對象。因此,主要的問題其實(shí)就是在如何關(guān)聯(lián)實(shí)現(xiàn)類和接口(子類和父類)。

1. 在自定義的Module類中進(jìn)行綁定

1.1 在configure方法中綁定

1.1.1 鏈?zhǔn)浇壎?
鏈?zhǔn)浇壎ㄊ亲詈唵?,最直接,也是使用最多的綁定方式?pre>
  1. protected void configure() {  
  2.   bind(TransactionLog.class).to(DatabaseTransactionLog.class);  
  3. }  

就是直接把一種類型的class對象綁定到另外一種類型的class對象,這樣,當(dāng)外界獲取TransactionLog時(shí),其實(shí)返回的就是一個(gè)DatabaseTransactionLog對象。當(dāng)然,鏈?zhǔn)浇壎ㄒ部梢源饋恚纾?/p>

  1. protected void configure() {  
  2.   bind(TransactionLog.class).to(DatabaseTransactionLog.class);  
  3.   bind(DatabaseTransactionLog.class).to(MySqlDatabaseTransactionLog.class);  
  4. }  
這樣,當(dāng)外界請求TransactionLog時(shí),其實(shí)返回的就會是一個(gè)MySqlDatabaseTransactionLog對象。
1.1.2 注解(Annotations)綁定
鏈?zhǔn)浇壎ㄡ槍τ谕瑯拥念愋投冀壎ǖ酵环N目標(biāo)類型時(shí),非常好用,但是對于一個(gè)接口有多種實(shí)現(xiàn)的時(shí)候,鏈?zhǔn)浇壎ň筒缓脜^(qū)分該用哪種實(shí)現(xiàn)了??梢园袮nnotations綁定方式看作是鏈?zhǔn)浇壎ǖ囊环N擴(kuò)展,專門用來解決這種同一個(gè)接口有多種實(shí)現(xiàn)的問題。Annotations綁定又可以分為兩種,一種是需要自己寫Annotations,另外一種則簡化了一些。
1.1.2.1 自己寫Annotations的方式
首先,寫一個(gè)注解
  1. import com.google.inject.BindingAnnotation;  
  2. import java.lang.annotation.Target;  
  3. import java.lang.annotation.Retention;  
  4. import static java.lang.annotation.RetentionPolicy.RUNTIME;  
  5. import static java.lang.annotation.ElementType.PARAMETER;  
  6. import static java.lang.annotation.ElementType.FIELD;  
  7. import static java.lang.annotation.ElementType.METHOD;  
  8.   
  9. @BindingAnnotation @Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)  
  10. public @interface PayPal {}  
然后,使用這個(gè)注解去修飾目標(biāo)字段或參數(shù),如:
  1. public class RealBillingService implements BillingService {  
  2.   
  3.   @Inject  
  4.   public RealBillingService(@PayPal CreditCardProcessor processor,  
  5.       TransactionLog transactionLog) {  
  6.     ...  
  7.   }  
  8. }  
  1. public class RealBillingService implements BillingService {  
  2.   @Inject  
  3.   @Www  
  4.   private CreditCardProcessor processor;  
  5.   ...  
  6. }  

最后,在我們進(jìn)行鏈?zhǔn)浇壎〞r(shí),就可以區(qū)分一個(gè)接口的不同實(shí)現(xiàn)了,如:

  1. bind(CreditCardProcessor.class)  
  2.     .annotatedWith(PayPal.class)  
  3.     .to(PayPalCreditCardProcessor.class);  
這樣,被Annotations PayPal?修飾的CreditCardProcessor就會被綁定到目標(biāo)實(shí)現(xiàn)類PayPalCreditCardProcessor。如果有其他的實(shí)現(xiàn)類,則可把用不同Annotations修飾的CreditCardProcessor綁定到不同的實(shí)現(xiàn)類
1.1.2.2 使用@Named的方式
使用@Named的方式和上面自己寫Annotation的方式很類似,只不過做了相應(yīng)的簡化,不再需要自己去寫Annotation了。
  1. public class RealBillingService implements BillingService {  
  2.   
  3.   @Inject  
  4.   public RealBillingService(@Named("Checkout") CreditCardProcessor processor,  
  5.       TransactionLog transactionLog) {  
  6.     ...  
  7.   }  

直接使用@Named修飾要注入的目標(biāo),并起個(gè)名字,下面就可以把用這個(gè)名字的注解修飾的接口綁定到目標(biāo)實(shí)現(xiàn)類了
  1. bind(CreditCardProcessor.class)  
  2.     .annotatedWith(Names.named("Checkout"))  
  3.     .to(CheckoutCreditCardProcessor.class);  

1.1.3 實(shí)例綁定

上面介紹的鏈?zhǔn)浇壎ㄊ前呀涌诘腸lass對象綁定到實(shí)現(xiàn)類的class對象,而實(shí)例綁定則可以看作是鏈?zhǔn)浇壎ǖ囊环N特例,它直接把一個(gè)實(shí)例對象綁定到它的class對象上。

  1. bind(String.class)  
  2.     .annotatedWith(Names.named("JDBC URL"))  
  3.     .toInstance("jdbc:mysql://localhost/pizza");  
  4. bind(Integer.class)  
  5.     .annotatedWith(Names.named("login timeout seconds"))  
  6.     .toInstance(10);  

需要注意的是,實(shí)例綁定要求對象不能包含對自己的引用。并且,盡量不要對那種創(chuàng)建實(shí)例比較復(fù)雜的類使用實(shí)例綁定,否則會讓應(yīng)用啟動變慢

1.1.4 Provider綁定
在下面會介紹基于@Provides方法的綁定。其實(shí)Provider綁定是基于@Provides方法綁定的后續(xù)發(fā)展,所以應(yīng)該在介紹完基于@Provides方法綁定之后再來介紹,不過因?yàn)镻rovider綁定也是在configure方法中完成的,而本文又是按照綁定的位置來組織的,因?yàn)榫桶裀rovider綁定放在這了,希望大家先跳到后面看過基于@Provides方法的綁定再回來看這段。

在使用基于@Provides方法綁定的過程中,如果方法中創(chuàng)建對象的過程很復(fù)雜,我們就會考慮,是不是可以把它獨(dú)立出來,形成一個(gè)專門作用的類。Guice提供了一個(gè)接口:

  1. public interface Provider {  
  2.   T get();  
  3. }  

實(shí)現(xiàn)這個(gè)接口,我們就會得到專門為了創(chuàng)建相應(yīng)類型對象所需的類:
  1. public class DatabaseTransactionLogProvider implements Provider {  
  2.   private final Connection connection;  
  3.   
  4.   @Inject  
  5.   public DatabaseTransactionLogProvider(Connection connection) {  
  6.     this.connection = connection;  
  7.   }  
  8.   
  9.   public TransactionLog get() {  
  10.     DatabaseTransactionLog transactionLog = new DatabaseTransactionLog();  
  11.     transactionLog.setConnection(connection);  
  12.     return transactionLog;  
  13.   }  
  14. }  

這樣以來,我們就可以在configure方法中,使用toProvider方法來把一種類型綁定到具體的Provider類。當(dāng)需要相應(yīng)類型的對象時(shí),Provider類就會調(diào)用其get方法獲取所需的對象。

其實(shí),個(gè)人感覺在configure方法中使用Provider綁定和直接寫@Provides方法所實(shí)現(xiàn)的功能是沒有差別的,不過使用Provider綁定會使代碼更清晰。而且當(dāng)提供對象的方法中也需要有其他類型的依賴注入時(shí),使用Provider綁定會是更好的選擇。

1.1.5 無目標(biāo)綁定
無目標(biāo)綁定是鏈接綁定的一種特例,在綁定的過程中不指明目標(biāo),如:
  1. bind(MyConcreteClass.class);  
  2. bind(AnotherConcreteClass.class).in(Singleton.class);  

如果使用注解綁定的話,就不能用無目標(biāo)綁定,必須指定目標(biāo),即使目標(biāo)是它自己。如:

  1. bind(MyConcreteClass.class).annotatedWith(Names.named("foo")).to(MyConcreteClass.class);  
  2. bind(AnotherConcreteClass.class).annotatedWith(Names.named("foo")).to(AnotherConcreteClass.class).in(Singleton.class);  


無目標(biāo)綁定,主要是用于與被@ImplementedBy 或者 @ProvidedBy修飾的類型一起用。如果無目標(biāo)綁定的類型不是被@ImplementedBy 或者 @ProvidedBy修飾的話,該類型一定不能只提供有參數(shù)的構(gòu)造函數(shù),要么不提供構(gòu)造函數(shù),要么提供的構(gòu)造函數(shù)中必須有無參構(gòu)造函數(shù)。因?yàn)間uice會默認(rèn)去調(diào)用該類型的無參構(gòu)造函數(shù)。

1.1.6 指定構(gòu)造函數(shù)綁定
在configure方法中,將一種類型綁定到另外一種類型的過程中,指定目標(biāo)類型用那種構(gòu)造函數(shù)生成對象。
  1. public class BillingModule extends AbstractModule {  
  2.   @Override   
  3.   protected void configure() {  
  4.     try {  
  5.       bind(TransactionLog.class).toConstructor(  
  6.           DatabaseTransactionLog.class.getConstructor(DatabaseConnection.class));  
  7.     } catch (NoSuchMethodException e) {  
  8.       addError(e);  
  9.     }  
  10.   }  
  11. }  

這種綁定方式主要用于不方便用注解@Inject修飾目標(biāo)類型的構(gòu)造函數(shù)的時(shí)候。比如說目標(biāo)類型是第三方提供的類型,或者說目標(biāo)類型中有多個(gè)構(gòu)造函數(shù),并且可能會在不同情況采用不同的構(gòu)造函數(shù)。

1.1.7 Built-in綁定
Built-in綁定指的是不用程序員去指定,Guice會自動去做的綁定。目前,Guice所支持的Built-in綁定只有對java.util.logging.Logger的綁定。個(gè)人感覺,所謂的Built-in綁定,只是在比較普遍的東西上為大家?guī)矸奖愕囊环N做法。
  1. @Singleton  
  2. public class ConsoleTransactionLog implements TransactionLog {  
  3.   
  4.   private final Logger logger;  
  5.   
  6.   @Inject  
  7.   public ConsoleTransactionLog(Logger logger) {  
  8.     this.logger = logger;  
  9.   }  
  10.   
  11.   public void logConnectException(UnreachableException e) {  
  12.     /* the message is logged to the "ConsoleTransacitonLog" logger */  
  13.     logger.warning("Connect exception failed, " + e.getMessage());  
  14.   }  

1.2 在@Provides方法中進(jìn)行綁定

當(dāng)你只是需要在需要的時(shí)候,產(chǎn)生相應(yīng)類型的對象的話,@Provides Methods是個(gè)不錯的選擇。方法返回的類型就是要綁定的類型。這樣當(dāng)需要創(chuàng)建一個(gè)該類型的對象時(shí),該provide方法會被調(diào)用,從而得到一個(gè)該類型的對象。
  1. public class BillingModule extends AbstractModule {  
  2.   @Override  
  3.   protected void configure() {  
  4.     ...  
  5.   }  
  6.   
  7.   @Provides  
  8.   TransactionLog provideTransactionLog() {  
  9.     DatabaseTransactionLog transactionLog = new DatabaseTransactionLog();  
  10.     transactionLog.setJdbcUrl("jdbc:mysql://localhost/pizza");  
  11.     transactionLog.setThreadPoolSize(30);  
  12.     return transactionLog;  
  13.   }  
  14. }  

需要注意的是Provide方法必須被@Provides所修飾。同時(shí),@Provides方法綁定方式是可以和上面提到的注解綁定混合使用的,如:
  1. @Provides @PayPal  
  2. CreditCardProcessor providePayPalCreditCardProcessor(  
  3.     @Named("PayPal API key") String apiKey) {  
  4.   PayPalCreditCardProcessor processor = new PayPalCreditCardProcessor();  
  5.   processor.setApiKey(apiKey);  
  6.   return processor;  
  7. }  

這樣一來,只有被@PayPal修飾的CreditCardProcessor對象才會使用provide方法來創(chuàng)建對象,同時(shí)

2. 在父類型中進(jìn)行綁定

2.1 @ImplementedBy

在定義父類型的時(shí)候,直接指定子類型的方式。
這種方式其實(shí)和鏈?zhǔn)浇壎ǖ男Ч峭耆粯拥模皇锹暶鹘壎ǖ奈恢貌煌?br>和鏈?zhǔn)浇壎ú煌氖撬鼈兊膬?yōu)先級,@ImplementedBy實(shí)現(xiàn)的是一種default綁定,當(dāng)同時(shí)存在@ImplementedBy和鏈?zhǔn)浇壎〞r(shí),鏈?zhǔn)浇壎ㄆ鹱饔谩?br>
  1. @ImplementedBy(PayPalCreditCardProcessor.class)  
  2. public interface CreditCardProcessor {  
  3.   ChargeResult charge(String amount, CreditCard creditCard)  
  4.       throws UnreachableException;  
  5. }  

等價(jià)于:

  1. bind(CreditCardProcessor.class).to(PayPalCreditCardProcessor.class);  

2.2 @ProvidedBy

在定義類型的時(shí)候直接指定子類型的Provider類。
  1. @ProvidedBy(DatabaseTransactionLogProvider.class)  
  2. public interface TransactionLog {  
  3.   void logConnectException(UnreachableException e);  
  4.   void logChargeResult(ChargeResult result);  
  5. }  

等價(jià)于:
  1. bind(TransactionLog.class)  
  2.     .toProvider(DatabaseTransactionLogProvider.class);  

并且,和@ImplementedBy類似,@ProvidedBy的優(yōu)先級也比較低,是一種默認(rèn)實(shí)現(xiàn),當(dāng)@ProvidedBy和toProvider函數(shù)兩種綁定方式并存時(shí),后者有效。

3. 在子類型中進(jìn)行注入

3.1 構(gòu)造函數(shù)注入

在構(gòu)造函數(shù)綁定中,Guice要求目標(biāo)類型要么有無參構(gòu)造函數(shù),要么有被@Inject注解修飾的構(gòu)造函數(shù)。這樣,當(dāng)需要創(chuàng)建該類型的對象時(shí),Guice可以幫助進(jìn)行相應(yīng)的綁定,從而生成對象。在Guice創(chuàng)建對象的過程中,其實(shí)就是調(diào)用該類型被@Inject注解修飾的構(gòu)造函數(shù),如果沒要@Inject注解修飾的構(gòu)造函數(shù),則調(diào)用無參構(gòu)造函數(shù)。在使用構(gòu)造函數(shù)綁定時(shí),無需再在Module中定義任何綁定關(guān)系。

這里需要注意的是,Guice在創(chuàng)建對象的過程中,無法初始化該類型的內(nèi)部類(除非內(nèi)部類有static修飾符),因?yàn)閮?nèi)部類會有隱含的對外部類的引用,Guice無法處理。

  1. public class PayPalCreditCardProcessor implements CreditCardProcessor {  
  2.   private final String apiKey;  
  3.   
  4.   @Inject  
  5.   public PayPalCreditCardProcessor(@Named("PayPal API key") String apiKey) {  
  6.     this.apiKey = apiKey;  
  7.   }  

3.2 屬性注入

屬性綁定的目的是告訴Guice,當(dāng)創(chuàng)建該類型的對象時(shí),哪些屬性也需要進(jìn)行依賴注入。用一個(gè)例子來看:
首先,有一個(gè)接口:
  1. package guice.test;  
  2.   
  3. import com.google.inject.ImplementedBy;;  
  4.   
  5. @ImplementedBy (SayHello.class)  
  6. public interface Talk {  
  7.     public void sayHello();  
  8. }  

該接口指明了它的實(shí)現(xiàn)類SayHello
  1. package guice.test;  
  2.   
  3. public class SayHello implements Talk{  
  4.     @Override  
  5.     public void sayHello() {  
  6.         System.out.println("Say Hello!");  
  7.           
  8.     }  
  9. }  

接下來就是屬性注入的例子:
  1. package guice.test;  
  2.   
  3. import com.google.inject.Inject;  
  4.   
  5. public class FieldDI {  
  6.     @Inject  
  7.     private Talk bs;  
  8.   
  9.     public Talk getBs() {  
  10.         return bs;  
  11.     }  
  12. }  


這里面,指明熟悉Talk類型的bs將會被注入。使用的例子是:
  1. package guice.test;  
  2.   
  3. import com.google.inject.Guice;  
  4. import com.google.inject.Injector;  
  5.   
  6. public class Test {  
  7.      public static void main(String[] args) {  
  8.   
  9.             Injector injector = Guice.createInjector(new BillingModule());  
  10.   
  11.               
  12.             FieldDI fdi = injector.getInstance(FieldDI.class);  
  13.             fdi.getBs().sayHello();  
  14.           }  
  15. }  

如果我們沒有用@Inject修飾Talk bs的話,就會得到如下錯誤:
Exception in thread "main" java.lang.NullPointerException

如果我們用@Inject修飾Talk bs了,但是Talk本身沒有被@ImplementedBy修飾的話,會得到如下錯誤:

  1. Exception in thread "main" com.google.inject.ConfigurationException: Guice configuration errors:  
  2.   
  3. 1) No implementation for guice.test.Talk was bound.  
  4.   while locating guice.test.Talk  
  5.     for field at guice.test.FieldDI.bs(FieldDI.java:5)  
  6.   while locating guice.test.FieldDI  
  7.   
  8. 1 error  
  9.     at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)  
  10.     at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)  
  11.     at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)  
  12.     at guice.test.Test.main(Test.java:24)  


另外,屬性注入的一種特例是注入provider。如:

  1. public class RealBillingService implements BillingService {  
  2.   private final Provider processorProvider;  
  3.   private final Provider transactionLogProvider;  
  4.   
  5.   @Inject  
  6.   public RealBillingService(Provider processorProvider,  
  7.       Provider transactionLogProvider) {  
  8.     this.processorProvider = processorProvider;  
  9.     this.transactionLogProvider = transactionLogProvider;  
  10.   }  
  11.   
  12.   public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard) {  
  13.     CreditCardProcessor processor = processorProvider.get();  
  14.     TransactionLog transactionLog = transactionLogProvider.get();  
  15.   
  16.     /* use the processor and transaction log here */  
  17.   }  
  18. }  

其中,Provider的定義如下:
  1. public interface Provider {  
  2.   T get();  
  3. }  


3.3 Setter方法注入

有了上面的基礎(chǔ)我們再來看Setter注入就非常簡單了,只不過在setter方法上增加一個(gè)@Inject注解而已。 還是上面的例子,只是有一點(diǎn)修改:
  1. package guice.test;  
  2.   
  3. import com.google.inject.Inject;  
  4.   
  5. public class FieldDI {  
  6.   
  7.     @Inject  
  8.     public void setBs(Talk bs) {  
  9.         this.bs = bs;  
  10.     }  
  11.   
  12.     private Talk bs;  
  13.   
  14.     public Talk getBs() {  
  15.         return bs;  
  16.     }  
  17. }  

四. 對象產(chǎn)生的Scopes

在默認(rèn)情況下,每次通過Guice去請求對象時(shí),都會得到一個(gè)新的對象,這種行為是通過Scopes去配置的。
Scope的配置使得我們重用對象的需求變得可能。目前,Guice支持的Scope有@Singleton, @SessionScoped, @RequestScoped。
同樣,程序員也可以自定義自己的Scope,本文不涉及自定義scope,如果有興趣,請參考:http://code.google.com/p/google-guice/wiki/CustomScopes

下面我們就以@Singleton舉例說明怎么來告訴Guice我們要以@Singleton的方式產(chǎn)生對象:1. 在定義子類型時(shí)聲明

  1. @Singleton  
  2. public class InMemoryTransactionLog implements TransactionLog {  
  3.   /* everything here should be threadsafe! */  
  4. }  

2.在module的configure方法中做綁定時(shí)聲明
 bind(TransactionLog.class).to(InMemoryTransactionLog.class).in(Singleton.class);
3.在module的Provides方法里聲明
  1. @Provides @Singleton  
  2. TransactionLog provideTransactionLog() {  
  3.   ...  
  4. }  

這里有一點(diǎn)需要注意的是,如果發(fā)生下面的情況:

  1. bind(Bar.class).to(Applebees.class).in(Singleton.class);  
  2. bind(Grill.class).to(Applebees.class).in(Singleton.class);  

這樣一共會生成2個(gè)Applebees對象,一個(gè)給Bar用,一個(gè)給Grill用。如果在上面的配置的情況下,還有下面的配置,
  1. bind(Applebees.class).in(Singleton.class);  

這樣一來,Bar和Grill就會共享同樣的對象了。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android5.0使用反射設(shè)置首選網(wǎng)絡(luò)類型、SIM鎖定解鎖、PIN碼設(shè)置
java編程題:以三種不同方式輸出九九乘法表(java)
基于事件的系統(tǒng)(Event-
java程序中動態(tài)加載jar包并執(zhí)行
Java多線程(二)、線程的生命周期和狀態(tài)控制
Java之美[從菜鳥到高手演練]之JDK動態(tài)代理的實(shí)現(xiàn)及原理
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服