guice基本使用,常用的綁定方式(四)


guice在moudle中提供了良好的綁定方法。

它提供了普通的綁定,自定義注解綁定,按名稱綁定等。

 

下面直接看代碼:

 1 package com.ming.user.test;
 2 
 3 import com.google.inject.AbstractModule;
 4 import com.google.inject.name.Names;
 5 
 6 /**
 7  * 繼承 AbstractModule這個抽象類
 8  * @author mingge
 9  *
10  */
11 public class TestModule extends AbstractModule{
12 
13     @Override
14     protected void configure() {
15         
16         //普通綁定
17         bind(Dog.class).to(DarkDog.class);
18         
19         //自定義注解綁定--一個接口可以多個實現
20         bind(Dao.class).annotatedWith(CSV.class).to(DaoImpl.class);
21         bind(Dao.class).annotatedWith(CSV1.class) .to(DaoImpl2.class);
22         
23         //names注解常量綁定--也可用於一個接口多個實現的綁定
24         bindConstant().annotatedWith(Names.named("maxResults")).to(10);//類似於綁定了一個常量
25         
26     }
27 }

 

類似與普通綁定,很簡單:

1 package com.ming.user.test;
2 
3 public class Dog {
4     
5     void eat(){
6         System.out.println("父類的在go,go,go。。。");
7     }
8 }
 1 package com.ming.user.test;
 2 
 3 public class DarkDog extends Dog{
 4 
 5     @Override
 6     void eat() {
 7         System.out.println("heeeelo");
 8         //super.eat();
 9     }
10 
11     
12 }

 

類似與注解綁定:

 1 package com.ming.user.test;
 2 
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 
 8 import com.google.inject.BindingAnnotation;
 9 
10 
11 /**
12  * 自定義一個綁定注解
13  * @author mingge
14  *
15  */
16 @BindingAnnotation
17 @Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.METHOD})
18 @Retention(RetentionPolicy.RUNTIME)
19 public @interface CSV {
20     String value() default "";
21 }
 1 package com.ming.user.test;
 2 
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 
 8 import com.google.inject.BindingAnnotation;
 9 
10 /**
11  * 自定義一個綁定注解
12  * @author mingge
13  *
14  */
15 @BindingAnnotation
16 @Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.METHOD})
17 @Retention(RetentionPolicy.RUNTIME)
18 public @interface CSV1 {
19 
20 }

然后是一個接口,兩個實現:

1 package com.ming.user.test;
2 
3 public interface Dao {
4     
5     void testGuice();
6 }
 1 package com.ming.user.test;
 2 
 3 import com.google.inject.Singleton;
 4 
 5 @Singleton
 6 public class DaoImpl implements Dao{
 7 
 8     @Override
 9     public void testGuice() {
10         
11         System.out.println("測試guice,實現依賴!");
12         
13     }
14 
15 }
 1 package com.ming.user.test;
 2 
 3 public class DaoImpl2 implements Dao{
 4 
 5     @Override
 6     public void testGuice() {
 7         
 8         System.out.println("第二個實現耶....");
 9         
10     }
11 
12     
13 }

 

最后就是通過guice自定義的Name方式綁定:

 1 package com.ming.user.test;
 2 
 3 import com.google.inject.Inject;
 4 import com.google.inject.Singleton;
 5 import com.google.inject.name.Named;
 6 
 7 /**
 8  * 測試幾種注入方式
 9  * @author mingge
10  *
11  */
12 @Singleton
13 public class TestDaoInjection {
14 
15     
16     private Dao dao;
17     
18     @Inject
19     @CSV1
20     private Dao dao1;
21     
22     @Inject
23     public void setDao(@CSV Dao dao) {//自定義注解綁定實現
24         this.dao = dao;
25     }
26 
27     private int maxResults;
28     
29     @Inject
30     public void setMaxResults(@Named("maxResults") int maxResults) {//按名稱綁定
31         this.maxResults = maxResults;
32     }
33 
34     @Inject
35     private Dog dog;//普通注入
36     
37     void test(){
38         System.out.println("這個是注入...");
39         dao.testGuice();
40         System.out.println(maxResults);
41         dog.eat();
42         
43         dao1.testGuice();
44     }
45 }

測試代碼:

 1 package com.ming.user.test;
 2 
 3 import com.google.inject.Guice;
 4 import com.google.inject.Injector;
 5 
 6 
 7 public class Test {
 8     
 9     public static void main(String[] args) {
10          Injector injector = Guice.createInjector(new TestModule());  
11          TestDaoInjection test=injector.getInstance(TestDaoInjection.class);
12          test.test();
13     }
14 }

 

使用provider 

在 Guice 中 Providers 就像 Factories 一樣創建和返回對象。在大部分情況下,客戶端可以直接依賴 Guice 框架來為服務(Services)創建依賴的對象。但是少數情況下,應用程序代碼需要為一個特定的類型定制對象創建流程(Object creation process),這樣可以控制對象創建的數量,提供緩存(Cache)機制等,這樣的話我們就要依賴 Guice 的 Provider 類。

 1 package com.ming.user.test.provide;
 2 
 3 import com.google.inject.ProvidedBy;
 4 
 5 @ProvidedBy(ConnectionProvider.class)
 6 public interface ConnectionI {
 7     
 8     void open();
 9     
10     void close();
11 }
 1 package com.ming.user.test.provide;
 2 
 3 import com.google.inject.Provider;
 4 
 5 public class ConnectionProvider implements Provider<ConnectionI> {
 6 
 7     @Override
 8     public ConnectionI get() {
 9         ConnectionI c=new MockConnection();
10         return c;
11     }
12 
13     
14 }
 1 package com.ming.user.test.provide;
 2 
 3 public class MockConnection implements ConnectionI{
 4 
 5     public void open(){
 6         System.out.println("open...");
 7     }
 8     
 9     public void close(){
10         System.out.println("close...");
11     }
12 }
 1 package com.ming.user.test;
 2 
 3 import com.google.inject.AbstractModule;
 4 import com.ming.user.test.provide.ConnectionI;
 5 import com.ming.user.test.provide.ConnectionProvider;
 6 
 7 /**
 8  * 繼承 AbstractModule這個抽象類
 9  * @author mingge
10  *
11  */
12 public class TestModule extends AbstractModule{
13 
14     @Override
15     protected void configure() {
16         
17         //實現Provider接口的綁定
18         bind(ConnectionI.class).toProvider(ConnectionProvider.class);
19     }
20     
21 }
 1 package com.ming.user.test;
 2 
 3 import com.google.inject.Guice;
 4 import com.google.inject.Injector;
 5 import com.ming.user.test.provide.MockConnection;
 6 
 7 
 8 public class Test {
 9     
10     public static void main(String[] args) {
11          Injector injector = Guice.createInjector(new TestModule());  
12          MockConnection test=injector.getInstance(MockConnection.class);
13          test.open();
14          test.close();
15     }
16 }

 

 

Summary一下:普通綁定用得最多,name那個方法綁定用於多個接口實現,自定注解那種按特殊情況使用。說明一下,name那個注解綁定,用於綁定屬性常量也很方便。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM