• 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那个注解绑定,用于绑定属性常量也很方便。

  • 相关阅读:
    Divide and conquer:Matrix(POJ 3685)
    Divide and conquer:Median(POJ 3579)
    Divide and conquer:K Best(POJ 3111)
    Android studio——RelativeLayout(相对布局)
    javascript简单介绍
    假期学习2/3
    Android studio——LinearLayout(线性布局)
    假期学习2/2
    Javascript正则表达式
    假期学习2/1
  • 原文地址:https://www.cnblogs.com/huzi007/p/5799441.html
Copyright © 2020-2023  润新知