Spring框架IOC解说

控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
好吧,那我们从简单的说起。直接讲概念有点抽象,让我们从一个实际的场景来分析这个事情。大毛想要找个女朋友,他的朋友二毛帮忙介绍了一个女生,叫翠花。然后大毛跟翠花认识了。相处了一段时间,因为翠花要大毛和他一起打王者荣耀,可是大毛只会打斗地主,所以分手了,为此大毛难过了好长一段时间。后来,大毛又去找二毛帮忙,希望重新找一个女朋友。大家看这个过程,其实很麻烦的,大毛如果通过熟人介绍的方式来找女朋友,必然是一个一个的接触,比如第一次他跟翠花相亲,第二次跟桂花相亲,第三次又跟西兰花相亲,每次都耗费大量的精力。

相亲吃饭得花钱吧,看电影得花钱吧,万一谈不来,分手还麻烦。这就是大毛跟他每一个女朋友的依赖性太强了。
现在,请大家进行一个想象,想象我们自己是天神,以我们自己的意志来给大毛安排一个女朋友。既然我们是天神,就可以给大毛编写一个人生的剧本。

之前大毛是通过二毛介绍,才认识了翠花,桂花,和西兰花。现在,我们通过代码的形式来重现一个这个过程。

剧本:
大毛:
package com.spring.bean;
public class DaMao {
private GirlFriend girlFriend;
public GirlFriend getGirlFriend() {
return girlFriend;
}
public void setGirlFriend(GirlFriend girlFriend) {
this.girlFriend = girlFriend;
}
}
女朋友作为一个超类:
package com.spring.bean; /**
* 女朋友
* @author Administrator
*/
public class GirlFriend {
private String hobby; public String getHobby() {
return hobby;
} public void setHobby(String hobby) {
this.hobby = hobby;
} }
翠花继承自GirlFriend :
package com.spring.bean;
public class CuiHua extends GirlFriend{
}
测试类:
package com.spring.test; import com.spring.bean.CuiHua;
import com.spring.bean.DaMao;
import com.spring.bean.GirlFriend; public class TestDaoMao { public static void main(String[] args) {
DaMao daMao = new DaMao(); GirlFriend cuihua = new CuiHua();
cuihua.setHobby("王者荣耀"); daMao.setGirlFriend(cuihua); //看一下大毛的女朋友喜欢做什么?
System.out.println(daMao.getGirlFriend().getHobby()); }
}
看完了这个例子,我们发现,虽然我们是天神,可是安排这样的剧本就要去不断地去new新的GirlFriend,这样是不是很麻烦?
实际我们天神的职责是掌管这个大毛的命运,在合适的时间,让大毛去谈一场恋爱就可以了,至于让谁充当大毛的女朋友,作为天神,我们不关心,对不对?
或者说,反正是我们决定,无所谓是谁。
所以,我们只需要安心编写大毛谈恋爱的剧本就行了,我们只需要知道大毛有一个女朋友就OK了,到底是谁,以后再说。因为,我们是在大毛出生之前就给他安排了剧本。那是不是我们永远都不给大毛指定一个女朋友呢?当然也不是,我们天神一般喜欢把那些可能会改变的东西写在 “神圣的草稿纸” 上,这个草稿纸就是XML文件。
接下来,让我们引入Spring的集成环境,来模拟这个事情!
首先,引入Spring需要的jar包。

第二步,写配置文件。

<?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 id="DaMao" class="com.spring.bean.DaMao">
<property name="girlFriend" ref="CuiHua"></property> </bean> <bean id="CuiHua" class="com.spring.bean.CuiHua">
<property name="hobby" value="王者荣耀"></property>
</bean> </beans>
然后,剧本就变成了这样:
package com.spring.test; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.spring.bean.DaMao; public class TestDaoMao2 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("GirlFriends.xml");
DaMao daMao = (DaMao)context.getBean("DaMao"); //看一下大毛的女朋友喜欢做什么?
System.out.println(daMao.getGirlFriend().getHobby()); }
}
运行效果:

这样的好处显而易见,我们不需要在剧本(Java代码)里面指定谁是大毛的女朋友了,这些事情我们都写在“神圣的草稿纸”上。牛逼了我的哥。IOC的原理就是在不改变剧本的情况下,由作为“天神”的你来指定谁来出演,体现在一个XML文件上。而且这些配置都是可以更改的。剧本就是Java代码,能不改就不改。

