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那個注解綁定,用於綁定屬性常量也很方便。
