`

ioc高级(接口,对象注入)-dhroid文档

 
阅读更多

  

 前一章 ioc基础(视图,资源,assert注入)-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.clas
上面的几个类也可以用ioc拿到,自己试试看吧
 
关于类的构造方法
默认 容器是用空构造方法创建方法的
当然如果你的构造方法中需要一个Context
如 
class A{

   public A(Context context){
      //
   }

}
 ioc会传一个全局contextg过去
默认情况下 ioc对象的属性注入只会注入net.duohuo.dhroid包下,和你项目包下的类,如果还不够(你创建了自己的库)
需要进行如下配置(这是为了添加效率)
Const.ioc_instal_pkg=["可以注入的包"]; 
好了现在对ioc你应该有了一些认识了吧,具体使用dhroid  demo项目
 
qq交流群:297593013(欢迎加入)
 
分享到:
评论

相关推荐

    Spring5 框架 ---- IOC容器 ---- 代码

    Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...

    Ioc模式解析 - JAVA - 技术天地 - 赛迪网.htm

    Ioc模式解析 - JAVA - 技术天地 - 赛迪网.htm

    Spring Ioc源码分析系列--自动注入循环依赖的处理.doc

    Spring Ioc 源码分析系列--自动注入循环依赖的处理 本篇文章主要讲解了 Spring Ioc 源码分析系列中自动注入循环依赖的处理机制。循环依赖是 Spring 框架中一个经典的问题,也是面试中常被问到的问题。本篇文章将...

    Spring Ioc源码分析系列--@Autowired注解的实现原理.doc

    Spring Ioc源码分析系列--@Autowired注解的实现原理 @ Автоwired注解是 Spring Framework 中的一个重要组件,它提供了自动装配的功能,能够将 Bean 之间的依赖关系自动解析和注入。今天,我们将深入探讨 @...

    Spring Ioc(依赖注入)入门例子--属性注入

    在没有IoC的情况下,对象通常会自行创建其依赖的对象实例,而IoC容器则负责管理这些依赖,使得开发者无需在代码中硬编码依赖对象的创建。这增强了代码的灵活性,因为依赖关系可以在运行时动态调整。 Spring的DI是...

    Ioc接口代码

    **接口控制反转(IoC)**,全称Inversion of Control,是软件设计中的一个核心概念,它在现代软件开发中扮演着至关重要的角色,尤其是Java和.NET等面向对象编程领域。IoC的核心思想是将对象的创建和管理权交给容器,...

    Spring的IoC实现案例

    在Spring框架中,IoC容器负责创建对象、管理它们之间的依赖关系,并在需要时注入这些依赖。 让我们开始分析“Priter”类。这个类代表了打印机,它可能有一个或多个方法用于执行打印操作。为了实现灵活性,我们不...

    spring ioc

    除了基本的依赖注入,Spring 还支持其他高级功能,如构造器注入、属性注入、工厂方法注入、集合注入等。此外,通过 AOP(面向切面编程)和 Spring 的其他模块,如数据访问、事务管理、MVC 等,我们可以构建出完整的...

    IOC835芯片 MM-PIO835-1P驱动程序 解压密码:hebeiww

    PCI并口卡 PCI转打印并口DB25接口扩展卡 IOC835芯片驱动 功能描述: 在具备PCI插槽的电脑上扩展出1个DB25并口 规格说明: 符合PCIRev2.1协议 传输率最大可达1.5 Mbytes/sec 1个DB25并口接头 符合标准的带16byte接收...

    Spring IOC:找对象的一次革命(1)

    Spring IoC作为一种革命性的找对象方式,通过控制反转和依赖注入技术,极大提升了Java应用的开发效率和代码质量。然而,正如文中所言,“只有最适合,没有最佳的哲学”,在实际应用中,应根据具体场景选择最合适的...

    beangle-ioc-spring-3.3.3-sources.jar

    官方版本,亲测可用

    linux系统下一个冷门的RAID卡ioc0及其监控mpt-status

    mptsas: ioc0: attaching raid volume, channel 1, id 0 device-mapper: dm-raid45: initialized v0.2594l md: Autodetecting RAID arrays. 很明显是有的,只是无法确定RAID卡的类型是ioc0还是dm-raid45,于是开始...

    Spring Ioc 注解 依赖注入

    ### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,最初是为了解决企业级应用开发中的复杂性问题而诞生的。Spring框架的核心特性包括IoC(Inversion of ...

    QuteContainer:C ++ Qt框架的IoC和依赖注入容器-开源

    QuteContainer是用于依赖项注入的轻型控制反转(IOC)容器。 QuteContainer使用C ++ Qt框架构建并用于C ++ Qt框架。 QuteContainer可以使用构造函数参数注入来自动解析对象依赖树。

    IoC 依赖注入 技术总结

    "IoC 依赖注入 技术总结" IoC 依赖注入技术是软件设计中的一种重要技术,旨在解决软件系统中的耦合问题。该技术的核心思想是将被调用构件实例化,并注入到调用构件之中,以实现软件系统的高内聚、低耦合。IoC 依赖...

    Spring-ioc-jar

    这个jar文件"Spring-ioc-jar"包含了实现Spring IOC功能所需的关键类和接口,是学习和使用Spring IOC技术的基础。 Spring框架的IOC容器是其核心组件,主要由`ApplicationContext`和`BeanFactory`两个接口代表。`...

    Spring IoC简单示例-XML配置-Maven构建

    Spring框架的核心特性之一是Inversion of Control(IoC),也被称为依赖注入(Dependency Injection)。IoC是一种设计模式,它将对象之间的依赖关系从代码中解耦出来,转交给一个外部容器(在Spring中就是...

    springIOC核心组件分析.vsdx

    spring-core:核心模块 依赖注入IOC和DI的最基本实现 spring-beans:Bean工厂与装配 spring-context:上下文,即IOC容器 spring-context-support:对IOC的扩展,以及IOC子容器 spring-context-indexer:类管理组件和...

    Spring IoC简单示例-注解配置-Maven构建

    在本例中,可能有一个名为`spring-ioc-anno`的包,其中包含着使用注解配置的Spring bean。 为了启动Spring容器并运行应用程序,我们可以创建一个主类,使用`ApplicationContext`来加载配置并获取bean。例如: ```...

    springIOC控制反转 依赖注入实例

    在传统的程序设计中,我们通常手动创建对象并管理它们之间的依赖关系,而在Spring中,这些任务由IOC容器来处理,实现了从依赖管理到依赖注入的转变。 控制反转(IOC)意味着应用程序不再直接创建对象,而是将对象的...

Global site tag (gtag.js) - Google Analytics