前言
路遥说,在一个平凡的世界里,人要承受一定的痛苦和不安。但只要相信个体奋斗的力量,坚定地与生存搏斗,就能过上想要的生活。
很喜欢《平凡的世界》的一句话,一直不断的鼓励我努力向前,也送个各位看到这个写的很烂的文章的人,共勉~
二、IOC容器
2.1 什么是IOC
IOC就是控制反转啊!
what你说啥?
2.1.1 控制反转是什么意思?
假如有a和b两个对象,在没有引入IOC概念之前,a依赖于b那么a在需要用到b的时候,就必须自己主动去创建对象b或者使用已经创建的对象b,这个过程控制权都在对象a上。
而引入IOC概念之后,对象a与对象b之间失去了直接联系,当对象a需要用到对象b的时候,IOC容器会主动创建一个对象注入到对象a需要的地方。这好像是一个中介一样,你原来想在某个地方找个房子住,你需要自己找房东,但是现在有了中介(IOC),它能帮你完成你想找的房子
对比两个过程,第一个过程对象a获得依赖对象b的过程由自己创建调用,第二个过程变成了IOC给你创建调用。控制权由主动变成了被动
Fine,这就是控制反转,由主动变被动了~
2.1.2 什么是DI
DI就是是依赖注入(Dependency Injection)英语单词的首字母的缩写
所谓依赖注入,即在运行期由容器将依赖关系注入到组件之中
讲的通俗点,就是在运行期,由Spring根据配置文件,将其他对象的引用通过组件提供的setter方法进行设定
它通过动态调用的方式避免了硬编码方式的约束
动态调用什么意思,我在编译阶段没有确定要创建那个对象(编译阶段就是你写完java源代码之后经过编译期编译为.class字节码文件的阶段)然后呢,我想到运行阶段根据我的配置文件创建对象(运行阶段就是将字节码文件加载到内存的阶段)这叫动态
然后能注入的数据类型有三类
基本类型和String 其他bean类型(在配置文件中或者注解配置过的bean) 复杂类型/集合类型
2.1.3 动态性
回顾下反射的概念(主要体会动态性!)
比如有很多个球员的实例:乔丹、詹姆斯、科比,现在需要一个方法根据一个参数获得其中一个球员
不使用反射的写法:
public Person getPerson(String name) { if(name.equals("乔丹") { return new 乔丹(); } if(name.equals("詹姆斯") { return new 詹姆斯(); } ..... 如果要获得的球员很多的话要加很多的if判断,代码属实是很垃圾 使用反射的写法: arduino 复制代码 public Person getPerson(String name) { Constructor cos = clazz.getConstructor(Class.forName(name));//根据类名获得对应构造方法 Object obj = cos.newInstance(); return (Person) obj; }
这样就很明显了~
球员的实例有多少,这个方法都不用变代码量就这么多
反射能动态生成实例的意思是,在程序运行的时候,可以根据需要和条件创建新的实例
先理解到这,后面理解的在深刻的话在写!
2.1.4 IOC能带给我们什么?
IOC 的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理。
第一,资源集中管理,实现资源的可配置和易管理
第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度
其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。IoC很好的体现了面向对象设计法则之一好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找
2.2 IOC底层原理
xml解析、工厂模式,反射
原始方式,在UserService类的execute方法中想调用UserDao类中的add方法,那么我们就需要先生成UserDao的对象,之后在调用UserDao中的方法
用工厂模式呢?
在它们中间再搞个类(工厂类)生成UserDao类
工厂类来实现创建对象,在UserService类中通过创建工厂类来调用add方法
相当于搞了个代理...降低了耦合度多个了个中奸商
先通过 XML 解析来加载 spring.xml 配置文件,然后使用反射机制调用无参构造函数动态创建对象,并调用 setter 方法完成对象属性的赋值,最后将创建好的对象放在一个类似于 HashMap 的容器里,调用 getBean 方法获取对象时,相当于 map.get(id) 返回一个对象。
2.3 IOC接口(BeanFactory)
ioc思想基于IOC容器完成,ioc容器底层就是对象工厂。
Spring提供了IOC容器实现的两种方式:两个接口
- BeanFactory:IOC容器基本实现,是spring内部使用接口,不提供开发人员使用。加载配置文件时不会创建对象,使用对象时才会创建对象(懒汉式加载对象)。
- ApplicationContext:BeanFatory的子接口,提供更多更强大的功能,一般供开发人员进行使用。加载配置文件时就创建对象(饥汉式加载对象)。
ApplicationContext接口实现类
- FileSystemXmlApplicationContext(“盘符路径(绝对路径)“)
- ClassPathXmlApplicationContext(“src目录下类路径”)