当前位置: 首页 > 编程日记 > 正文

Spring学习-理解IOC和依赖注入

最近刚买了一本介绍ssm框架的书,里面主要对Mybatis、spring、springmvc和redis做了很多的讲解,个人觉得虽然有的内容我看不懂,但是整体上还是不错的。最近正在学习中,一边学习一边做一些总结,现在我对这些思想技术还没有达到很深入的理解,所以总结的比较浅显。现在就把有关spring IOC的知识总结一下:

1.理解IOC和依赖注入

IOC,就是控制反转:是一种通过描述并通过第三方去产生或获取特定对象的方式。刚开始听到这个名词的时候,感觉很难理解,随着逐渐熟悉,可以简单的理解为,创建对象不需要通过new,而是交给spring容器,那spring容器创建对象并交给你使用的过程叫依赖注入。也就是说spring容器创建对象是通过依赖注入来完成的。

2.依赖注入的三种方式

既然spring创建对象是通过依赖注入来完成的,那就要讲到依赖注入的三种方式了。一般来说,依赖注入可以分为三种方式。

  • 构造器注入。
  • setter注入。
  • 接口注入。

构造器和setter注入是主要的方式,接口注入是从别的地方注入的方式。

2.1 构造器注入

原理:构造器注入是依赖于构造方法来实现的,大多数的情况下,我们是通过类的构造器来创建对象的,spring是通过反射的方式,通过构造器来完成注入。在配置文件中添加以下配置信息。
代码如下:

<bean id="" class=""><constructor-arg index="" value="" /><constructor-arg index="" value="" />
</bean>

constructor-arg元素是用于定义类构造方法的参数,index是定义参数的位置,value则是设置参数的值,通过这样的定义spring便知道使用什么样的构造方法去创建对象了。
这样的注入方式比较简单,但是缺点就是如果构造方法的参数非常多,那么这样的构造方法就会变得复杂,可读性也会得差,所以要考虑其它的方式。

2.2 setter注入

setter注入是spring中最主流的注入方式,它利用java bean规范所定义的setter方法来完成注入,灵活且可读性也高。就是消除了构造器注入时出现过多参数的问题,首先把构造器声明为无参的,然后通过setter注入为其设置对应的值,其实也是通过反射技术实现的,
配置信息如下:

<bean id="" class=""><property  name="" value="" /><property  name="" value="" />
</bean>

通过这样的配置spring就会通过反射调用无参构造器生成对象,同时通过反射对应的setter注入配置值了。这种方式是spring最为主要的方式。

2.3 接口注入

这个方式好像不是很常用,所以这里就不做总结了,只是简单的了解一下。

小结

以上是对我学习的一些总结,内容不是很专业,所以下面引用其他大神们的讲解

看大神的讲解

下面内容来自:http://jinnianshilongnian.iteye.com/blog/1413846

3.1.1 IoC是什么

Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

  • 谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

  • 为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

用图例说明一下,传统程序设计如图3-1,都是主动去创建相关对象然后再组合起来:

1240732-20171011112029730-800630219.png

图3-1 传统应用程序示意图

当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图3-2所示:

1240732-20171011112048480-652717144.png

图3-2有IoC/DI容器后程序结构示意图

3.1.2 IoC能做什么

IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。

IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

3.1.3 IoC和DI

DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

  • 谁依赖于谁:当然是应用程序依赖于IoC容器;

  • 为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

  • 谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

  • 注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”

转载于:https://www.cnblogs.com/black-spike/p/7648164.html

相关文章:

windows server2012怎样关机怎样重启-详细教程

|浏览&#xff1a;1991|更新&#xff1a;2014-12-15 17:33123456分步阅读百度经验:jingyan.baidu.com windows server2012和以往有些不同&#xff0c;关机/重启按钮不是在左边&#xff0c;甚至左边的“开始”都不见了&#xff0c;那怎样关机/重启呢&#xff1f;这里开始演示&am…

封装 localStorage 缓存,兼容网页,微信小程序,uni-app

封装的缓存功能&#xff0c;兼容网页&#xff0c;微信小程序&#xff0c;uni-app 使用&#xff0c;支持设置缓存&#xff0c;获取缓存&#xff0c;移除缓存&#xff0c;清空缓存&#xff0c;设置缓存时间&#xff0c;分组缓存设置。 把最下面的 Str4.js 代码拷贝到项目内可以直…

考csp所需算法_CSP vs RxJS:您所不知道的。

考csp所需算法by Kevin Ghadyani通过凯文加迪亚尼(Kevin Ghadyani) CSP vs RxJS&#xff1a;您所不知道的。 (CSP vs RxJS: what you don’t know.) CSP发生了什么&#xff1f; (What happened to CSP?) You probably clicked this article thinking “what is CSP?” It’s…

iOS蓝牙4.0开发例子

