IOC

IOC

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

控制反转(Inversion of Control,缩写IoC),面向对象编程是一种设计原理。它可用于降低计算机代码之间的耦合程度。其中最常见的方法被称为依赖注入(Dependency Injection,缩写DI),一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内全部对象的外界实体,将其所依赖的对象的引用传递给它。也能够说,依赖被注入到对象中。


技术描写叙述

Class A中用到了Class B的对象b。普通情况下。须要在A的代码中显式的new一个B的对象。

採用依赖注入技术之后,A的代码仅仅须要定义一个私有的B对象,不须要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。

而详细获取的方法、对象被获取时的状态由配置文件(如XML)来指定。

实现方法
实现控制反转主要有两种方式:依赖注入和依赖查找。两者的差别在于,前者是被动的接收对象,在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来推断将不同的对象注入到不同的属性中,而后者是主动索取响应名称的对象,获得依赖对象的时间也能够在代码中自由控制。
依赖注入有例如以下实现方式:
基于接口。实现特定接口以供外部容器注入所依赖类型的对象。
基于 set 方法。

实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象。
基于构造函数。

实现特定參数的构造函数。在新建对象时传入所依赖类型的对象。

基于注解。基于Java的注解功能。在私有变量前加“@Autowired”等注解。不须要显式的定义以上三种代码,便能够让外部容器传入相应的对象。该方案相当于定义了public的set方法。可是由于没有真正的set方法,从而不会为了实现依赖注入导致暴露了不该暴露的接口(由于set方法仅仅想让容器訪问来注入而并不希望其它依赖此类的对象訪问)。
Android学习进阶和IoC
1.成为Android高手一般分为六个阶段:

        第一阶段:熟练掌握Java SE,尤其是对其内部类、线程、并发、网络编程等须要深入研究;熟练掌握基于HTTP协议的编程,清楚POST和GET等请求方式流程和细节;可以进行主要的Java Web编程,假设可以使用Java EE则更好。   

       第二阶段:精通Android的核心API的使用,比如四大组件所涉及的API、Context等,精通核心界面的编程。比如ListView的编程;到达这个阶段已经可以做大部分主要的应用开发了。

      第三阶段:精通应用框架的原理,尤其是对IoC的理解及其在Android应用框架中的应用,精通主要的23种设计模式在Android中的应用;      

      第四阶段:精通JNI,熟练Android类库中C/C++组件开发。并可以使用JNI机制把现有的C/C++组件移植成为应用框架的核心组件;具备改动和编写自己的应用框架的能力;   

      第五阶段:做出自己的Android系统。不管是底层还是上层都可以了如指掌;可以依据实际须要设计和实现比較大Android系统。比如带领比較大的团队做出自己的Android手机产品等。

        第六阶段:势。一切的思考均进入“势”的思考,一切都是思路问题,推断和预測Android的形势,引领市场,通往自由的天堂。

2. Android之IoC (Inversion of Control)
1)概念
        一种设计思想。

使调用者和被调用者解耦和分离,便于更改和代码重用,便于移植。

        很多应用都是由多个类通过彼此合作来实现业务逻辑,每一个对象之间都相互依赖,这将导致代码高度耦合而且难以測试、难以改动难以重用。

    IoC非常好的攻克了该问题,它将实现组件间关系从程序内部提到外部容器来管理。也就是说由容器在执行期将组件间的某种依赖关系动态的注入组件中。控制程序间关系的实现交给了外部容器来完毕。
2)案例
为了实现调用者和被调用者解耦,分离。通常是通过工厂模式实现的,以下将通过比較工厂模式和Ioc模式不同。加深理解Ioc模式。

如果有两个类B 和 C:B作为调用者。C是被调用者。

一般的做法是:
public class B{
   private C comp=new C(); 
  ……
}
工厂模式实现例如以下:
public class B{
  private C comp; 
  private final static MyFactory myFactory = MyFactory.getInstance();
  public B(){
    this.comp = myFactory.createInstanceOfC();
  }
   public void someMethod(){
    this.comp.sayHello();
  } 
}
使用Ioc依赖性注射实现Picocontainer例如以下:
public class B{
  private C comp; 
  public B(C comp){
    this.comp = comp;
   }
   public void someMethod(){
    this.comp.sayHello();
   }
}
//外部容器实现。控制程序间的关系。

