IOC容器詳解(念晉陞的進來)-dhroid框架教教程(一)

tags:    時間:2014-03-23 13:52:06
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

推薦閱讀文章

Bookmark the permalink ,來源:互聯網