1建立中心角色 123#import <CoreBluetooth/CoreBluetooth.h> CBCentralManager *manager; manager [[CBCentralManager alloc] initWithDelegate:self queue:nil]; 2扫描外设&#xff08;discover&#xff09; [manager scanForPeripheralsWithServices:nil options:…

Spark Shuffle原理解析

Spark Shuffle原理解析 一&#xff1a;到底什么是Shuffle&#xff1f; Shuffle中文翻译为“洗牌”&#xff0c;需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节点上进行计算。 二&#xff1a;Shuffle可能面临的问题&#xff1f;运行Task的时候才会产…

云开发使用 got 的 get/post 传参请求示例代码

使用 got 进行网络请求的步骤&#xff1a; 1.创建云函数&#xff0c;并在终端执行云函数 2.执行 npm 安装 got &#xff0c;命令&#xff1a;cnpm install --save got 3.在云函数中使用 示例代码&#xff1a; // 云函数入口文件 const cloud require(wx-server-sdk) cons…

JavaScript词法作用域的简单介绍

by Michael McMillan迈克尔麦克米兰(Michael McMillan) JavaScript词法作用域的简单介绍 (An easy intro to Lexical Scoping in JavaScript) Lexical scoping is a topic that frightens many programmers. One of the best explanations of lexical scoping can be found in…

Flex 布局详解 - 转自阮一峰老师

Flex 是 Flexible Box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性。任何的盒子都可以使用它。 下面我们来看一下使用 Flex 布局的容器的属性 flex-direction flex-wrap flex-flow justify-content align-items align-content 1.…

bzoj 1086: [SCOI2005]王室联邦

Description “余”人国的国王想重新编制他的国家。他想把他的国家划分成若干个省&#xff0c;每个省都由他们王室联邦的一个成员来管理。他的国家有n个城市&#xff0c;编号为1..n。一些城市之间有道路相连&#xff0c;任意两个不同的城市之间有且仅有一条直接或间接的道路。为…

在7分钟内深刻理解咖喱

Eric Elliott’s exceptional Composing Software series is initially what got me excited about functional programming. Its a must-read. 埃里克埃利奥特(Eric Elliott)杰出的合成软件系列最初使我对函数式编程感到兴奋。 这是必读的。 At one point in the series, he …

github后端开发面试题大集合(一)

作者&#xff1a;小海胆链接&#xff1a;https://www.nowcoder.com/discuss/3614?type0&order0&pos5&page0?fromwb来源&#xff1a;牛客网 转载自github&#xff0c;中文--->链接在这&#xff0c;英文---->链接在这文章较长&#xff0c;我把它拆分了三个部…

微信小程序左滑删除效果的实现完整源码附效果图

效果图&#xff1a; 功能描述&#xff0c;小程序列表左滑删除功能的实现完整源代码实现&#xff1a; <view wx:for{{friends}} wx:key"" wx:if{{groupType4}} catchtap"nav_oneChat" id"{{item._id}}" class"item p_r" style"…

Eclipse下修改工程名

一。 右键工程&#xff1a;Refactor->Rename&#xff0c;或选中工程按F2&#xff0c;修改名称 二。右键工程&#xff1a;Properties->Web Project Settings,修改Context Root三。1.找到项目所在位置&#xff08;如图&#xff09;&#xff1a; 2.修改项目目录/.setting目录…

git操作手册_基本的Git手册

git操作手册介绍 (Introduction) Hi! I am Sanjula, and in this guide I hope to teach you a little bit about Git including:嗨&#xff01; 我是Sanjula &#xff0c;在本指南中&#xff0c;我希望教您一些有关Git的知识&#xff0c;包括&#xff1a; What Git is 什么是…

PHP 接入(第三方登录)QQ 登录 OAuth2.0 过程中遇到的坑

前言 绝大多数网站都集成了第三方登录&#xff0c;降低了注册门槛&#xff0c;增强了用户体验。最近看了看 QQ 互联上 QQ 登录的接口文档。接入 QQ 登录的一般流程是这样的&#xff1a;先申请开发者 -> 然后创建应用&#xff08;拿到一组 AppId 和 AppKey&#xff09;-> …

npm全局环境变量配置,全局配置cnpm

今天新电脑想安装node.js &#xff0c; 发现最新版本的node.js已经不支持win7了&#xff0c;但是又不想换系统&#xff0c;所以找了个旧版本&#xff0c;这里不多说了。如果找不到旧版本的node下载&#xff0c;可以去我的QQ交流群文件里面下载&#xff0c;QQ群号&#xff1a;17…

NTFS for Mac OS X:使用Brew安裝NTFS-3G

