美文网首页
[Guice] 4 注入

[Guice] 4 注入

作者: LZhan | 来源:发表于2019-08-10 17:36 被阅读0次

入口:绑定
出口:@Inject
一般使用构造函数注入(成员变量注入不常用):
<1> 使用final来区分denpendency和状态(其他一般会改变的成员变量)
<2> 注入时不考虑如何实现或绑定
使用@Inject指明需要guice注入的类,并在某个继承AbstractModule类中的configure方法中使用bind来绑定

成员变量注入:
<1> 用于测试
<2> 使用injectMembers来注入测试用例


image.png

其他注入:
<1> 注入Provider

public interface Provider<T>{
    T get();
}

使用场景:
a、懒加载(例如数据库连接),在使用到数据库连接的时候再去加载,没有必要放到构造函数中,初始化时就去加载;
b、get() 场景下有多个实例

那么如何注入Provider?
向Guice请求Provider,不论如何绑定,例如:

DatabaseConnection dbConn

Provider<DatabaseConnection> dbConnProvider

无需自己实现Provider,并且Guice会考虑对象生命周期;但是如果想要的Provider很复杂,也可以自己实现Provider

在MyService接口上添加@ProvidedBy(MyProvider.class),等价于binder.bind(MyService.class).toProvider(MyProvider.class);
或者是在moudule类中使用@Provides注解

注解@Provides:
当使用@Provides方法创建对象时,该方法必须定义在Module类中,并且它必须加以@Provides注解;
该方法的返回值类型就是被绑定的对象.当注入器需要该类型的实例时,它就会来调用该方法.
与@Provider的区别:
@Provides方法绑定方式是可以和注解绑定混合使用的。如果在@Provides方法上有绑定注解(@AnnotationOne),Guice以绑定注解优先。Guice在调用@Provides方法之前会先解析该方法的依赖

总结:使用Provider进行注入的时候,你定义了一个Provider<T> 的变量,并放在构造函数中初始化;当然也可以不放在构造函数中,可以使用@Providedby注解,放在实现类上

方式1:在构造函数中初始化

public class StringWritingApplet implements MyApplet {


    private MyDestination myDestination;
    private Provider<String> stringProvider;

    @Inject
    public StringWritingApplet(MyDestination myDestination,/*@Output*/ Provider<String> stringProvider) {
        this.myDestination = myDestination;
        this.stringProvider= stringProvider;

    }

    private void writeString() {
        myDestination.write(stringProvider.get());
    }

    public void run() {
        writeString();
    }
}

另外在module中绑定:


image.png

或者使用@Provides

这里的绑定靠的是返回类型,因为定义的是Provider<String>,所以bind(String.class)

方式2:使用toProvider或者注解@ProvidedBy
这种方式也叫 Class-style Provider

//定义一个实现了Provider的实现类
public class MyProvider implements Provider<String> {
    @Override
    public String get() {
        return "Hello MyProvider";
    }
}

在module中:


image.png

@ProvidedBy(),一般是定义在接口类上T的,参数是实现了Provider<T>的类,这里因为是String类型的,不做示例。

相关文章

网友评论

      本文标题:[Guice] 4 注入

      本文链接:https://www.haomeiwen.com/subject/itzljctx.html