dagger2的使用2

@Component注解中的dependencies使用

如果一个Component需要另一个Component提供注入的类,那么就可以使用dependencies来实现,打个比喻,如果有三个容器A,B,C,AB有化学液体,C中没有,现在C需要A和B中的化学液体,那么就需要A的注射器将A注射到C中,B的注射器将B注射到C中,这里就是比如一下,也许会有点不恰当。话不多说直接上代码来体会(我是接着上一篇文章写的 如果没看上一篇文章,请移步dagger2的使用
现在我们接着新建一个类AppInfo,这里是模拟一个第三方类,第三方类的构造函数没有加@Inject注解

public class AppInfo {
    private String retrofit;
    public AppInfo(String retrofit) {
        this.retrofit = retrofit;
    }

    public String getRetrofit() {
        return retrofit;
    }

    public void setRetrofit(String retrofit) {
        this.retrofit = retrofit;
    }
}

新建一个AppModule来提供一个全局使用的Module

@Module
public class AppModule {
//由于构造函数没有@Inject,所以我们直接提供这个类
    @Provides
    public AppInfo provideRetrofit(){
        return new AppInfo("retrofit");
    }
}

新建一个接口AppComponent

@Component(modules = AppModule.class)
public interface AppComponent {
//注入一个AppInfo
      AppInfo getAppInfo(); 
}

我们rebuild一下,自动生成AppModule的实现类,然后我们修改MainActivity中的代码

public class MainActivity extends AppCompatActivity {
@Inject
User user;
@Inject
AppInfo appInfo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       //这里发生了改动,加入了DaggerAppComponent.builder().build(),可以这样理解
      DaggerMainActivityUser.builder().appComponent(DaggerAppComponent.builder().build()).build().inject(this);
      Log.i("msg","appInfo的输出"+appInfo.getRetrofit());
        Log.i("msg","user的输出"+user.getUserName());
    }
}

下面是打印的结果:
I/msg: appInfo的输出retrofit
user的输出provideName

我们发现注入成功了

@Named注解使用,如果一个类里面同时需要注入两个相同类型的类,那该怎么办啊,这里就可以用@Name进行标记

修改MainActivityModule,提供两个User

 @Module
public class MainActivityModule {
    @Provides
    @Named("userOne")
    public User provideUserName(){
        return new User("provideNameOne");
    }
    @Provides
    @Named("userTwo")
    public User provideUserName2(){
        return new User("provideNameTwo");
    }
}

修改MainActivity中的代码

 public class MainActivity extends AppCompatActivity {
 //这里接受@Named为userOne的注入
@Inject
@Named("userOne")
User user;
   //这里接受@Named为userTwo的注入
@Inject
@Named("userTwo")
User user2;
@Inject
AppInfo appInfo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      //  DaggerMainActivityUser.builder().mainActivityModule(new MainActivityModule()).build().inject(this);
      DaggerMainActivityUser.builder().appComponent(DaggerAppComponent.builder().build()).build().inject(this);
      Log.i("msg","userOne的输出"+user.getUserName());
        Log.i("msg","userTwo的输出"+user2.getUserName());
    }
}

查看一下打印的日志
I/msg: userOne的输出provideNameOne
userTwo的输出provideNameTwo

@Singleton注解,标注为该类的生成是单例模式,直接上代码

修改MainActivityModule的代码

@Module
public class MainActivityModule {
//单例模式的标注
   @Singleton
    @Provides
    public User provideUserName(){
        return new User("provideNameOne");
    }
}

修改Component接口MainActivityUser

//单例标注,没错,这个地方也要
@Singleton
@Component(dependencies = AppComponent.class,modules = MainActivityModule.class)
public interface MainActivityUser {
     void inject(MainActivity mainActivity);
}

修改MainActivity中的代码

public class MainActivity extends AppCompatActivity {
@Inject
User user;
@Inject
User user2;
@Inject
AppInfo appInfo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      DaggerMainActivityUser.builder().appComponent(DaggerAppComponent.builder().build()).build().inject(this);
      Log.i("msg","userOne的输出"+user.hashCode());
        Log.i("msg","userTwo的输出"+user2.hashCode());
    }
}

查看一下打印的日志
I/msg: userOne的输出290606403
userTwo的输出290606403

生成了两个相同引用的User

Lazy懒加载的使用

我们修改MainActivity中的代码
public class MainActivity extends AppCompatActivity {
@Inject
Lazy<User> user2;
@Inject
AppInfo appInfo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      DaggerMainActivityUser.builder().appComponent(DaggerAppComponent.builder().build()).build().inject(this);
        Log.i("msg","userTwo的输出"+user2.get().getUserName());
    }
}

懒加载就是使用的时候才进行加载,使用到user2的时候才会实例化user2,然后通过.get()获得user2,有点像弱引用的用法

好啦 ,关于dagger的简单实用就到这里了,dagger经常和mvp框架配合使用,所以想使用的读者可以用合适的姿势使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值