在最新的OSX系統中&#xff0c;其實已經完整兼容NTFS文件系統&#xff0c;只是出於安全考慮默認是以只讀模式掛載NTFS分區的&#xff0c;可以透過diskutil查詢硬碟UUID&#xff0c;重新以讀寫(rw)權限掛載&#xff0c;具體的可以參照這裡 當然&#xff0c;也有現成的軟體幫助你…

javascript开关_JavaScript开关案例简介

javascript开关In this short article, I will introduce you to JavaScript switch cases and how to use them with practical examples.在这篇简短的文章中&#xff0c;我将向您介绍JavaScript切换案例以及如何通过实际示例使用它们。 This article will explain better wi…

C++中一个class类对象占用多少内字节(7个例子,很清楚)

一个空的class在内存中多少字节&#xff1f;如果加入一个成员函数后是多大&#xff1f;这个成员函数存储在内存中什么部分&#xff1f; 一个Class对象需要占用多大的内存空间。最权威的结论是&#xff1a; *非静态成员变量总合。 *加上编译器为了CPU计算&#xff0c;作出的数据…

Java学习----到底调用哪一个方法(多态)

public class Father {public void print() {System.out.println("Father:print()");} } public class Son extends Father{// 方法的覆盖&#xff1a;子类重写父类的同名方法 Overridepublic void print() {System.out.println("Son:print()");}// Father…

mpvue 转uni-app 操作记录

1.创建一个uni-app 的项目&#xff0c;把原有的mpvue项目手动迁移过来 2.用到mpvue特性的代码&#xff0c;需要修改成uni-app 兼容的&#xff0c;例如 mpvue-wxparse 可以修改成 3.src/app.json 改成 pages.json ,路径格式需要改&#xff0c;如下格式 {"pages": [&…

桌面应用程序 azure_Azure Logic应用程序用例–黑色星期五

桌面应用程序 azureThis blog gives an overview of how Azure Serverless technologies came to rescue when the custom-built integration system went down. Also, it shows the high-level architecture solution built using Azure Serverless services like Logic Apps,…

PHP的静态变量介绍

静态变量只存在于函数作用域内&#xff0c;也就是说&#xff0c;静态变量只存活在栈中。一般的函数内变量在函数结束后会释放&#xff0c;比如局部变量&#xff0c;但是静态变量却不会。就是说&#xff0c;下次再调用这个函数的时候&#xff0c;该变量的值会保留下来。 只要在变…

MySQL 解压版创建用户密码

root 权限进入MySQL&#xff1a; mysql –uroot 查看当前MySQL用户&#xff1a; select user,host from mysql.user; 此处以User为root&#xff0c;Host为localhost的账户为例&#xff0c;将密码改为password的命令&#xff1a; SET PASSWORD FOR rootlocalhost PASSWORD(newp…

git 忽略指定文件夹的上传

我们在使用 git 开发的时候&#xff0c;有些插件的模块文件通过npm install 就可以下载&#xff0c;一般是不上传到 git 中的&#xff08;因为文件太多会导致很耗时)&#xff0c;例如 我的 node_modules 文件夹&#xff0c;不想上传&#xff0c;我们应该这么做。 我们需要创建一…

数据库初学者_面向初学者的免费6小时数据科学课程

数据库初学者Data science is considered the "sexiest job of the 21st century." Learn data science in this full 6-hour course for absolute beginners from Barton Poulson of datalab.cc.数据科学被认为是“ 21世纪最艰巨的工作”。 通过datalab.cc的 Barton…

网页抓取及下载

downAndroidApk.php <?php /* 命令行 d: cd ApacheServer\php php.exe D:\ApacheServer\web\crawl\downAndroidApk.php --appidFileD:\ApacheServer\web\crawl\youxi.txt --newDirD:\ApacheServer\web\crawl\requestNewDir*/ // 判断必须在php-cli模式下运行&#xff0c;即…

javascript中关于this指向问题详解

前 言 LiuDaP 在前端的学习中&#xff0c;我们必然要用到js&#xff0c;js可以说是前端必不可少的的东西。在学习js的过程中&#xff0c;我们会经常用到this这个东西&#xff0c;而this的指向问题就变得尤为重要。今天正好有空闲时间&#xff0c;就给大家详细介绍一下js中关于…

mpvue 转uniapp 导航栏样式错乱问题修复 tabbar 样式修复

效果图&#xff1a;修改前&#xff0c;修改后 找了半天没找到原因&#xff0c;只能自己改样式了&#xff0c;下面是样式代码&#xff08;在app.vue 里面加上就行&#xff09; <style>/*每个页面公共css */uni-tabbar {box-sizing: border-box;position: fixed;left: 0;bo…

css规则_CSS规则,将使您的生活更轻松

css规则by Nick Gard尼克加德(Nick Gard) CSS规则&#xff0c;将使您的生活更轻松 (CSS rules that will make your life easier) After years of writing and maintaining a couple of very large web projects and numerous smaller ones, I have developed some heuristics…