如何简单的理解依赖注入详解
时间:2018-07-11
一直对依赖注入理解不清楚,最近突然理解了,所以下面这篇文章主要给大家介绍了关于如何简单的理解依赖注入的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
前言
控制反转(IoC)用来解决耦合的,主要分为两种类型:依赖注入和依赖查找。
依赖注入就是把本来应该在程序中有的依赖在外部注入到程序之中,当然他也是设计模式的一种思想。
假定有接口A和A的实现B,那么就会执行这一段代码A a=new B();这个时候必然会产生一定的依赖,然而出现接口的就是为了解决依赖的,但是这么做还是会产生耦合,我们就可以使用依赖注入的方式来实现解耦。在Ioc中可以将要依赖的代码放到XML中,通过一个容器在需要的时候把这个依赖关系形成,即把需要的接口实现注入到需要它的类中,这可能就是“依赖注入”说法的来源了。
简单的理解依赖注入
那么我们现在抛开Spring,抛开XML这些相关技术,怎么使用最简单的方式实现一个依赖注入呢?现在还是接口A和A的实现B。
那么我们的目的是这样的,A a=new B();现在我们在定义一个类C,下面就是C和A的关系,C为了new出一个A接口的实现类
public class C { private A a; public C(A a) { this.a=a; } }
那么如何去new呢,定义一个类D,在D中调用C的构造方法的时候new B();即
public class D{ @Test public void Use(){ C c=new C(new B()); } }
这样我们在C中就不会产生A和B的依赖了,之后如果想改变A的实现类的话,直接可以修改D中的构造方法的参数就可以了,很简单,也解决了耦合。这种方式就是最常说的构造器注入。
那么Spring就是解决耦合和使用Ioc的,这里最简单的Spring依赖注入的例子:
SpringConfig.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="sayhello" class="smile.TheTestInterface"> <constructor-arg ref="hello"/> </bean> <bean id="hello" class="smile.Hello" /> </beans>
解析:这里配置了两个Bean,第一个是为了给构造器中注入一个Bean,第二个是构造器中要注入的Bean。
Hello.java
package smile; /** * Created by smile on 2016/4/21. */ public class Hello { public Hello(){ System.out.println("Hello"); } public void sayHello(){ System.out.println("I want say Hello"); } }
TheInterface.java
package smile; /** * Created by smile on 2016/4/20. */ public class TheTestInterface { private Hello hello; public TheTestInterface(Hello hello) { this.hello = hello; } }
Use.java
package com.smile; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import smile.Hello; /** * Created by smile on 2016/4/21. */ public class Use { @Test public void UseTest(){ ApplicationContext context=new ClassPathXmlApplicationContext("SpringConfig.xml"); Hello hello=(Hello)context.getBean("hello"); hello.sayHello(); } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
- Day2下午解题报告
- python获取打开网站的状态码
- 【关关的刷题日记57】Leetcode 101. Symmetric Tree
- FreeBuf官网发布《简易Python Selenium爬虫实现歌曲免费下载》
- HashSet 源码分析
- Angular开发实践(五):深入解析变化监测
- 【关关的刷题日记58】Leetcode 112 Path Sum
- 学大伟业Day解题报告
- Python数据增强(data augmentation)库--Augmentor 使用介绍
- Leetcode-Easy 101. Symmetric Tree
- 数据结构-栈的定义及python实现
- 【关关的刷题日记59】Leetcode 257 Binary Tree Paths
- 学大伟业 国庆Day2
- ECMAScript 6入门 - 变量的解构赋值
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Bottle HTTP 头注入漏洞探究
- Hadoop2.7.6_03_HDFS原理
- Hadoop2.7.6_04_HDFS的Shell操作与常见问题
- Hadoop2.7.6_05_mapreduce-Yarn
- Hadoop2.7.6_06_mapreduce参数优化
- NFS服务搭建与配置
- Hadoop2.7.6_07_HA高可用
- Hadoop2.7.6_08_Federation联邦机制 1.1. HDFS-federation图解2.1. 注意事项3.1. 部署3.2. 环境变量3.3. c
- ThinkPHP5 SQL注入漏洞 && PDO真/伪预处理分析
- Hive-1.2.1_01_安装部署
- Supervisord远程命令执行漏洞(CVE-2017-11610)
- Hive-1.2.1_02_简单操作与访问方式
- PHP-CGI远程代码执行漏洞(CVE-2012-1823)分析
- Hive-1.2.1_03_DDL操作 1.1. Create Database1.2. Drop Database1.3. Use Database2.1. Cre
- Hive-1.2.1_04_DML操作 5.1. Join8.1. 使用案例8.2. Transform实现