说说依赖注入

在面向对象编程中,我们经常处理处理的问题就是解耦,程序的耦合性越低表明这个程序的可读性以及可维护性越高。控制反转(Inversion of Control或IoC)就是常用的面向对象编程的设计原则,使用这个原则我们可以降低耦合性。其中依赖注入是控制反转最常用的实现。

什么是依赖

依赖是程序中常见的现象,比如类Car中用到了GasEnergy类的实例energy,通常的做法就是在Car类中显式地创建GasEnergy类的实例,并赋值给energy。如下面的代码

interface Energy {

}

class GasEnergy implements Energy {

}

class Car {

Energy energy = new GasEnergy();

}

存在问题

类Car承担了多余的责任,负责energy对象的创建,这必然存在了严重的耦合性。举一个现实中的例子,一辆汽车使用哪种能源不是由汽车来决定,而是由汽车制造商(CarMaker)来决定,这是汽车制造商的责任。

可扩展性,假设我们想修改能源为电动力,那么我们必然要修改Car这个类,明显不符合开放闭合原则。

不利于单元测试。

依赖注入

依赖注入是这样的一种行为,在类Car中不主动创建GasEnergy的对象,而是通过外部传入GasEnergy对象形式来设置依赖。 常用的依赖注入有如下三种方式

构造器注入

将需要的依赖作为构造方法的参数传递完成依赖注入。

class Car {

Energy mEnergy;

public Car(Energy energy) {

mEnergy = energy;

}

}

Setter方法注入

增加setter方法,参数为需要注入的依赖亦可完成依赖注入。

class Car {

Energy mEnergy;

public void setEnergy(Energy energy) {

mEnergy = energy;

}

}

接口注入

接口注入,闻其名不言而喻,就是为依赖注入创建一套接口,依赖作为参数传入,通过调用统一的接口完成对具体实现的依赖注入。

interface EnergyConsumerInterface {

public void setEnergy(Energy energy);

}

class Car implements EnergyConsumerInterface {

Energy mEnergy;

public void setEnergy(Energy energy) {

mEnergy = energy;

}

}

接口注入和setter方法注入类似,不同的是接口注入使用了统一的方法来完成注入,而setter方法注入的方法名称相对比较随意。

框架取舍

依赖注入有很多框架,最有名的就是Guice,当然Spring也支持依赖注入。Guice采用的是运行时读取注解,通过反射的形式生成依赖并进行注入。这种形式不太适合Android移动设备,毕竟这些操作都在运行时处理,对性能要求较高。

Dagger则是Android开发适合的依赖注入库,其同样采用类注解的形式,不同的是它是在编译时生成辅助类,等到在运行时使用生成的辅助类完成依赖注入。

用还是不用

其实注入框架用还是不用,是一个问题,如若使用框架,则要求团队每一个人都要遵守说明来编写代码解决依赖注入。而这些框架其实也并非很容易就能上手,学习系数相对复杂,难以掌握,这也是需要考虑的问题。

个人观点为不推荐也不反对使用这些框架,但是觉得有些时候我们寄希望于一个框架,不如平时注意这些问题,人为避免何尝不是对自己的一种基本要求呢?

依赖查找

依赖查找和依赖注入一样属于控制反转原则的具体实现,不同于依赖注入的被动接受,依赖查找这是主动请求,在需要的时候通过调用框架提供的方法来获取对象,获取时需要提供相关的配置文件路径、key等信息来确定获取对象的状态。

以上就是对依赖注入的资料详细介绍,后续继续补充相关资料,谢谢大家对本站的支持!

Java的依赖对象是什么意思_面向对象编程依赖注入详解相关推荐

  1. java接口vm和dto的区别_第十八节:详解Java抽象类和接口的区别

    前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...

  2. mysql宽字节注入_转宽字节注入详解

    在mysql中,用于转义的函数有addslashes,mysql_real_escape_string,mysql_escape_string等, 还有一种情况是magic_quote_gpc,不过高 ...

  3. Java_第08章_面向对象编程(高级)

    第08章_面向对象编程(高级) 本章专题与脉络 1. 关键字:static 回顾类中的实例变量(即非static的成员变量) class Circle{private double radius;pu ...

  4. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

  5. java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...

    原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...

  6. spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)

    spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...

  7. Java中常见RuntimeException与其他异常表及Exception逻辑关系详解

    Java中常见RuntimeException与其他异常表及Exception逻辑关系详解 前言 常见`RuntimeException` 其他错误类型 `Error`类 `Exception`类 E ...

  8. java 可见性_Java并发编程-volatile可见性详解

    前言 要学习好Java的多线程,就一定得对volatile关键字的作用机制了熟于胸.最近博主看了大量关于volatile的相关博客,对其有了一点初步的理解和认识,下面通过自己的话叙述整理一遍. 有什么 ...

  9. java中北大学ppt总结+课后习题第四章(小宇特详解)

    java中北大学ppt总结+课后习题第四章(小宇特详解) 继承 子类与父类 继承是根据现有类创建新的类的机制,由继承而得到的新类称为子类(subclass)或派生类(derived class),被继 ...

  10. Java调用SMSLib用单口短信猫发送短信详解

    技术园地 当前位置:短信猫网站主页 > 技术园地 > [转载]Java调用SMSLib用单口短信猫发送短信详解 发布时间:2017/02/09 点击量:620 SMSLib是Apache的 ...

最新文章

  1. 聊聊 Kafka 那点破事!
  2. 黑鹰长期班.边程浪子系列教程
  3. WPF中的动画——(六)演示图板
  4. 【独家】不懂逻辑怎么做PM,最详细产品逻辑课堂资料大公开!
  5. PHP二维数组去除重复值
  6. 韩顺平循序渐进学java 第12讲 多态
  7. springboot 整合jsp过程中的一些问题
  8. 计算机网络(十二)-信道划分介质访问控制-信道复用
  9. 2017.6.12 crash的数字表格 思考记录
  10. 线段树之单点更新,区域求和
  11. java在win8闪退_解决Win8/Win8.1系统下的IE11闪退的六种方法
  12. 【新Attention】最强的Attention函数诞生啦,带给你意想不到的巨大提升!
  13. 关于java字符串编译优化问题
  14. android集成第三方---集成wps实现文档阅读功能
  15. 阿里云物联网平台使用笔记(一)——利用云产品流转关联两个设备的数据
  16. 智能不止联络,容联助力银行以服务创造价值
  17. 【虹科讲座预告】企业如何防止基于USB的数据外泄
  18. uni-app入门及练手项目
  19. php启动 大量sess文件,关于PHP中Session文件过多的有关问题
  20. : ERR Client sent AUTH, but no passw redis解决

热门文章

  1. ckplayer6.8修改logo
  2. python透视表画图_如何用Python实现透视表?
  3. Min Difference
  4. 台式计算机键盘灯打开方式,台式电脑开机时键盘灯不亮,必须要按一下Numlock才会亮,但系统没什么问题。怎么办?...
  5. 【预测模型】人口结构可持续发展模型构建
  6. 电脑文件被杀毒软件误删了怎么恢复?
  7. 基金投资入门1:基金基础知识介绍
  8. Adobe Premiere基础-编辑素材文件常规操作(脱机文件,替换素材,素材标签和编组,素材启用,便捷调节不透明度,项目打包)(十七)
  9. AutoCAD2020中文版软件下载和安装教程|兼容WIN10
  10. 排查生产环境下CPU飙高的原因