Dagger2基本使用3之其他使用

  • 一,Dagger容器中添加不是Dagger创建的实力对象

在实际使用中,有些类的已经创建好了,dagger需要使用这些类,就需要通过参数传入,下面是android中传入application实例的一个例子

1,创建module

//创建需要传入已经已经创建好的实例类
@Module
public class ContextModule {
    private final Application application;

    //通过构造参数传入
    public ContextModule(Application application) {
        this.application = application;
    }

    @Provides
    Context privodeContext(){
        return application.getApplicationContext();
    }
}
@Module
public class UserModule {
    @Provides
    public User provideUser(Context context){
        return new User(context);
    }
}
public class User {
    public User(Context context) {
        Log.e("User", "new User() Context " + context);
    }

    public User() {
        Log.e("User", "new User()");
    }
}

2,装载到Component

//modules中有指定作用域的,Componet上必须是同一个作用域
//调用dagger的@Component注解,这个里面可以创建多个注解
@Component(modules = {UserModule.class,ContextModule.class})
public interface ApplicationComponent {
    //哪个个类需要注入,这里是MainActivity需要注入含有@Inject的类
    void inject(MainActivity mainActivity);

}

3,传入context

public class DaggerApplication extends Application {
    //这里可以直接定义为static,应为Application生命周期是整个app,这里是在Application创建,告诉Dagger的作用域
    //为整个app
    private static ApplicationComponent applicationComponent;

    public static ApplicationComponent getApplicationComponent() {
        return applicationComponent;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //通过dagger的将自己实例化的类传入dagger容器中,同时传入已经实例的application
        applicationComponent = DaggerApplicationComponent.builder()
                .contextModule(new ContextModule(this)).build();

    }
}

4,调用

public class MainActivity extends AppCompatActivity {
    @Inject
    User user;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("MainActivity", "new onCreate");
        //dagger会自动生成一个Dagger+创建的接口名称的类,初始化注入器
        DaggerApplication.getApplicationComponent().inject(this);
    }
}

执行后打印结果

这里可以看出,User创建的时候传入了context对象,这样就可以调用已经创建好了的实例对象了

  • 二,同一对象多种创建方式

下面是相应写法

修改module,进行关联配置

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

    //通过Named注解来实现对应关系,只需要在在注入对象上添加@Named("UserNone") @Inject注解进行对应关系
    @Named("UserNone")
    @Provides
    public User provideUserNone() {
        return new User();
    }
}

调用关联

public class MainActivity extends AppCompatActivity {
    @Inject
    User user;
    //和对接注解进行关联 @Named("UserNone") @Provides
    @Named("UserNone")
    @Inject
    User user1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("MainActivity", "new onCreate");
        //dagger会自动生成一个Dagger+创建的接口名称的类,初始化注入器
        DaggerApplication.getApplicationComponent().inject(this);
    }
}

打印如下:

这样就通过dagger的方式注入了两个不构造器创建的对象了

  • 3,@Binds注解

1,创建接口module

public interface IUser {
}
public class IUserAImpl implements IUser {
}
@Module
public abstract class IUserModule {

    //提供注入IUser实例
    @Binds
    public abstract IUser bindIUser(IUserAImpl userA);

    //告诉Dagger创建IUser实例
    @Provides
    public static IUserAImpl provideIUserAImple() {
        Log.e("IUserModule", "new IUserAImpl()");
        return new IUserAImpl();
    }
}

2,装载到component上

@Component(modules = {UserModule.class,ContextModule.class,IUserModule.class})
public interface ApplicationComponent {
    //哪个个类需要注入,这里是MainActivity需要注入含有@Inject的类
    void inject(MainActivity mainActivity);

}

3,注入

public class MainActivity extends AppCompatActivity {
    @Inject
    IUser iUser;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("MainActivity", "new onCreate");
        //dagger会自动生成一个Dagger+创建的接口名称的类,初始化注入器
        DaggerApplication.getApplicationComponent().inject(this);
    }
}

打印结果

这里注入的是IUser的实例 IUserAImpl,@Binds的用法完成

你可能感兴趣的:(java,dagger2)