作业:
新建一个Java项目SpringTest01 ,创建包 com.spring.bean。
需要创建的Java类:
Hero .java
属性:
Private String heroName;
Priate String type;
Private String description;
生成对应的get、set方法,再跟据你的喜好重写toString方法。
新建一个源文件夹etc,专门用于存放配置文件。编写英雄池的xml文件——heroPool.xml。
在配置中加入一个英雄的具体信息:鲁班七号、 射手、 嘻嘻,成功检测到对面的智商,看来我无法发挥全部实力了。
创建包com.spring.test,新建测试类TestHero,读取heroPool.xml,然后打印出鲁班七号的具体信息。
转:https://www.cnblogs.com/skyblue-li/p/7872783.html
Spring框架IOC解说的更多相关文章
- Spring框架IOC容器和AOP解析 非常 有用
Spring框架IOC容器和AOP解析 主要分析点: 一.Spring开源框架的简介 二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面 ...
- 自己动手写Spring框架--IOC、MVC
对于一名Java开发人员,我相信没有人不知道 Spring 框架,而且也能够轻松就说出 Spring 的特性-- IOC.MVC.AOP.ORM(batis). 下面我想简单介绍一下我写的轻量级的 S ...
- 【Java框架型项目从入门到装逼】第一节 - Spring框架 IOC的丧心病狂解说
大家好,好久不见,今天我们来一起学习一下关于Spring框架的IOC技术. 控制反转--Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的 ...
- Spring框架IOC容器和AOP解析
主要分析点: 一.Spring开源框架的简介 二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置 一.S ...
- spring框架--IOC容器,依赖注入
思考: 1. 对象创建创建能否写死? 2. 对象创建细节 对象数量 action 多个 [维护成员变量] service 一个 [不需要维护公共变量] dao 一个 [不需要维护 ...
- Spring框架---IOC装配Bean
IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicat ...
- Spring框架IOC,DI概念理解
1.什么是框架? 框架是一种重复使用的解决方案,针对某个软件开发的问题提出的. Spring框架,它是一个大型的包含很多重复使用的某个领域的解决方案. Spring的理念:不要重复发明轮子. 2.Sp ...
- Spring框架-IOC和AOP简单总结
参考博客: https://blog.csdn.net/qq_22583741/article/details/79589910 1.Spring框架是什么,为什么,怎么用 1.1 Spring框架是 ...
- Spring框架 IOC注解
Spring框架的IOC之注解方式的快速入门 1. 步骤一:导入注解开发所有需要的jar包 * 引入IOC容器必须的6个jar包 * 多引入一个:Spring ...
随机推荐
- SQL Server系统函数:日期函数
原文:SQL Server系统函数:日期函数 1.返回当前日期和时间 select GETDATE() '当前日期-精确到33毫秒' select GETUTCDATE() 'UTC日期和时间-精确到 ...
- Mysql对查询结果添加序列号
; as rownum,* from table1 :=和=的区别? "=",只有在set和update时才和:=一样,赋值的作用,其它都是等于的作用.鉴于此,用变量实现行号时,必 ...
- python 切换虚拟环境
每次电脑重启后,都要切入虚拟环境,命令总是忘记.如果使用IDE,可以指定interpeter方便的切换. 首先conda info --env 查看当前有几个环境 激活/禁用环境 source ac ...
- windows环境安装haproxy及初步配置负载均衡使用示例
安装HaProxy 首先需要下载windows环境下需要文件,这里下载的是一个别人编译好的一个文件,这里省去了编译的过程,使用的版本是haproxy-1.7.8. 下载后直接解压到对应的目录下.示例( ...
- python自定义小工具:密码匿名化、毫秒时间显示、人类易读字节
import base64 import time def timestamp2datems(timestamp): ''' 时间戳转为日期字串,精确到ms.单位s :param timestamp: ...
- Java程序猿跳槽应该学哪些方面的技术
互联网产品.大型企业级项目常会用到的: 并发处理技术 具体到Java上通常是涉及java.util.concurrent.并发锁机制.NIO等方面,当然最近比较火爆的Netty框架也可以作为高并发处理 ...
- IPC——管道
概述 管道通信分为无名管道.有名管道 管道通信的本质 不管是有名管道,还是无名管道,它们的本质其实都是一样的,它们都是内核所开辟的一段缓存空间.进程间通过管道通信时,本质上就是通过共享操作这段缓存来实 ...
- ORACLE归档日志满了之后,如何删除归档日志
当ORACLE归档日志满后如何正确删除归档日志 版权声明:本文为博主原创文章,未经博主允许不得转载. 当ORACLE 归档日志满了后,将无法正常登入ORACLE,需要删除一部分归档日志才能正常登入OR ...
- 【已解决】如图,说我磁盘不够,看到var目录下有的个隐藏文件夹占了46G,不知道怎么删除
后来发现不是隐藏目录,是其中的log目录,然后一步一步往下,找到jenkins.log文件,已经有40+G的log了.
- Anton and Chess(模拟+思维)
http://codeforces.com/group/1EzrFFyOc0/contest/734/problem/D 题意:就是给你一个很大的棋盘,给你一个白棋的位置还有n个黑棋的位置,问你黑棋能 ...