`

IOC容器详解(想晋升的进来)---dhroid框架教教程(一)

阅读更多


控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI更多IOC的解释自己百度去吧


下面我们看dhroid中的ioc

  • 可以注入视图;
  • 可以注入事件;
  • 可以注入子视图;
  • 可以注入资源(drawable,color,string...)
  • 可以注入assert(注入文字,json,文件)
  • 可以注入对象,接口(单例,多例,每次创建)
  • 解决了对象间的依赖(A依赖于B,B同时依赖于A)


下面看具体实现吧


注解使用

  1. <b>//获取assert中的文本
  2.         @InjectAssert(path="testtext.json")
  3.         String testassert;
  4.         //获取assert中的json
  5.         @InjectAssert(path="testtext.json")
  6.         JSONObject jo;
  7.         
  8.         //注入文件,因为注入文件时是在新线程里,所以建议在之前的页面就注入一次,不然文件大了会在使用时还没拷贝完成
  9.         @InjectAssert(path="ivory.apk")
  10.         File apkFile;
  11.         //注入视图
  12.         @InjectView(id=R.id.asserttext)
  13.         TextView testassertV;
  14.         @InjectView(id=R.id.resstring)
  15.         TextView resstrV;
  16.         //注入视图,和视图事件//itemClick和itemLongClick时间可以参照
  17.         //注入时建议向下兼容,如果你的layout中是一个button且不需要换文字,请注入View,这样可以在将布局修改为image时前台不会出错
  18.         @InjectView(id=R.id.assertFile,click="toInstal")
  19.         View instalApkV;
  20.         @InjectView(id=R.id.child_layout)
  21.         ViewGroup childLayoutV;
  22.         //注入布局文件
  23.         @InjectView(layout=R.layout.ioc_head)
  24.         View headV;
  25.         //在其他视图中查看
  26.         @InjectView(id=R.id.intext,inView="headV")
  27.         TextView childTextV;
  28.         
  29.         
  30.         //注入字串
  31.         @InjectResource(string=R.string.app_name)
  32.         String appname;
  33.         //注入颜色
  34.         //这里不能为int因为int有默认值0 有值的属性会被忽略,防止重复注入
  35.         @InjectResource(color=R.color.link)
  36.         Integer colorLink;
  37.         //注入图片
  38.         @InjectResource(drawable=R.drawable.ic_launcher)
  39.         Drawable icDraw;
  40.         //注入dimen
  41.         @InjectResource(dimen=R.dimen.testdimen)
  42.         Float dime;
  43.         
  44.         
  45.         //接受传入的字符串
  46.         @InjectExtra(name="str",def="默认值")
  47.         String extra;
  48.         //接受传入的数字
  49.         @InjectExtra(name="int",def="1")
  50.         Integer extraint;
  51.         //接受传入的json对象(传入时是已字符串传入的)这个默认值没用
  52.         @InjectExtra(name="jo")
  53.         JSONObject extrajo;
  54.         
  55.         
  56.         //标准注入 单例  注入接口 需要在application中配置
  57.         @Inject
  58.         IDialog dialoger;
  59.         
  60.         //标准注入 单例  注入类
  61.         @Inject
  62.         DhDB db;
  63.         
  64.         //根据tag拿对象这里拿到的manager1和manager1copy是同一对象,manager2和manager2copy是同一对象
  65.         @Inject(tag="manager1")
  66.         TestManager manager1;
  67.         @Inject(tag="manager1")
  68.         TestManager manager1copy;
  69.         @Inject(tag="manager2")
  70.         TestManager manager2;
  71.         @Inject(tag="manager2")
  72.         TestManager manager2copy;
  73.         
  74.         
  75.         //这个测试根据名字获取对象配置请看application
  76.         @Inject(name="testmm")//这里获取到的对象是TestManagerMM
  77.         TestManager managermm;</b>
复制代码


编码获取

  1. <font size="2">        TestDateHelper helper=IocContainer.getShare().get(TestDateHelper.class);
  2. IocContainer.getShare().get("testmm");</font>
复制代码


对象(接口)的配置写在Application中

  1. <font size="2">        //IOC的初始化
  2.                 IocContainer.getShare().initApplication(this);
  3.                 //IOC配置下面两个是必须配置的
  4.                 //配置对话框对象,这是接口配置写法
  5.                 //项目中可以自己写对话框对象,然后在这进行配置,这里使用的是提供的默认配置
  6.                 IocContainer.getShare().bind(DialogImpl.class).to(IDialog.class)
  7.                 //这是单例
  8.                 .scope(InstanceScope.SCOPE_SINGLETON);
  9.                 //配置ValueFix对象基本每个项目都有自己的实现
  10.                 IocContainer.getShare().bind(DemoValueFixer.class)
  11.                 .to(ValueFix.class)
  12.                 .scope(InstanceScope.SCOPE_SINGLETON);
  13.                 
  14.                 //这是使用名字配置的方法,这样可以通过名字获取对象,使用不多
  15.                 IocContainer.getShare().bind(TestManagerMM.class)
  16.                 .name("testmm")
  17.                 .scope(InstanceScope.SCOPE_SINGLETON);
  18.                 
  19.                 //这个测试作用域InstanceScope.SCOPE_PROTOTYPE
  20.                 IocContainer.getShare().bind(TestDateHelper.class)
  21.                 .to(TestDateHelper.class)
  22.                 //这种作用域获取的每个对象都是独立的对象
  23.                 .scope(InstanceScope.SCOPE_PROTOTYPE).perpare(new PerpareAction() {
  24.                         //同时测试初始化后的回调
  25.                         @Override
  26.                         public void perpare(Object obj) {
  27.                                 //在初始化完成后回调,当然在InjectFields接口中injected也有回调
  28.                                 TestDateHelper helper=(TestDateHelper) obj;
  29.                                 helper.setName("我是在初始化是提供名字的");
  30.                         }
  31.                 });
  32.                 //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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics