- 一,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的用法完成