本文借鉴: Spring 学习 https://www.cnblogs.com/wmyskxz/p/8820371.html (特此感谢!)
一, 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 {
- @Test
- public 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 创建对象的过程中, 将对象依赖属性 (简单值, 集合, 对象) 通过配置设值给该对象.
实现原理:
1读取标注或者配置文件, 看看 JuiceMaker 依赖的是哪个 Source, 拿到类名
2使用反射的 API, 基于类名实例化对应的对象实例
3将对象实例, 通过构造函数或者 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 {
- @Test
- public void test() {
- //1, 使用 ApplicationContext 类读取 xml 配置文件生成 bean 工厂(bean 工厂为了控制反转时获取对象用)
- ApplicationContext context = new ClassPathXmlApplicationContext(
- new String[]{
来源: http://www.bubuko.com/infodetail-3190041.html