Dagger2基本使用3之其他使用
2023-12-16 14:41:10
- 一,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,@Binder注解
文章来源:https://blog.csdn.net/luck_xiang/article/details/135030068
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!