dhroid - ioc高级(接口,对象注入)
下面到了接口对象的注入了解冻吧,现在才是我们的重点,这才是ioc的核心思想,上面的都是android的辅助
1.5 对象依赖问题
我们先来将一下对象对象依赖的重要性,很多同学可能只学了android没学过javaee ,跟没听过spring的强大
例如中我们dhroid库的dhnet网络模块中在网络加载时自动显示对话框,但是我们不能用默认的对话框,到了真正的项目框基本中是需要定制的
我们库中有不知道对话框长什么样,但是又要用
这时我们可以面向接口编程我们定义一个接口IDialog
public interface IDialog
{ public abstract void showToastShort(Context context, String s); public abstract Dialog showDialog(Context context, String s, String s1, DialogCallBack dialogcallback);
public abstract Dialog showDialog(Context context, int i, String s, String s1, DialogCallBack dialogcallback);
//等一些调用方法...
}
这时候就可以用了我在需要用对话框的地方像下面一样
//编码获取
IDialog d=IocContainer.getShare().get(IDialog.class); //或者在属性在加注解
@Inject
IDialog dialoger;
这样我们就可以拿到IDIalog 的实现类,当然这个还是需要配置的
下面是写在application中的配置DialogImpl.class就是我们的具体实现类
//配置对话框对象,这是接口配置写法
//项目中可以自己写对话框对象,然后在这进行配置,这里使用的是提供的默认配置
IocContainer.getShare().bind(DialogImpl.class).to(IDialog.class)
//这是单例
.scope(InstanceScope.SCOPE_SINGLETON);
上面将DialogImpl.class绑定到了IDialog.class设置作用域为InstanceScope.SCOPE_SINGLETON,(DialogImpl.class是个默认实现)
下面来讲IocContainer的知识
使用ioc需要先在application初始化
//IOC的初始化
IocContainer.getShare().initApplication(this);
然后
IocContainer.getShare().bind(具体实现类).to(目标类或借口)
//这是单例
.scope(作用域)
绑定到接口不在累赘了,上面已是一个很好的例子
下面看下如何绑定到对象类上
Class A{
public void test(){
}
} Class AA extend A{
public void test(){
}
}
//配置
IocContainer.getShare().bind(AA.class)
.to(A.class)
.scope(InstanceScope.SCOPE_SINGLETON);
//这样后如果调用
A aa=IocContainer.getShare().get(A.class)
//或者
@Inject
A aa;
//拿到的对象是AA的实类,而不是A的实例很神奇吧
下面说下对象的作用域
InstanceScope.SCOPE_SINGLETON 单例(也可用于多例后面讲)
InstanceScope.SCOPE_PROTOTYPE 原型
单例大家应该都等,很经典的设计模式,
就是说IocContainer.getShare().get(A.class)拿出的永远都是同一个对象
而原型 只每次调用IocContainer.getShare().get(A.class)时哪出的都是一个新对象,
前面说到多例在配置时作用域也是InstanceScope.SCOPE_SINGLETON,多例只存在多个这样的对象你可以拿其中固定的一个对象
var atag1=IocContainer.getShare().get(A.class,"tag1");//拿出的都是被标志位tag1的对象,如果不存在会创建新的
var atag2=IocContainer.getShare().get(A.class,"tag2");//拿出的都是被标志位tag2的对象
上面就存在标志为tag1和tag2的两个对象
还没有完,下面才是难点
我们说个dhroid可以解除对象依赖,dhroid不仅可以在Activity可以注入在类中也可以
看下面例子
class A implements InjectFields{ @Inject
public B b;
@Override
public void injected() {
//这时候注入的属性已经有值了
if( b.a!=null){
Log.v("DH-INFO", "这是日志");
}
}
}
A a=IocContainer.getShare().get(A.class);
上面的拿到的A中属性已经被赋值了
还没完
我们在在看看B
class B implements InjectFields{ @Inject
public A a; @Override
public void injected() {
//这时候注入的属性已经有值了
if( a.b!=null){
Log.v("DH-INFO", "这是日志");
}
}
}
B b=IocContainer.getShare().get(B.class);
B 中也有一个A,当拿B时 B的A也被赋值了
上面拿到的A a,B b都是单例,它们相互依赖,
这种情况你试试看如果不用ioc你自己用设计模式实现看看,实现其他也不是那没容易
好了,
InjectFields接口说明这个类依赖于其他类
ioc容器在获取这个类时会对他需要赋值的属性进行赋值
接口方法 injected在它和它所依赖的对象都完成赋值后会被调用
接口,对象的注入好玩吧
还有一种注入,是按名字注入,我想大家用的不会多
//这是使用名字配置的方法,这样可以通过名字获取对象,使用不多
IocContainer.getShare().bind(AA.class)
.name("aname")
.scope(InstanceScope.SCOPE_SINGLETON);
//假设AA类实现了IA接口 //获取
IA a=IocContainer.getShare().get("aname"); //或者
@Inject(name="testmm")
IA a;
这种情况居然用的不多,我先实现下也是有必要的
你想不想在对象的属性没有注入之前对对象进行处理
IocContainer.getShare().bind(A.class)
.to(A.class)
.scope(InstanceScope.SCOPE_PROTOTYPE).perpare(new PerpareAction() {
@Override
public void perpare(Object obj) {
//在这里进行处理
}
});
这个实现是很久之前实现的,我没怎么用到,但是还是没有去掉
下面是几个android预定义的对象
NotificationManager.class
ActivityManager.class
PackageManager.class
AssetManager.class
上面的几个类也可以用ioc拿到,自己试试看吧
关于类的构造方法
默认 容器是用空构造方法创建方法的
当然如果你的构造方法中需要一个Context
如
class A{ public A(Context context){
//
} }
ioc会传一个全局contextg过去
默认情况下 ioc对象的属性注入只会注入net.duohuo.dhroid包下,和你项目包下的类,如果还不够(你创建了自己的库)
需要进行如下配置(这是为了添加效率)
Const.ioc_instal_pkg=["可以注入的包"];
关于类继承问题
继承类时
父类中的 只有有共有属性,即public的属性才能被注入
dhroid - ioc高级(接口,对象注入)的更多相关文章
- dhroid - ioc基础(@Inject*)
1 ioc即控制反转.控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心.控制反转还有一 ...
- C#自定义应用程序上下文对象+IOC自己实现依赖注入
以前的好多代码都丢失了,加上最近时间空一些,于是想起整理一下以前的个人半拉子项目,试试让它们重生.自从养成了架构师视觉 搭建框架之后,越来 越看不上以前搭的框架了.先撸个上下文对象加上实现依赖注入.由 ...
- Spring IOC - 控制反转(依赖注入) - 入门案例 - 获取对象的方式 - 别名标签
1. IOC - 控制反转(依赖注入) 所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交 由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和生命周 ...
- 深入分析MVC中通过IOC实现Controller依赖注入的原理
这几天利用空闲时间,我将ASP.NET反编译后的源代码并结合园子里几位大侠的写的文章认真的看了一遍,收获颇丰,同时也摘要了一些学习内容,存入了该篇文章:<ASP.NET运行机制图解>,在对 ...
- struts2将servlet对象注入到Action中
在struts2框架中,可以通过IoC方式将servlet对象注入到Action中,通常需要Action实现以下接口: a. ServletRequestAware: 实现该接口的Action可以直接 ...
- Spring学习3—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)
一.思想理解 Spring 能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的 管理下有机地协调.运行.S ...
- 控制反转(IOC)和依赖注入(DI)的区别
IOC inversion of control 控制反转 DI Dependency Injection 依赖注入 要理解这两个概念,首先要搞清楚以下几个问题: 参与者都有谁? 依赖:谁 ...
- 控制反转(IoC)与依赖注入(DI)
前言 最近在学习Spring框架,它的核心就是IoC容器.要掌握Spring框架,就必须要理解控制反转的思想以及依赖注入的实现方式.下面,我们将围绕下面几个问题来探讨控制反转与依赖注入的关系以及在Sp ...
- 控制反转( IoC)和依赖注入(DI)
控制反转( IoC)和依赖注入(DI) tags: 容器 依赖注入 IOC DI 控制反转 引言:如果你看过一些框架的源码或者手册,像是laravel或者tp5之类的,应该会提到容器,依赖注入,控制反 ...
随机推荐
- SharePoint PowerShell使用Export-SPWeb和Import-SPWeb指令来导出和导入网站
导出网站,例如: Export-SPWeb -Identity http://win2012sp2013:1000/Hopewell_Portal/ -Path "C:\KenmuTemp\ ...
- UNIX环境编程学习笔记(12)——文件I/O之目录操作
lienhua342014-09-18 1 引言 在 UNIX 系统中,目录是一种特殊的文件类型.我们可以使用 open 函数来打开目录,获取文件描述符,然后调用 stat 函数来获取目录的属性信息, ...
- 安装MongoDB 到服务器
用管理员身份运行CMD > cd C:\Program Files\mongodb\bin > C:\Program Files\mongodb\bin>mongod --dbpat ...
- JavaWeb跨域访问问题
转载: http://blog.csdn.net/zjq_1314520/article/details/65449279 最后的解决方案如下: 在 tomcat 的 conf目录下找到 web.xm ...
- pyqt与拉勾网爬虫的结合
人力部需要做互联网金融行业的从业人员薪酬分析,起初说的是写脚本,然后他们自己改.但这样不太好,让人事部来修改py脚本不太好,这需要安装py环境和一些第三方包,万一脚本改来改去弄错了,就运行不起来了. ...
- 5 -- Hibernate的基本用法 --1 3 流行的ORM框架简介
⊙ JPA : JPA本身只是一种ORM规范,并不是ORM产品.它是Java EE规范制定者向开源世界学习的结果.JPA实体与Hibernate PO十分相似,甚至JPA实体完全可作为Hibernat ...
- 彻底关闭Google的安全搜索
在使用简体中文的情况下,访问Google总是会跳转到香港,这个时候的安全搜索是无法关闭的. 下面介绍一个最简单的方法,直接使用Google的中文界面:https://www.google.com/we ...
- C语言中的static关键字
C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错.伴随着不同源文件变量和函数之间的相互 ...
- python commands模块在python3.x被subprocess取代
subprocess 可以执行shell命令的相关模块和函数有: os.systemos.spawnos.popen --废弃popen2.* --废弃commands.* --废弃,3.x中被移除 ...
- jenkins构建的robot result结果不更新
描述:构建的结果不进行更新,仍然显示以往的构建结果 定位原因:pybot 命令中生成的结果文件保存路径与构建后robot结果显示路径不一致所致 解决办法:修改二者的结果保存路径一致