Dagger2 - 渐入二(提高)

背景

在前一篇 Daager2-初认识一 中咱们认识了简单的Dagger2的使用和依赖注入的优势,这章继续深刻的研究和学习Dagger2的使用,后续会结合mvp主流框架给你们一步步讲解如何运用dagger2封装大项目的开发框架!html

Daager2-初认识一java


Component提供依赖

上一节咱们讲解了moudel的依赖方法,其实Component也能够提供依赖实现以下:缓存


实现

1.建立一个新的数据对象,提供Component以来演示

public class Info {
    private String msg;
}复制代码

2.经过传值建立对应的module对象

@Module
public class InfoModule {
    private String name;

    public InfoModule(String name) {
        this.name = name;
    }

    @Provides
    Info provideInfo(){
        return new Info(name);
    }
}复制代码

3.实现依赖的InfoComponent

由于InfoComponent 不须要注入activity使用,因此不用写对应的inject方法,直接提供Info 回调便可框架

@Component(modules = {InfoModule.class})
public interface InfoComponent {
    Info infoMoudule();
}复制代码

对比ide

@Component(modules = UserModule.class)
public interface UserComponent {
    void inject(MainActivity mainActivity);
}复制代码

4.将InfoComponent 提供依赖给UserComponent

使用dependencies 标识依赖Component 对象post

@Component(modules = UserModule.class,dependencies = InfoComponent.class)
public interface UserComponent {

    void inject(MainActivity mainActivity);
}复制代码

5.activity中实现依赖注入

和以前注入方法同样,不过这里多出了infoComponent方法(自动生成)提供component依赖,成功之后咱们能够@Inject获得一个Info 对象学习

public class MainActivity extends AppCompatActivity {
    @Inject
    User user;
    @Inject
    Info info;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InfoComponent infoComponent= DaggerInfoComponent.builder().infoModule(new InfoModule("AAAAA")).build();
        UserComponent  component= DaggerUserComponent.builder().userModule(new UserModule()).infoComponent(infoComponent).build();
        component.inject(this);
        TextView textView=(TextView)findViewById(R.id.tv);
        textView.setText("name:"+user.getName()+"\nsex:"+user.getSex()+"\nads:"+user.getAds()+"\ninfo->>>"+info.getMsg());
    }
}复制代码

效果

这里写图片描述


提高

到目前为止咱们已经学习了两种依赖方式一种是moudel一种是component,基本已经知足了平常的使用,接下来咱们提高学习一些更加有用的注解方法ui


@Scope用法

Scopes但是很是的有用,Dagger2能够经过自定义注解限定注解做用域;其实这里就是生命周期的 意思,咱们能够经过@Scopes类定义一个componet或者module的生命周期,好比咱们须要让依赖的对象和咱们的activity生命周期同样,自动销毁this

使用

经过@Scope咱们定义了一个@interface PerApp注解,经过这个注解咱们能够标示一个对象的生命周期!spa

@Scope
@Documented
@Retention(RUNTIME)
public @interface PerApp {
}复制代码

运用:

@PerApp
@Component(modules = UserModule.class,dependencies = InfoComponent.class)
public interface UserComponent {
    void inject(MainActivity mainActivity);
}复制代码

@Singleton

@Singleton标示当前方法和对象是单利模式

@PerApp
@Singleton
@Component(modules = UserModule.class,dependencies = InfoComponent.class)
public interface UserComponent {
    void inject(MainActivity mainActivity);
}复制代码
@Module
public class UserModule {

    @Provides
    @Singleton
    User provideUser(){
        return new User("xxxx","SEX","XXX@Gmail.com");
    }
}复制代码

经过两章基础学习,咱们已经掌握了dagger2的基本用法,在此基础上已经能够自由扩展咱们的框架了;好比如今要封装一个这样的框架:咱们经过dagger2依赖去构建一个component依赖,提供了全局的开发中的公用对象:图片管理器;缓存;服务;http请求..............
咱们能够经过component依赖注入到须要使用的activity中,实现dagger2全局依赖的效果!

大体结构

@Singleton
@Component(modules = {AppModule.class, ClientModule.class, ServiceModule.class, ImageModule.class, CacheModule.class})
public interface AppComponent {
    Application Application();

    //服务管理器,retrofitApi
    ServiceManager serviceManager();

    //缓存管理器
    CacheManager cacheManager();

    //Rxjava错误处理管理类
    RxErrorHandler rxErrorHandler();

    //用于请求权限,适配6.0的权限管理
    RxPermissions rxPermissions();

    OkHttpClient okHttpClient();

    //图片管理器,用于加载图片的管理类,默认使用glide,使用策略模式,可替换框架
    ImageLoader imageLoader();

    //gson
    Gson gson();
}复制代码

你们能够自由想象,自由设计,赶忙将dagger2运用到你的项目中吧!装逼开始了


专栏

注解专栏


源码

源码传送门


建议

若是你有任何的问题和建议欢迎加入QQ群告诉我!

相关文章
相关标签/搜索