Dagger2基本使用3之其他使用

  • 一,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注解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/279158.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于技术架构的思考

技术选型实则是取舍的艺术 这句话是我偶然在一篇技术架构方面的文章上看到的,每当我需要给新项目进行技术选型,决定技术架构时,一直坚信的。 当我们做技术选型时,需要考虑的东西非常多。比如,用关系型数据库还是非关…

uniapp之屏幕右侧出现滚动条去掉、隐藏、删除【好用!】

目录 问题解决大佬地址最后 问题 解决 在最外层view上加上class“content”;输入以下样式。注意:两个都必须存在在生效。 .content {/* 跟屏幕高度一样高,不管view中有没有内容,都撑开屏幕高的高度 */height: 100vh; overflow: auto; } .content::-webkit-scrollb…

自动化测试(三)webdriver的常用api(1)

目录 等待 sleep休眠 隐式等待 显式等待 打印信息 打印title 打印url 浏览器的操作 浏览器最大化 设置浏览器宽、高 操作浏览器的前进、后退 控制浏览器滚动条 键盘事件 键盘按键用法 键盘组合键用法 鼠标事件 定位一组元素 前面两章我们讲了selenium环境的…

cmake 从零开始源码安装(Ubuntu系统)

Ubuntu 系统安装 1、安装编译工具和依赖库 ## 必要的 sudo apt install gsudo apt install make## 与make 同等级的构建工具,为了演示而安装的 sudo apt install ninja-build## 压缩工具库 sudo apt install unzip## 加密和传输(根据系统名称可能不一样…

Spring之IOC容器的自动转配原理

上文我们介绍了spring boot是如何启动的,那么bean的自动装配发生在第四个大阶段容器填充 自动装配bean供分为12个小步骤 第一步,通过prepareRefresh方法,在已有的系统环境上准备servlet相关的环境Environment,其他的环境配置在第…

如何使用mysql去除表中重复的字段

简介: 此处的建表题目来自我们的也门哥Maged,非常感谢他出的这些测试题目,让我能够独立思考,反复试去找到cw2的正确做法。 数据库准备: 害怕被好homi被刺然后被 academic warning 所以浅浅打个码。 创建好这张表后我…

【LeetCode刷题】-- 133.克隆图

133.克隆图 本题就是遍历整个图&#xff0c;遍历的时候要记录已经访问过的节点 方法一&#xff1a;深度优先搜索 /* // Definition for a Node. class Node {public int val;public List<Node> neighbors;public Node() {val 0;neighbors new ArrayList<Node>(…

【第3期】Springboot集成SpringSecurity+RSA+ECS免密登录

本期简介 RSA是非常安全的非对称加解密算法&#xff0c;单纯的RSA的原理和使用网络资料较多&#xff0c;本期不细讲RSA的原理&#xff0c;主要讲解实战&#xff0c;如何与SpringbootSpringSecurity集成起来&#xff0c;做到在安全框架基础上&#xff0c;对用户的密码进行加密存…

maven+spock

pom配置 话说JunitMockito的组合用起来是真难用&#xff0c;还是Spock的简单&#xff0c;尤其是参数化的测试。junit的Parameter是鸡肋&#xff0c;杂恶心&#xff1b;Theories用来也不爽。 <?xml version"1.0" encoding"UTF-8"?><project xm…

html的学习笔记

开发工具&#xff1a;vscode 文字标签 h1:一级标题&#xff0c;h2&#xff1a;二级标题h6 p&#xff1a;段落标签 hr&#xff1a;分隔线 br&#xff1a;换行 strong/b&#xff1a;文字加粗 ins/u:下划线 em/i&#xff1a;倾斜 del/s&#xff1a;删除线 媒体标签 图片…

Mybatis-plus介绍与入门

前言 MyBatis-Plus是在MyBatis基础上的一个增强工具库&#xff0c;旨在简化开发者的工作&#xff0c;提高开发效率&#xff0c;同时保留MyBatis的灵活性。使用 MyBatis-Plus 可以减少重复性的代码&#xff0c;简化常见的数据库操作 官方学习文档&#xff1a;MyBatis-Plus (bao…

死锁 + 条件变量 + 生产消费者模型

文章目录 死锁如何解决死锁问题呢&#xff1f;避免死锁 同步条件变量生产消费者模型 死锁 现象 &#xff1a; 代码不会继续往后推进了 问题 一把锁有没有可能产生死锁呢&#xff1f; 有可能 线程第一次申请锁成功&#xff0c;继续再次申请&#xff0c;第二次申请就失败了&am…