了解依赖注入

前言

先了解下控制反转--转自知乎的国哥

如果一个类A 的功能实现需要借助于类B,那么就称类B是类A的依赖,如果在类A的内部去实例化类B,那么两者之间会出现较高的耦合,一旦类B出现了问题,类A也需要进行改造,如果这样的情况较多,每个类之间都有很多依赖,那么就会出现牵一发而动全身的情况,程序会极难维护,并且很容易出现问题。要解决这个问题,就要把A类对B类的控制权抽离出来,交给一个第三方去做,把控制权反转给第三方,就称作控制反转(IOC Inversion Of Control)控制反转是一种思想,是能够解决问题的一种可能的结果,而依赖注入(Dependency Injection)就是其最典型的实现方法。由第三方(我们称作IOC容器)来控制依赖,把他通过构造函数、属性或者工厂模式等方法,注入到类A内,这样就极大程度的对类A和类B进行了解耦

想理解控制反转,就得想清楚这个第三方,在spring中便是IOC容器。将原本两个耦合性很强的对象分给中介第三方进行控制。

依赖注入是实现控制反转的一种方式,依赖注入是将实例变量传入到一个对象中去的过程、方式、一种设计模式。依赖注入方式下,注入将依赖传给调用方,不是像原来的调用方直接使用依赖。所以很明显也是为了解耦,参考下wiki的图,了解大概分类

可以参考下官网的介绍

上面的官网中讲到依赖注入是依靠这两个主要的方式依赖-基于构造器的依赖注入和基于setter的依赖注入。下面就讲下详细的实现方式。

实现依赖注入

1、构造器注入

在上一篇的spring入门篇提了,特别是三种方式,这里再记录一下

环境

先总体的项目小测配置以及定义的各个类

实体类

package com.yhy.pojo;

public class Hello {
private String str; public Hello(String str) {
this.str = str;
} /**
* @return String return the str
*/
public String getStr() {
return str;
} /**
* @param str the str to set
*/
public void setStr(String str) {
this.str = str;
} public void show() {
System.out.println(str);
} }

测试类

 @Test
public void test()
{
//获得spring的上下文内容
//拿到容器
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//使用容器获得对象
Hello hello = (Hello) context.getBean("hello"); hello.show();
}

使用有参构造有几个方法

beans.xml中使用三种方式

  • 使用参数名
 <bean id="hello" class="com.yhy.pojo.Hello">
<constructor-arg name="str" value="yhy"/>
</bean>
  • 使用下标索引
  <bean id="hello" class="com.yhy.pojo.Hello">
<!-- 从零开始的索引值,多个参数的时候再使用别的参数 -->
<constructor-arg index="0" value="hello world"/>
</bean>

  • 使用参数的类型来配置
  <bean id="hello" class="com.yhy.pojo.Hello">
<constructor-arg type="java.lang.String" value="hello spring"/>
</bean>

其他

在.xml配置文件中还有两个选项。

2、set方法注入

这个方式强调bean类要有set方法,在实例化后调用set方法完成注入。

定义一个person类来测试下set方法注入

注入的类型不同使用的不同参数在配置bean中。如下图,可以有多个选择在propety中,一些标签都是可以直接秒懂的。

  • 常量注入

  • bean注入
 <!-- bean注入 ref进行引入-->
<property name="address" ref="addr"></property>
  • 数组注入
 <!-- 数组注入 -->
<property name="books">
<array>
<value>悲惨世界</value>
<value>水浒传</value>
<value>金瓶X</value>
</array>
</property>
  • 列表注入
    <!-- list注入 -->
<property name="hobbies">
<list>
<value>打篮球</value>
<value>健身</value>
<value>游泳</value>
</list>
</property>
  • map注入
 <!-- map注入 -->
<property name="card">
<map>
<entry key="银行卡" value="82937472389"></entry>
<entry key="身份证" value="2345382937472389"></entry>
</map>
</property>
  • properties注入
 <!-- properties注入 -->
<property name="info">
<props>
<prop key="id">201705239</prop>
<prop key="url">yhytj.top</prop>
<prop key="name">yhy</prop>
</props>
</property>

最后的测试类

    public void test() {
// 获得spring的上下文内容
// 拿到容器
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// 使用容器获得对象
Person person = (Person) context.getBean("person");
//这里定义了一个show方法,输出格式,vscode自动生成tostring还不熟。使用插件生成这个
person.show();
}

  • 最后输出

