如何理解Spring框架中的ioc?
如何理解Spring框架中的ioc?
ioc,Inversion of Control(控制反转),是Spring中的一种设计思想而非技术。
我们可以从4个方面理解ioc:
①谁控制谁? ——Ioc容器控制对象。
②控制了什么? ——Ioc容器控制了获取对象及其外部资源。
③为什么是反转? ——传统的javaSE技术是手动new对象的,通过new的对象直接控制资源的(相当于“正转”);而spring是使用Ioc容器创建对象并获取外部资源,相当于通过第三方查询获取(相当于“反转”)。即:传统技术是主动创建对象,而ioc思想是被动接受依赖对象。
④怎么实现反转的?——通过依赖注入(DI)的方式实现反转(这里的反转即:获取对象的方式)。
DI
DI,Dependency Injection(依赖注入),是将容器动态地注解到应用程序中。
简单地说,DI是通过注解的方式获取到对象以及一些外部资源。
DI和ioc其实是一个东西,只是理解的层面不同。通俗地说,ioc层面理解就是:获取对象的方式不再是我们主动创建寻找,而是多了个‘中介’去帮我们查询对象并寻找。DI层面理解就是:写代码的时候,要用到某个对象及资源,我们不再需要去查询那个对象在哪里,并且new对象,我们只需要配置好就可以直接通过@获取我们需要的资源。
耦合和内聚
值得一提的是,ioc思想由于通过第三方ioc容器创建对象,能够减少代码的耦合性,从而使得代码更优。
看到这里也许有些人开始蒙了,为啥低耦合代码更优?这样一句话你或许听过:“我们写代码都要尽量向低耦合高内聚靠近!”这说明,低耦合高内聚的代码更好,你只需要知道这一点就够了。至于它们的理解,请继续往下看:
耦合和内聚都是评判软件程序优劣的一个标准。
理解耦合:
耦合指的是元素与元素之间的连接关系、依赖程度等。
举个例子,在类1引用类2的变量,我们需要new 类2的对象,这个时候类1和类2产生了一种依赖性:假如类2发生了改变或者消失,类1就会出现问题(报错)。类1与类2的这种关系,就是一种耦合,因为它们之间有一种依赖性。
上述只有两个类作比较,看不出什么,但是如果很多个类之间相互引用(也就是“高耦合”),创建其他类的对象,如果其中一些类做了修改或其他什么,想象一下,会报多少错?查询起来会多麻烦?工作效率是不是大打折扣了?
所以,低耦合的代码会更优。
有的人可能会问,那为什么ioc思想相对传统JavaSE技术就是低耦合的?
ioc思想是通过Ioc容器创建对象,相当于通过第三方查询对象并获取外部资源,是没有直接建立联系的,因此也就不存在高耦合的问题,注解之后资源就自动引入了。
理解内聚:
内聚通常指的是功能内聚,即程序之间的共同性。
用一句俗语解释:术业有专攻。各行各业,只需要管属于他们行业范围内的事情就可以了。内聚也是这个意思。
举个例子,我要写一个心理测试系统,那么主要功能就是心理测试。我写的所有代码如果都是心理测试核心代码,那么就是100%内聚,也就是超高内聚了,当然只是举个例子便于理解哈。
高内聚就是要我们写的代码尽可能相关,也就是所有程序尽可能围绕某个具体的功能点,这样程序更具体,也更便于管理。
上述是参考其他文献自行总结的,若有不合理的地方,恳请斧正,谢谢!
参考文献:
【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3
如何理解Spring框架中的ioc?的更多相关文章
- Spring框架中的IOC?
Spring中的org.springframework.beans包和org.SpringframeWork.context包构成了Spring框架IOC容器的基础.BeanFactory接口提供了一 ...
- Spring框架中的IOC和DI的区别
上次面试被问到IOC和DI的区别时,没怎么在意,昨天又被问到,感觉有点可惜.今晚总算抽点时间,查看了spring官方文档.发现,IoC更像是一种思想,DI是一种行为.为了降低程序的耦合度,利用spri ...
- 理解Spring框架中Bean的5个作用域
当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring I ...
- 第四课:通过配置文件获取对象(Spring框架中的IOC和DI的底层就是基于这样的机制)
首先在D盘创建一个文件hero.txt,内容为:com.hero.Hero(此处必须是Hero的完整路径) 接下来是Hero类 package com.hero; public class Hero ...
- Spring框架中IoC(控制反转)的原理(转)
原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...
- Spring MVC -- Spring框架入门(IoC和DI)
Spring MVC是Spring框架中用于Web应用开发的一个模块.Spring MVC的MVC是Model-View-Controller的缩写.它是一个广泛应用于图像化用户交互开发中的设计模式, ...
- Castle框架中的IOC和AOP机制
反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在.NET平台下实现这两项技术没有形成可以广泛套用的框架 ...
- Spring框架中 配置c3p0连接池 完成对数据库的访问
开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...
- 细说shiro之五:在spring框架中集成shiro
官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <gr ...
- Spring框架学习之IOC(二)
Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...
随机推荐
- WPF之lognet4的基本使用
log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文介绍lognet4的基本使用. 第一步:新 ...
- 32bit和64bit系统的区别,运行机制浅析
32bit:内存的最大寻址空间是2^32=4G,就是说32位系统的处理器最大只支持到4G内存 64bit:内存的最大寻址空间是2^64,大于1亿GB,但是实际上支持不到那么大的内存,大概是2^40+ ...
- ROSIntegration ROSIntegrationVision与虚幻引擎4(Unreal Engine 4)的配置
ROSIntegration ROSIntegrationVision与虚幻引擎4(Unreal Engine 4)的配置 操作系统:Ubuntu 18.04 虚幻引擎:4.26.2 目录 ROSIn ...
- 2.mysql-库表行管理
1.数据库管理 1.1 SQL语句 1.1.1 查看当前所有的数据库 show databases; 1.1.2 创建数据库 create database 数据库名; create databse ...
- [排序算法] 快速排序 (C++) (含三种写法)
快速排序解释 快速排序 Quick Sort 与归并排序一样,也是典型的分治法的应用. (如果有对 归并排序还不了解的童鞋,可以看看这里哟~ 归并排序) 快速排序的分治模式 1.选取基准值,获取划分位 ...
- jsp 页面返回、本页面刷新
返回上一页面: window.history.go(-1); //返回上一页window.history.back(); //返回上一页 返回上一页面并对上一页面刷新: history.go(-1 ...
- 打印菱形-java
public class WeekendDemo01 { /** 打印菱形 * * * *** * ***** * *** * * */ public static void main(String[ ...
- Android ViewPager2 + Fragment + BottomNavigationView 联动
Android ViewPager2 + Fragment + BottomNavigationView 联动 本篇主要介绍一下 ViewPager2 + Fragment + BottomNavig ...
- 数据结构高阶--AVL(平衡二叉树)(图解+实现)
AVL树(平衡二叉树) 概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下.因此为了解决这个问题,两位俄罗斯的数学家发明 ...
- GitHub上的一个笔记相关小项目
就是一个笔记屑小项目, C++编写,有想一起开发的私信 AlgorithWeaver/V-note (github.com) 项目名V-note QVQ