Dagger2 备忘录

本文详细介绍了Dagger依赖注入框架的基本概念与使用方法,包括@Inject、@Module、@Provides、@Component和@Scope等注解的含义及应用场景,并通过实例展示了如何在Android应用中进行依赖注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。

@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。

@Provides: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。

@Component: Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的   @Modules组成该组件,如 果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的modules知道依赖的范围。

@Scope: Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没必要让每个对象都去了解如何管理他们的实例。

1.编写Module : 类需要用@Module注解来标示,用@Provides注解的函数需要以provide开头,这里是根据返回值类型来标识的,方法名并不重要,只需要保证以provide开头即可。

2.编写Component:用@Component注解来标识,同时声明了modules,然后提供了一个方法,叫做inject,用来在Activity中注入。

3.AndroidStudio -> Build -> Make Project:生成一个DaggerActivityComponent,配置Builder。

4.Inject 相关依赖

通过@Singleton实现缓存:

1.在Module对应的Provides方法标明@Singleton 
2.同时在Component类标明@Singleton 

自定义Scope:

@Scope
@Documented
@Retention(RUNTIME)
public @interface PerApp{}
@Scope
@Documented
@Retention(RUNTIME)
public @interface PerActivity{}
@Scope
@Documented
@Retention(RUNTIME)
public @interface PerApp{}

@Module
class MachineModule{
    @PerApp//1.添加@PerApp标明该方法产生只产生一个实例
    @Provides
    Machine provideFruitJuiceMachine(){
        return new FruitJuiceMachine();
    }
}

@PerApp//2.添加@PerApp标明该Component中有Module使用了@PerApp
@Component(modules=MachineModule.class)
class JuiceComponent{
    void inject(Container container)
}

//3.单例的有效范围随着其依附的Component,为了使得@PerApp的作用范围是整个Application,你需要添加以下代码
public class CustomApp extends Application{
    private static JuiceComponent mComponent;// 注意是静态
    public void onCreate(){
        mComponent=DaggerJuiceComponent.create();
    }
    public static JuiceComponent getComponent(){ //供给调用
        return mComponent;
    }
}

依赖的Component间不能使用相同的Scope。

Subcomponent:

//父Component:
@PerApp
@Component(modules=××××)
public AppComponent{
    SubComponent subcomponent();  //1.只需要在父Component添加返回子Component的方法即可
}

//子Component:
@PerAcitivity   //2.注意子Component的Scope范围小于父Component
@Subcomponent(modules=××××)   //3.使用@Subcomponent
public SubComponent{
    void inject(SomeActivity activity); 
}

//使用
public class SomeActivity extends Activity{
    public void onCreate(Bundle savedInstanceState){
        ...
        App.getComponent().subCpmponent().inject(this);//4.调用subComponent方法创建出子Component
    }    
}

Lazy用于延迟加载,Provide用于强制重新加载:

public class Container{
    @Inject Lazy<Fruit> lazyFruit; //注入Lazy元素
    @Inject Provider<Fruit> providerFruit; //注入Provider元素
    public void init(){
        DaggerComponent.create().inject(this);
        Fruit f1=lazyFruit.get();  //在这时才创建f1,以后每次调用get会得到同一个f1对象
        Fruit f2=providerFruit.get(); //在这时创建f2,以后每次调用get会再强制调用Module的Provides方法一次,根据Provides方法具体实现的不同,可能返回跟f2是同一个对象,也可能不是。
    }
}

Thanks to http://blog.youkuaiyun.com/duo2005duo/article/details/50696166

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值