本文借鉴:Spring学习(特此感谢!)

一、IOC(控制反转)

定义:反转控制 (Inversion Of Control)的缩写,即创建对象的反转控制

正向控制:若要使用某个对象,需要自己去负责对象的创建。

反向控制:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架。

例子:在现实生活中,人们要用到一样东西的时候,第一反应就是去找到这件东西,比如想喝新鲜橙汁,在没有饮品店的日子里,最直观的做法就是:买果汁机、买橙子,然后准备开水。

值得注意的是:这些都是你自己“主动”创造的过程,也就是说一杯橙汁需要你自己创造。

  然而到了今时今日,由于饮品店的盛行,当我们想喝橙汁时,第一想法就转换成了找到饮品店的联系方式,通过电话等渠道描述你的需要、地址、联系方式等,下订单等待,过一会儿就会有人送来橙汁了。

  值得注意的是:你并没有“主动”去创造橙汁,橙汁是由饮品店创造的,而不是你,然而也完全达到了你的要求,甚至比你创造的要好上那么一些。

代码示例:(这里使用的是Spring4.3.0版本的jar包)

pojo

/*** 这是一个模拟果汁模型的pojo*/
public class Source implements Serializable {private String fruit;   // 类型private String sugar;   // 糖分描述private String size;    // 大小杯/*getter和setter方法暂时省略*/
} 

Spring配置文件

<?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 name="source" class="pojo.Source"><property name="fruit" value="橙子"/><property name="sugar" value="多糖"/><property name="size" value="超大杯"/></bean>
</beans>

测试类

public class TestSpring {@Testpublic void test() {//1、使用ApplicationContext类读取xml配置文件生成bean工厂(bean工厂为了控制反转时获取对象用)ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});//2、实例化bean(这里实例化的bean是从bean工厂里面获取的,与传统自己new一个对象的方式不同,实现控制反转)Source source = (Source) context.getBean("source");System.out.println(source.getFruit());System.out.println(source.getSugar());System.out.println(source.getSize());}
}

二、DI(依赖注入)

定义:指 Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设置给该对象。

实现原理:

① 读取标注或者配置文件,看看JuiceMaker依赖的是哪个Source,拿到类名

② 使用反射的API,基于类名实例化对应的对象实例

③ 将对象实例,通过构造函数或者 setter,传递给 JuiceMaker

代码示例:(这里使用的是Spring4.3.0版本的jar包)

pojo

/*** 果汁制造者对象*/
public class JuiceMaker {// 依赖了一个 Source 对象private Source source;/* setter and getter */public String makeJuice() {String juice = "xxx用户点了一杯" + source.getFruit() + source.getSugar() + source.getSize();return juice;}public Source getSource() {return source;}public void setSource(Source source) {this.source = source;}
}

Spring配置文件

<?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"><!--配置一个名叫source的bean--><bean name="source" class="pojo.Source"><property name="fruit" value="橙子"/><property name="sugar" value="多糖"/><property name="size" value="超大杯"/></bean><!--配置一个名叫juickMaker的bean,把上面配置的名为source的bean通过ref属性注入到这个bean内--><bean name="juiceMaker" class="pojo.JuiceMaker"><property name="source" ref="source" /></bean>
</beans>

测试类

public class TestSpring {@Testpublic void test() {//1、使用ApplicationContext类读取xml配置文件生成bean工厂(bean工厂为了控制反转时获取对象用)ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});//2、实例化bean(这里实例化的bean是从bean工厂里面获取的,与传统自己new一个对象的方式不同,实现控制反转)Source source = (Source) context.getBean("source");System.out.println(source.getFruit());System.out.println(source.getSugar());System.out.println(source.getSize());//3、实例化一个名叫juiceMaker的bean,此bean内注入上面的sourceJuiceMaker juiceMaker = (JuiceMaker) context.getBean("juiceMaker");System.out.println(juiceMaker.makeJuice());}
}

PS:第2部分的代码不写也能实现bean的注入,因为在XML中已经进行了bean的配置并通过ref属性将source注入到juiceMaker中去了。

转载于:https://www.cnblogs.com/riches/p/11491874.html

Spring学习(二)Spring IoC 和 DI 简介相关推荐