CImp类为C接口/类的一个详细实现。
public class client{
   public static void main( String[] args ) {
    DefaultPicoContainer container = new DefaultPicoContainer();
    container.registerComponentImplementation(CImp.class); //向B类实现注射C类详细实现
    container.registerComponentImplementation(B.class);
    B b = (B) container.getComponentInstance(B.class);
    b.someMethod();
   }
}
3)工厂模式和Ioc不同的特点和差别:
  如上,主要差别体如今B类的代码,假设使用Ioc,在B类代码中将不须要嵌入不论什么工厂模式等的代码。由于这些工厂模式事实上还是与C有些间接的联系,这样,使用Ioc彻底解耦了B和C之间的联系。

  使用Ioc带来的代价是:须要在client或其他某处进行B和C之间联系的组装。
  所以,Ioc并没有消除B和C之间这种联系。仅仅是转移了这种联系。

  总之,使用Ioc模式,能够无论将来详细实现,全然在一个抽象层次进行描写叙述和技术架构。

http://blog.csdn.net/blog_wang/article/details/38468547   //注解绑定UI

http://blog.csdn.net/lindir/article/details/7843109

http://blog.csdn.net/zhaokaiqiang1992/article/details/37929071

http://www.cnblogs.com/devinzhang/p/3862942.html      //依赖注入和控制反转

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117006.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue 如何关闭 eslint 检查

    vue 如何关闭 eslint 检查在实际开发过程中,eslint的作用不可估量,诸如:1.审查代码是否符合编码规范和统一的代码风格;2.审查代码是否存在语法错误;But,对于初学者来说,这个功能极其不友好,各种问题层出不穷,让很多初学者头疼不已,我们有没有办法关掉它,等适当时机在启用它呢,答案是肯定的。不同vuecli版本创建工程的时候,稍微有些差别,要仔细甄别,我的vuecliv4.5.9方案一:vue脚手架创建工程的时候,不要选择Linter/Formatter选项,(那如何选择启用,请参照方案二)

    2022年5月20日
    54
  • Quartus II 13.0sp1 (64-bit)使用教程「建议收藏」

    Quartus II 13.0sp1 (64-bit)使用教程「建议收藏」本人大三在学习计算机组成原理,要用到QuartusII13.0sp1(64-bit),但是下载安装完以后发现不会用,世界这么大,百度也没有任何收获,啊啊啊,昨天终于会用了,所以写了这个教程,希望对大家有用,详情见图片这里会弹出来一个框,然后(next)然后得到下面这个图这里也有一个(next)省略了,都是点一下哦然后(next)——》(finsh)module…

    2022年10月10日
    0
  • SNMP TRAP_Bootstrapping

    SNMP TRAP_Bootstrapping一、什么是SNMPTRAPSNMPtrap(SNMP陷阱):某种入口,到达该入口会使SNMP被管设备主动通知SNMP管理器,而不是等待SNMP管理器的再次轮询。在网管系统中,被管理设备中的代理可以在任何时候向网络管理工作站报告错误情况,例如预制定阈值越界程度等等。代理并不需要等到管理工作站为获得这些错误情况而轮询他的时候才会报告。正如人们用中断通知CPU数据的到达,而不是让CPU进行轮询一样。Trap通知是更加合理的选择。用一句话来说的话,SNMPTrap就是被管理设备主动发送消息给

    2022年8月20日
    7
  • transactionscope mysql_TransactionScope 的基本原理简介

    transactionscope mysql_TransactionScope 的基本原理简介C#的事务编程1Db事务DbConnection中创建基于当前连接的DbTransaction2使用TransactionScope,创建环境事务一旦创建,在这个环境包含的DbConnection实例都会根据连接字符串中的Sqlserver连接字符串支持,是否自动附加当前环境事务.连接字符串关键字(Enlist)SqlConnection.ConnectionString属性…

    2022年7月19日
    12
  • jmeter常见面试题_hr面试问题大全及答案

    jmeter常见面试题_hr面试问题大全及答案问题列表在项目中如何用jmeter进行http接口测试?Jmeter常用元件有哪些?jmeter如何管理cookie和session信息?jmeter中如何实现关联?jmeter中断言方式?jmeter参数化的方式有哪几种可以实现?Jmeter怎么录制,怎么过滤?JMeter结果树响应数据中文乱码如何解决?用户定义的变量和用户参数的区别?Jmeter怎么实现持续集成测试?在项目中如何用jmeter进行http接口测试?(重点)在Jmeter安装目录bin中,找到jmet

    2022年9月30日
    0
  • httprunner3源码解读(1)简单介绍源码模块内容「建议收藏」

    httprunner3源码解读(1)简单介绍源码模块内容「建议收藏」前言最近想着搭建一个API测试平台,基础的注册登录功能已经完成,就差测试框架的选型,最后还是选择了httprunner,github上已经有很多开源的httprunner测试平台,但是看了下都是基于

    2022年7月30日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号