Spring学习(二)Spring IoC 和 DI 简介
本文借鉴: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 简介相关推荐
- Spring(二)IOC容器的初始化流程
文章目录 一.Spring 核心容器类 1.1 BeanFactory 1.2 ApplicationContext 1.3 BeanDefinition 二.IOC容器的初始化 2.1 基于Xml的 ...
- Spring(ioc和di)简介
一.spring(春天) ----软件界的艺术品 官网 :https://spring.io 1.spring是一个开源框架 2.spring是分层的java EE.一站式轻量级框架. 分层的java ...
- Spring学习-理解IOC和依赖注入
最近刚买了一本介绍ssm框架的书,里面主要对Mybatis.spring.springmvc和redis做了很多的讲解,个人觉得虽然有的内容我看不懂,但是整体上还是不错的.最近正在学习中,一边学习一边 ...
- Spring学习:Spring的IOC注解
文章目录 一.简介 二.IOC注解 (一)常用的注解 (二)扫描包 (三)数据装配 三.生命周期 四.Bean实例化的时机 五.Bean在IOC容器中单例和多例 六.SpringIOC注解完整示例代码 ...
- Spring【二】IoC容器
目录 一.组件.框架.容器 1.组件 2.框架 3.容器 二.JavaBean.POJO和EJB 1.JavaBean对象 2.POJO(简单Java对象) 3.EJB(企业级JavaBean) 三. ...
- 【Spring学习】Spring简介
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. 一.Spri ...
- Spring总结四:IOC和DI 注解方式
首先我们要了解注解和xml配置的区别: 作用一样,但是注解写在Bean的上方来代替我们之前在xml文件中所做的bean配置,也就是说我们使用了注解的方式,就不用再xml里面进行配置了,相对来说注解方式 ...
- Spring核心思想,IoC与DI详解(如果还不明白,放弃java吧)
1.IoC是什么?IoC(Inversion of Control)控制反转,IoC是一种新的Java编程模式,目前很多轻量级容器都在广泛使用的模式.2.IoC解决了什么问题?在IoC出现以前,组件之 ...
- Spring框架02(IOC和DI)
目录 spring中的IOC和DI 1. BeanFactory 容器 2. ApplicationContext 容器 1)ClassPathXmlApplicationContext 2)File ...
最新文章
- AndroidStudio中提示:Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:
- Qt模型、视图解读之视图
- python包标准类型和动态导入模块和多态和反射和授权
- 华硕win10键盘失灵_Win10 进阶用法汇总
- linux服务器视频转换,将动画gif转换为linux服务器上的视频,同时保留帧速率
- 15.卷2(进程间通信)---门
- 聚类分析的Matlab 程序—系统聚类(附有案例分析)
- 【毕业设计】单片机智能快递柜系统 - stm32 嵌入式 物联网
- sublime主题配色
- 【华为机试真题 Python实现】黑板上的数字涂颜色【2022 Q1 Q2 |100分】
- es集群状态yellow排查
- 机器视觉与钢铁产业条形码追溯
- 罗马数字和阿拉伯数字互转(源码)
- 电脑开机按F1的解决方法
- Mysql information_schema库
- 机器人导航(仿真)(三)——路径规划(更新中)
- 计算机cpu的字母,电脑处理器后面的字母你认识几个?不认识跟我来学学(intel篇)...
- 初学者学习深度学习,不得不会的Google Colab基本操作
- 搜狗输入法 状态栏 自带的好用工具
- iPhone设置整点报时提醒
热门文章
- nginx 和php连接数,nginx限制ip连接数和带宽
- arcgis怎么用python重新排序,使用ArcGIS脚本工具将点数据进行排序并编号
- LC.exe”已退出,代码为 -1
- Logrotate 对服务器日志按照小时切割并压缩
- tensorflow 之 tf.tile()函数
- TypeError系列之:TypeError: conv2d(): argument 'input' (position 1) must be Tensor, not NoneType
- 很多人都不知道学了c/c++到底能做什么?让大牛来告诉你............
- 清理cin输入缓冲区_输入缓冲区究竟有啥秘密?
- I/O复用函数的使用——select
- Android虚拟机-Dalvik VM架构