  1. Spring(二)IOC容器的初始化流程

    文章目录 一.Spring 核心容器类 1.1 BeanFactory 1.2 ApplicationContext 1.3 BeanDefinition 二.IOC容器的初始化 2.1 基于Xml的 ...

  2. Spring(ioc和di)简介

    一.spring(春天) ----软件界的艺术品 官网 :https://spring.io 1.spring是一个开源框架 2.spring是分层的java EE.一站式轻量级框架. 分层的java ...

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

    最近刚买了一本介绍ssm框架的书,里面主要对Mybatis.spring.springmvc和redis做了很多的讲解,个人觉得虽然有的内容我看不懂,但是整体上还是不错的.最近正在学习中,一边学习一边 ...

  4. Spring学习:Spring的IOC注解

    文章目录 一.简介 二.IOC注解 (一)常用的注解 (二)扫描包 (三)数据装配 三.生命周期 四.Bean实例化的时机 五.Bean在IOC容器中单例和多例 六.SpringIOC注解完整示例代码 ...

  5. Spring【二】IoC容器

    目录 一.组件.框架.容器 1.组件 2.框架 3.容器 二.JavaBean.POJO和EJB 1.JavaBean对象 2.POJO(简单Java对象) 3.EJB(企业级JavaBean) 三. ...

  6. 【Spring学习】Spring简介

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. 一.Spri ...

  7. Spring总结四:IOC和DI 注解方式

    首先我们要了解注解和xml配置的区别: 作用一样,但是注解写在Bean的上方来代替我们之前在xml文件中所做的bean配置,也就是说我们使用了注解的方式,就不用再xml里面进行配置了,相对来说注解方式 ...

  8. Spring核心思想,IoC与DI详解(如果还不明白,放弃java吧)

    1.IoC是什么?IoC(Inversion of Control)控制反转,IoC是一种新的Java编程模式,目前很多轻量级容器都在广泛使用的模式.2.IoC解决了什么问题?在IoC出现以前,组件之 ...

  9. Spring框架02(IOC和DI)

    目录 spring中的IOC和DI 1. BeanFactory 容器 2. ApplicationContext 容器 1)ClassPathXmlApplicationContext 2)File ...

最新文章

  1. AndroidStudio中提示:Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:
  2. Qt模型、视图解读之视图
  3. python包标准类型和动态导入模块和多态和反射和授权
  4. 华硕win10键盘失灵_Win10 进阶用法汇总
  5. linux服务器视频转换,将动画gif转换为linux服务器上的视频,同时保留帧速率
  6. 15.卷2(进程间通信)---门
  7. 聚类分析的Matlab 程序—系统聚类(附有案例分析)
  8. 【毕业设计】单片机智能快递柜系统 - stm32 嵌入式 物联网
  9. sublime主题配色
  10. 【华为机试真题 Python实现】黑板上的数字涂颜色【2022 Q1 Q2 |100分】
  11. es集群状态yellow排查
  12. 机器视觉与钢铁产业条形码追溯
  13. 罗马数字和阿拉伯数字互转(源码)
  14. 电脑开机按F1的解决方法
  15. Mysql information_schema库
  16. 机器人导航(仿真)(三)——路径规划(更新中)
  17. 计算机cpu的字母,电脑处理器后面的字母你认识几个?不认识跟我来学学(intel篇)...
  18. 初学者学习深度学习,不得不会的Google Colab基本操作
  19. 搜狗输入法 状态栏 自带的好用工具
  20. iPhone设置整点报时提醒

热门文章

  1. nginx 和php连接数,nginx限制ip连接数和带宽
  2. arcgis怎么用python重新排序,使用ArcGIS脚本工具将点数据进行排序并编号
  3. LC.exe”已退出,代码为 -1
  4. Logrotate 对服务器日志按照小时切割并压缩
  5. tensorflow 之 tf.tile()函数
  6. TypeError系列之:TypeError: conv2d(): argument 'input' (position 1) must be Tensor, not NoneType
  7. 很多人都不知道学了c/c++到底能做什么?让大牛来告诉你............
  8. 清理cin输入缓冲区_输入缓冲区究竟有啥秘密?
  9. I/O复用函数的使用——select
  10. Android虚拟机-Dalvik VM架构