拓展命名空间

在官网上还可以使用p命名空间c命名空间简化工作,但其实有idea开发等工具,有时也差不多了,大家可以多多了解下,我只是用了个小测试来了解。

还有一个c命名空间,对应着constructor-arg,这里就不走小demo,可以上官网了解一些

浅谈spring依赖注入的更多相关文章

  1. 浅谈(IOC)依赖注入与控制反转(DI)

    前言:参考了百度文献和https://www.cnblogs.com/liuqifeng/p/11077592.html以及http://www.cnblogs.com/leoo2sk/archive ...

  2. 浅谈_依赖注入 asp.net core

    1.1什么是依赖 我们先看下图 可以简单理解,一个HomeController类使用到了DBContext类,而这种关系是有偶然性,临时性,弱关系的,但是DBContext的变化会影响到HomeCon ...

  3. 浅谈C#依赖注入

    什么是依赖注入?不管是js中的一些前端框架还是,java,C#,php等中的一些后端开发框架中,都会涉及这个看着逼格略高的词语:依赖注入,越是看着好像很厉害的东西越是会让许多人学习产生恐惧,好像很厉害 ...

  4. 浅谈Spring的两种配置容器

    浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41   作者:黄小鱼ZZZ     ...

  5. Spring5.0源码学习系列之浅谈循环依赖问题

    前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文浅谈Spring循环依赖问题,这是一个面试比较常见的问题 1.什么是循环依赖? 所谓的循环依 ...

  6. Spring依赖注入(IOC)那些事

    小菜使用Spring有几个月了,但是对于它的内部原理,却是一头雾水,这次借着工作中遇到的一个小问题,来总结一下Spring. Spring依赖注入的思想,就是把对象交由Spring容器管理,使用者只需 ...

  7. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  8. Spring依赖注入:注解注入总结

    更多11   spring   依赖注入   注解   java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...

  9. Spring 依赖注入,在Main方法中取得Spring控制的实例

    Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...

随机推荐

  1. 图论--二分图最佳完美匹配(KM模板)

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; cons ...

  2. rabbitmq启动时出错epmd error for host

    centos7环境下新装rabbitmq,第一次启动时发现出错:ERROR: epmd error for host "****":XXXXXXX 检查发现当前机器的名称为 1  ...

  3. 区间dp 例题

    D - 石子合并问题--直线版 HRBUST - 1818 这个题目是一个区间dp的入门,写完这个题目对于区间dp有那么一点点的感觉,不过还是不太会. 注意这个区间dp的定义 dp[i][j] 表示的 ...

  4. Spring官网阅读(五)BeanDefinition(下)

    上篇文章已经对BeanDefinition做了一系列的介绍,这篇文章我们开始学习BeanDefinition合并的一些知识,完善我们整个BeanDefinition的体系,Spring在创建一个bea ...

  5. spring学习笔记(六)自定义spring-boot-starter(2)

    上篇文章我们主要讲了spring自动装配的原理,我们知道了springboot在启动的时候会自动去读.factories文件,在factories文件中,autoConfiguration对应的就是我 ...

  6. 王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结

    实验四 类与对象的定义及使用 实验时间 2018-9-20 1.目的与要求 学习目标 掌握类与对象的基础概念,理解类与对象的关系: 掌握对象与对象变量的关系: 掌握预定义类的基本使用方法,熟悉Math ...

  7. 08_CSS入门和高级技巧(6)

    排查错误 Chrome浏览器的审查功能. 错误1:选择器写错了,压根没有选择上: 如果写了一个错误的选择器, <style type="text/css"> dvi p ...

  8. 变分深度嵌入(Variational Deep Embedding, VaDE)

    变分深度嵌入(Variational Deep Embedding, VaDE) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 这篇博文主要是对论文“ ...

  9. docker虚拟化平台构建

    docker虚拟化平台构建 从1.13版本以后的docker软件分为连个版本:企业版.社区版,在企业中推荐社区版本. 构建docker平台环境,系统选择centos7.x,推荐linux内核3.10 ...

  10. js移动端复制到剪贴板

    // 复制到剪切板 function copy(str){ var save = function (e){ e.clipboardData.setData('text/plain',str);//c ...