Universe Infinity inc.
什么是IOC容器,先把IOC给忽略到,其实就是个容器。
什么?容器又是个啥玩意?容器是用来放东西的东西啊。
各个领域都喜欢起一些专业术语,显得很高级。给你讲IOC是不是很高级,给你讲Map是不是就明白了。
bean对象最终存储在spring容器中,在spring源码底层就是一个map集合,存储bean的map在DefaultListableBeanFactory类中:
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
Spring容器加载到Bean类时 , 会把这个类的描述信息, 以包名加类名的方式存到beanDefinitionMap 中。
其中 String是Key , 默认是类名首字母小写 ;BeanDefinition , 存的是类的定义(描述信息) , 我们通常叫BeanDefinition接口为 : bean的定义对象。
在Spring的底层,其就是一个Map数据结构。这个Map被大家称为容器,其中存放的是一个个的对象。
那么IOC又是个啥玩意呢?别着急我们一步步来。
1、小明买苹果准备吃(但是牙口不好),小明买把刀切苹果。
- 苹果和刀都是给好的,没的说。
class Apple {
String desc = "苹果";
@Override
public String toString() {
return "Apple{desc='" + desc + "'}";
}
}
class Knife {
String desc = "水果刀";
void cut(Object object) {
System.out.println(this + "切:" + object);
}
public String toString() {
return "Knife{desc='" + desc + "'}";
}
}
- 小明要买水果刀吃苹果,这些都要自己去做(这个过程就
new
)
public class Main {
@Test
public void test1() {
Apple apple = new Apple(); //小明买苹果准备吃(但是牙口不好)
Knife knife = new Knife(); //小明买把刀
knife.cut(apple); //小明用刀切苹果
}
}
- 输出
Knife{desc='水果刀'}切:Apple{desc='苹果'}
2、小明要喝依云山雪水(脑袋进水了吧)。小明要先去买个瓶子,然后乘坐交通工具去依云山,小明在雪山下面等了好久,终于雪化了,灌了一瓶水,高高兴兴回来了。
- 杯子和水都是给定的,没的说
class Cup {
String desc = "杯子";
void load(Object object) {
System.out.println(this + "装:" + object);
}
public String toString() {
return "Cup{desc='" + desc + "'}";
}
}
class Water {
String desc = "依云水";
@Override
public String toString() {
return "Water{desc='" + desc + "'}";
}
}
- 小明自己去买杯子,还要坐交通工具去装水
public class Main {
@Test
public void test2() {
Cup cup = new Cup(); //小明要先去买个瓶子
Water water = new Water();//然后乘坐交通工具去依云山,小明在雪山下面等了好久,终于雪化了
cup.load(water); //灌了一瓶水,高高兴兴回来了
}
}
- 输出
Cup{desc='杯子'}装:Water{desc='依云水'}
3、小明吃完苹果,看到快过期的依云水,叹了一口气,用依云水冲洗了刀。
- 整体过程
@Test
public void test3() {
Cup cup = new Cup(); //小明要先去买个瓶子
Water water = new Water();//然后乘坐交通工具去依云山,小明在雪山下面等了好久,终于雪化了
cup.load(water); //灌了一瓶水,高高兴兴回来了
Apple apple = new Apple(); //小明买苹果准备吃(但是牙口不好)
Knife knife = new Knife(); //小明买把刀
knife.cut(apple); //小明用刀切苹果
wash(knife, water);//依云水冲洗刀
}
static void wash(Object target, Object source) {
System.out.println(source + "冲洗:" + target);
}
- 输出
Water{desc='依云水'}冲洗:Knife{desc='水果刀'}
4、来回跑来跑去,小明累坏了,小明找到了我们
我对小明说,我给你做个空间戒指
,把上面的刀、水果、瓶子、水
都存好,小明不用去买了(not new
),直接从空间戒指中取。
-
空间戒指
定义如下
class Beans {
private Map<String, Object> beanMap = new HashMap<String, Object>();
Beans() {
init();
}
Object getBean(String id) { //小明用这种办法获取对应物品
return this.beanMap.get(id);
}
Map<String, Object> init() { //我们把刀、水果、瓶子、水都放进空间戒指中
this.beanMap.put("apple", new Apple());
this.beanMap.put("knife", new Knife());
this.beanMap.put("water", new Water());
this.beanMap.put("cup", new Cup());
return this.beanMap;
}
}
- 小明要用戒指了。愉快的吃苹果,愉快的喝依云水。
有一点要明白。小明是知道
空间戒指
中有什么内容的,小明也知道空间戒指
中的内容可以用来做什么。
//我们把小明需要的东西都给准备好了,小明不用买这买那,跑来跑去了。
public class Main {
@Test
public void test4 {
Beans beans = new Beans();
Apple apple = (Apple) beans.getBean("apple");
Knife knife = (Knife) beans.getBean("knife");
knife.cut(apple);
Cup cup = (Cup) beans.getBean("cup");
Water water = (Water) beans.getBean("water");
cup.load(water);
}
}
小明终于不用跑来跑去了。
5、小明又过来了,说这个空间戒指不能放东西啊
ε=(´ο`*)))唉,小明是上帝,给他干
-
市面上的一辆车
//市面上的一辆车 class Car { String desc = "UUI Car"; public void driver() { System.out.println(desc + "发动了..."); } public String toString() { return "Car{desc='" + desc + "'}"; } }
-
给小明准备个记事本,小明要什么在其中写出来。id是小明定的名称,class是小明想要的哪家的车。
id="car",class="com...Car" //id是小明定的名称,class是小明想要的哪家的车
-
重新造一个空间戒指给小明
//我们把小明需要的东西都给准备好了,小明不用买这买那,跑来跑去了。 class Beans { private Map<String, Object> beanMap = new HashMap<String, Object>(); private Map listMap = new HashMap<String, String>(); Beans(String fileName) { //从记事本中取出id和class this.listMap.put("car", "com...Car"); init(); } Object getBean(String id){ return this.beanMap.get(id); } Map<String, Object> init() { this.listMap.forEach((k, v) -> { Object o = null; try { Class<?> aClass = Class.forName((String) v); o = aClass.getDeclaredConstructor().newInstance(); } catch (Exception e) { System.out.println("error!"); } this.beanMap.put((String) k, o); }); return this.beanMap; } }
-
小明可以开车啦文章来源:https://www.toymoban.com/news/detail-820954.html
public class Main { public static void main(String[] args) { Beans beans = new Beans("记事本"); Car car = (Car) beans.getBean("car"); System.out.println(car); car.driver(); //小明开车 } }
6、总结
回到开头,容器
是什么呢?就是我们的空间戒指
。那么IOC是什么呢?IOC说明白就是不用小明自己去买东西了,容器的东西也不是小明放,而是我们的空间戒指
自己去放(开玩笑吧,空间戒指自己去放?emmm先这样理解吧)。
留一个问题,小明不想写记事本
了。我们怎么做才能让小明要啥就能从空间戒指
中拿出来啥呢?文章来源地址https://www.toymoban.com/news/detail-820954.html
到了这里,关于Spring核心容器IOC案例讲解,带你理解IOC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!