控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI。更多IOC的解释自己百度去吧
下面我们看dhroid中的ioc
- 可以注入视图;
- 可以注入事件;
- 可以注入子视图;
- 可以注入资源(drawable,color,string...)
- 可以注入assert(注入文字,json,文件)
- 可以注入对象,接口(单例,多例,每次创建)
- 解决了对象间的依赖(A依赖于B,B同时依赖于A)
下面看具体实现吧
注解使用
- <b>//获取assert中的文本
- @InjectAssert(path="testtext.json")
- String testassert;
- //获取assert中的json
- @InjectAssert(path="testtext.json")
- JSONObject jo;
- //注入文件,因为注入文件时是在新线程里,所以建议在之前的页面就注入一次,不然文件大了会在使用时还没拷贝完成
- @InjectAssert(path="ivory.apk")
- File apkFile;
- //注入视图
- @InjectView(id=R.id.asserttext)
- TextView testassertV;
- @InjectView(id=R.id.resstring)
- TextView resstrV;
- //注入视图,和视图事件//itemClick和itemLongClick时间可以参照
- //注入时建议向下兼容,如果你的layout中是一个button且不需要换文字,请注入View,这样可以在将布局修改为image时前台不会出错
- @InjectView(id=R.id.assertFile,click="toInstal")
- View instalApkV;
- @InjectView(id=R.id.child_layout)
- ViewGroup childLayoutV;
- //注入布局文件
- @InjectView(layout=R.layout.ioc_head)
- View headV;
- //在其他视图中查看
- @InjectView(id=R.id.intext,inView="headV")
- TextView childTextV;
- //注入字串
- @InjectResource(string=R.string.app_name)
- String appname;
- //注入颜色
- //这里不能为int因为int有默认值0 有值的属性会被忽略,防止重复注入
- @InjectResource(color=R.color.link)
- Integer colorLink;
- //注入图片
- @InjectResource(drawable=R.drawable.ic_launcher)
- Drawable icDraw;
- //注入dimen
- @InjectResource(dimen=R.dimen.testdimen)
- Float dime;
- //接受传入的字符串
- @InjectExtra(name="str",def="默认值")
- String extra;
- //接受传入的数字
- @InjectExtra(name="int",def="1")
- Integer extraint;
- //接受传入的json对象(传入时是已字符串传入的)这个默认值没用
- @InjectExtra(name="jo")
- JSONObject extrajo;
- //标准注入 单例 注入接口 需要在application中配置
- @Inject
- IDialog dialoger;
- //标准注入 单例 注入类
- @Inject
- DhDB db;
- //根据tag拿对象这里拿到的manager1和manager1copy是同一对象,manager2和manager2copy是同一对象
- @Inject(tag="manager1")
- TestManager manager1;
- @Inject(tag="manager1")
- TestManager manager1copy;
- @Inject(tag="manager2")
- TestManager manager2;
- @Inject(tag="manager2")
- TestManager manager2copy;
- //这个测试根据名字获取对象配置请看application
- @Inject(name="testmm")//这里获取到的对象是TestManagerMM
- TestManager managermm;</b>
编码获取
- <font size="2"> TestDateHelper helper=IocContainer.getShare().get(TestDateHelper.class);
- IocContainer.getShare().get("testmm");</font>
对象(接口)的配置写在Application中
- <font size="2"> //IOC的初始化
- IocContainer.getShare().initApplication(this);
- //IOC配置下面两个是必须配置的
- //配置对话框对象,这是接口配置写法
- //项目中可以自己写对话框对象,然后在这进行配置,这里使用的是提供的默认配置
- IocContainer.getShare().bind(DialogImpl.class).to(IDialog.class)
- //这是单例
- .scope(InstanceScope.SCOPE_SINGLETON);
- //配置ValueFix对象基本每个项目都有自己的实现
- IocContainer.getShare().bind(DemoValueFixer.class)
- .to(ValueFix.class)
- .scope(InstanceScope.SCOPE_SINGLETON);
- //这是使用名字配置的方法,这样可以通过名字获取对象,使用不多
- IocContainer.getShare().bind(TestManagerMM.class)
- .name("testmm")
- .scope(InstanceScope.SCOPE_SINGLETON);
- //这个测试作用域InstanceScope.SCOPE_PROTOTYPE
- IocContainer.getShare().bind(TestDateHelper.class)
- .to(TestDateHelper.class)
- //这种作用域获取的每个对象都是独立的对象
- .scope(InstanceScope.SCOPE_PROTOTYPE).perpare(new PerpareAction() {
- //同时测试初始化后的回调
- @Override
- public void perpare(Object obj) {
- //在初始化完成后回调,当然在InjectFields接口中injected也有回调
- TestDateHelper helper=(TestDateHelper) obj;
- helper.setName("我是在初始化是提供名字的");
- }
- });
- //IOC中基本bind的类对象和to的类想象如果是同一个且是单例或通过Tag获取是不需要配置的</font>
更多链接
dhroid介绍总贴:http://www.apkbus.com/forum.php?mod=viewthread&tid=165287
开源中国地址:http://www.oschina.net/p/dhroid
开源项目地址:http://git.oschina.net/tengzhinei/dhroid