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      //依赖注入和控制反转

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Pyinstaller打包exe完整教程

    Pyinstaller打包exe完整教程原创文|Space9Python文件打包成可安装、无需Python依赖的高效可执行exe程序工具及环境PyInstallerInnoSetupWindows和PythonPyInstaller打包Python应用程序为独立的可执行文件安装PyInstallerpypi镜像使用帮助https://mirrors.tuna.tsinghua.edu.cn/help/pypi/pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simple

  • 关于内存管理单元须要掌握的相关知识「建议收藏」

    关于内存管理单元须要掌握的相关知识

  • ubuntu16安装中文输入法「建议收藏」

    ubuntu16安装中文输入法「建议收藏」参考自:https://jingyan.baidu.com/article/bad08e1ef4b2f109c85121b7.html原材料:ubuntu16步骤:1.在桌面的最左边选择设置(SystemSettings)2.在设置中选择LanguageSupport3.在弹出的窗口选择Install/RemoveLanguages…4.选择Ch…

  • pycharm怎么配置pygame环境—–pycharm怎么配置环境[通俗易懂]

    pycharm怎么配置pygame环境—–pycharm怎么配置环境[通俗易懂]最近学习python要做一个飞机大战的项目,需要配置importpygame新建项目–importpygame,结果是这样滴没有安装这个模块,当然import不了啦,怎么用pycharm下载安装pygame呢?首先选择setting–projectinerpreter,设置项目编译器。大红圈是已经安装过的模块,点击旁边小圈里的小加号是添加新模块,我们轻轻的点一下…

  • SpringMVC框架理解

    SpringMVC框架理解1.Spring与Web环境集成1.1ApplicationContext应用上下文获取方式应用上下文对象是通过newClasspathXmlApplicationContext(spring配置文件)方式获取的,但是每次从容器中获得Bean时都要编写newClasspathXmlApplicationContext(spring配置文件),这样的弊端是配置文件加载多次,应用上下文对象创建多次。在Web项目中,可以使用ServletContextListener监听Web应用的启动,

  • 异或和左移的优先级_异或链表

    异或和左移的优先级_异或链表给定一个非负整数序列 a,初始长度为 N。有 M 个操作,有以下两种操作类型:A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N 增大 1。Q l r x:询问操作,你需要找到一个位置 p,满足 l≤p≤r,使得:a[p] xor a[p+1] xor … xor a[N] xor x 最大,输出这个最大值。输入格式第一行包含两个整数 N,M,含义如问题描述所示。第二行包含 N 个非负整数,表示初始的序列 A。接下来 M 行,每行描述一个操作,格式如题面所述。输出格式每个询问操

发表回复

您的电子邮箱地址不会被公开。

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