• dhroid


    下面到了接口对象的注入了解冻吧,现在才是我们的重点,这才是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的属性才能被注入

  • 相关阅读:
    hdu 5517 Triple(二维树状数组)
    bzoj 3998: [TJOI2015]弦论(后缀自动机)
    hdu 5008 Boring String Problem(后缀数组+rmq)
    hdu 4622 Reincarnation(后缀自动机)
    hdu 6025 card card card(双指针)
    寒武纪camp Day3
    寒武纪camp Day2
    寒武纪camp Day1
    Codeforces 920G(二分+容斥)
    Codeforces 920E(补图BFS)
  • 原文地址:https://www.cnblogs.com/niray/p/4650375.html
Copyright © 2020-2023  润新知