Dagger2入门

先来看个Demo

在MainActivity里面注入User

public class MainActivity extends Activity {
    @Inject
    User user;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //此类由dagger2框架生成
        DaggerUserComponent.builder().build().inject(this);
        Log.d("MainActivity", "User is " + user.toString);
    }
}

public class User {
    private String userName;
}

@Module
public class UserModule {
    @Provides
    User provideUser() {
        return new User();
    }
}

@Component(modules = {UserModule.class})
public interface UserActivityComponent {
    void inject(MainActivity activity);
}

MainActivity被注入类,只要将对应变量加上@Inject注解,并在初始化调用dagger2生成的注入代码,如:DaggerUserComponent.builder().build().inject(this);

UserModule提供被注入的类的实例创建,用@Module注解,创建实例的方法用@Provides注解

UserActivityComponent这个为连接被注入类(MainActivity)和实例创建类(UserModule)的桥梁,@Component(modules = {UserModule.class})这个注解为连接过程

OK 以上是简单Demo介绍

Dagger2核心组件

@Inject

顾名思义就是注入,可以注入实例变量构造方法,上面的Demo没有体现构造方法注入,等同于如下:

public class User {
    private String userName;
    //注解构造方法
    @Inject
    public User() {
    }
}
//这里就不需要UserModule
@Component
public interface UserActivityComponent {
    void inject(MainActivity activity);
}

有了注解构造方法后,这里的Component就不用提供UserModule了,因为框架会自动调用注解构造方法生成实例

@Module and @Provides

Module可以理解为一个工厂类,提供实例的创建,Provides用于标记提供示例创建的方法,比如上面的provideUser()方法。

@Component

它是一个接口,用于连接被注入的类和实例创建类,框架会根据此接口生成一系列模板代码,来实现整个注入流程。注解示例:@Component(modules = {UserModule.class})

@Scope

上面Demo中没有用到,但它非常有用,Scopes可是非常的有用,可以理解为注解作用域。Dagger2只提供了唯一的@Singleton,这里需要注意的是Component和Module中provides方法上的Scope必须相同,在Module的Scope是用在provide方法上,Component的Scope注解在类上,如下:

@Module
public class UserModule {
    @Singleton
    @Provides
    User provideUser() {
        return new User();
    }
}

//Scope必须同Module
@Singleton
@Component(modules = {UserModule.class})
public interface UserActivityComponent {
    void inject(MainActivity activity);
}

Dagger2的优点

  • 解耦: 依赖注入独立于组件之外,注入的对象在一个独立、不耦合的地方初始化,这样在改变注入对象时,我们只需要修改对象的实现方法,而不用改上层代码。

  • 灵活: 依赖可以注入到一个组件中:我们可以注入这些依赖的模拟实现,这样使得测试更加简单。

  • 方便管理: 不需要知道有关实例创建和生命周期,这些由我们的依赖注入框架管理的。

Android里配置Dagger2

//在项目根目录的build.gradle添加classpath
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

//在module build.gradle添加插件
apply plugin: 'com.neenbedankt.android-apt'

//并添加依赖库
dependencies {    
    compile 'com.google.dagger:dagger:2.7'
    apt 'com.google.dagger:dagger-compiler:2.7'
}

你可能感兴趣的:(Dagger2入门)