atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29

atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29

 

 

1三 绑定方式的介绍1

2To接口,链式绑定,用的最多的1

3toConstructor1

4toInstance生成的都是单例对象的...3

5toProvider生成非单例对象3

5.2. 注解(Annotations)绑定3

5.3. 实例绑定(str,int绑定)4

5.4. 无目标绑定4

6参考5

 

 

重大的描述

1. 三 绑定方式的介绍

1. 在自定义的Module类中进行绑定

1. configure方法中绑定

1. 11 链式绑定

2. 12 注解Annotations绑定

1. 121 自己写Annotations的方式

2. 122 使用Named的方式

3. 13 实例绑定

4. 14 Provider绑定

5. 15 无目标绑定

6. 16 指定构造函数绑定

7. 17 Built-in绑定

2. Provides方法中进行绑定

2. 在父类型中进行绑定

1. 1 ImplementedBy

2. 2 ProvidedBy

 

2. To接口,链式绑定,用的最多的

 

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

 

3. toConstructor

 

这种绑定方式主要用于不方便用注解@Inject修饰目标类型的构造函数的时候。比如说目标类型是第三方提供的类型,或者说目标类型中有多个构造函数,并且可能会在不同情况采用不同的构造函数。

configure方法中,将一种类型绑定到另外一种类型的过程中,指定目标类型用那种构造函数生成对象

configure方法中,将一种类型绑定到另外一种类型的过程中,指定目标类型用那种构造函数生成对象。 

?

 

1

2

3

4

5

6

7

8

9

10

11

public class BillingModule extends AbstractModule {

  @Override

  protected void configure() {

    try {

      bind(TransactionLog.class).toConstructor(

          DatabaseTransactionLog.class.getConstructor(DatabaseConnection.class));

    } catch (NoSuchMethodException e) {

      addError(e);

    }

  }

}

 

这种绑定方式主要用于不方便用注解@Inject修饰目标类型的构造函数的时候。比如说目标类型是第三方提供的类型,或者说目标类型中有多个构造函数,并且可能会在不同情况采用不同的构造函数。

 

4. toInstance生成的都是单例对象的...

toInstancenew object();

5. toProvider生成非单例对象

 

5.1.1.1.1. Provider绑定

在下面会介绍基于@Provides方法的绑定。其实Provider绑定是基于@Provides方法绑定的后续发展,所以应该在介绍完基于@Provides方法绑定之后再来介绍,不过因为Provider绑定也是在configure方法中完成的,而本文又是按照绑定的位置来组织的,因为就把Provider绑定放在这了,希望大家先跳到后面看过基于@Provides方法的绑定再回来看这段。

在使用基于@Provides方法绑定的过程中,如果方法中创建对象的过程很复杂,我们就会考虑,是不是可以把它独立出来,形成一个专门作用的类。Guice提供了一个接口:

 

 

 bd.bind(Connection.class).toProvider(new Provider<Connection>(){

 

@Override

public Connection get() {

//SessionFactory sessionFactory = HibernateSessionFactory.getSessionFactory();

//Connection c=SessionFactoryUtils.getDataSource(sessionFactory ).getConnection();

 try {

return new Hb4JdbcX().getConnection();

catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

throw new RuntimeException(e);

}

}});

5.1. 注解(Annotations)绑定

链式绑定针对于同样的类型都绑定到同一种目标类型时,非常好用,但是对于一个接口有多种实现的时候,链式绑定就不好区分该用哪种实现了。可以把Annotations绑定方式看作是链式绑定的一种扩展,专门用来解决这种同一个接口有多种实现的问题。Annotations绑定又可以分为两种,一种是需要自己写Annotations,另外一种则简化了一些。

 

5.2. 实例绑定(str,int绑定)

上面介绍的链式绑定是把接口的class对象绑定到实现类的class对象,而实例绑定则可以看作是链式绑定的一种特例,它直接把一个实例对象绑定到它的class对象上。

[java] view plaincopy

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);  

 

 

5.3. 无目标绑定

无目标绑定是链接绑定的一种特例,在绑定的过程中不指明目标,如:

[java] view plaincopy

1. bind(MyConcreteClass.class);  

2. bind(AnotherConcreteClass.class).in(Singleton.class);  

 

如果使用注解绑定的话,就不能用无目标绑定,必须指定目标,即使目标是它自己。如:

[java] view plaincopy

1. bind(MyConcreteClass.class).annotatedWith(Names.named("foo")).to(MyConcreteClass.class);  

2. bind(AnotherConcreteClass.class).annotatedWith(Names.named("foo")).to(AnotherConcret

 

 

无目标绑定,主要是用于与被@ImplementedBy 或者 @ProvidedBy修饰的类型一起用。如果无目标绑定的类型不是被@ImplementedBy 或者 @ProvidedBy修饰的话,该类型一定不能只提供有参数的构造函数,要么不提供构造函数,要么提供的构造函数中必须有无参构造函数。因为guice会默认去调用该类型的无参构造函数

 

5.3.1.1.1. Built-in绑定

Built-in绑定指的是不用程序员去指定,Guice会自动去做的绑定。目前,Guice所支持的Built-in绑定只有对java.util.logging.Logger的绑定。个人感觉,所谓的Built-in绑定,只是在比较普遍的东西上为大家带来方便的一种做法。

6. 参考

Atitit.guice3 ioc 最佳实践 o9o 

 

Google-Guice入门介绍 - Derekjiang的笔记簿 博客频道 - CSDN.NET.htm

 

posted @ 2016-01-01 18:59  attilaxAti  阅读(27)  评论(0编辑  收藏  举报