- 一,Dagger容器中添加不是Dagger创建的实力对象
在实际使用中,有些类的已经创建好了,dagger需要使用这些类,就需要通过参数传入,下面是android中传入application实例的一个例子
1,创建module
//创建需要传入已经已经创建好的实例类
@Module
public class ContextModule {private final Application application;//通过构造参数传入public ContextModule(Application application) {this.application = application;}@ProvidesContext privodeContext(){return application.getApplicationContext();}
}
@Module
public class UserModule {@Providespublic 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的作用域//为整个appprivate static ApplicationComponent applicationComponent;public static ApplicationComponent getApplicationComponent() {return applicationComponent;}@Overridepublic void onCreate() {super.onCreate();//通过dagger的将自己实例化的类传入dagger容器中,同时传入已经实例的applicationapplicationComponent = DaggerApplicationComponent.builder().contextModule(new ContextModule(this)).build();}
}
4,调用
public class MainActivity extends AppCompatActivity {@InjectUser user;@Overrideprotected 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 {@Providespublic User provideUser(Context context) {return new User(context);}//通过Named注解来实现对应关系,只需要在在注入对象上添加@Named("UserNone") @Inject注解进行对应关系@Named("UserNone")@Providespublic User provideUserNone() {return new User();}
}
调用关联
public class MainActivity extends AppCompatActivity {@InjectUser user;//和对接注解进行关联 @Named("UserNone") @Provides@Named("UserNone")@InjectUser user1;@Overrideprotected 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,@Binder注解