目录
IoC控制反转
现实案例
特点
目的
DI依赖注入
小总结
介绍Spring
狭义和广义上的Spring
传统编码方式的不足
需求引入
弊端分析
IoC控制反转
现实案例
1、买水果问老板各种水果的口感而不是自己去挨个尝试一遍。
2、买房子找中介而不是自己去花时间找房东。
IoC控制反转的核心理念是:不是最终的消费者去负责创建对象,而是引入一个中间人角色,由这个中间人统一负责对象的创建过程。
特点
1、是一种设计理念,是程序设计遵循的标准。
2、代理人创建管理对象,消费者通过代理人获取对象。
3、降低对象之间的直接耦合,将消费者和对象解耦。
目的
加入IoC容器将对象统一管理,让对象关联变为弱耦合。
在这里果商就相当于IoC容器。
DI依赖注入
1、是具体技术实现。
2、在Java中底层通过反射技术实现对象注入。
下文有进一步关于DI的解释。
小总结
1、反转:从对象的使用方去创建对象变成了由IoC容器去创建对象。
2、IoC的好处:
1)没有代理人之前,使用方需要了解所有对象的内容后,才能知道我们需要的是哪个对象,这种情况下使用方和对象是硬性关联,程序难以维护和扩展。
2)引入代理人之后,使用方不用去了解所有的对象,直接和IoC容器打交道就行了。使用方和对象之间,通过IoC容器这个代理人,实现了解耦,对象之间更加灵活,方便扩展和维护。
介绍Spring
狭义和广义上的Spring
(1)狭义的Spring框架:通过一种高度的封装和抽象的Java技术,来简化程序的开发,Spring框架提供了IoC容器,来管理系统中的对象及其依赖。
(2)广义的Spring:最原始的Spring是只有一个IoC容器的Spring Framework,对对象集中管理,在此基础上,Spring不断发展,派生了大量的工程和完善的生态体系,由此形成了广义上的Spring。
1、这个IoC容器是一个抽象的,其就相当于在Java的运行内存中,开辟了一块空间,这个空间是由Spring管理的。
2、所有的对象,不是由使用者或者A对象来创建的,都是由Spring IoC容器统一负责创建。
3、当IoC容器,把对象都创建好了之后,由于A对象是依赖于B对象实现全部功能的,但我们不在A对象中去new一个B对象,而是基于反射技术,将A对象的依赖(即B对象)注入到A对象中,这就是所谓的依赖注入(DI)。
传统编码方式的不足
需求引入
由一个变成需求引入为何需要Spring:
通过创建maven项目写下以下三个类:
package com.spring.ioc.entity;public class Apple {private String title;private String color;private String origin;//生成默认的构造方法public Apple() {}//方便对象实例化public Apple(String title, String color, String origin) {this.title = title;this.color = color;this.origin = origin;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public String getOrigin() {return origin;}public void setOrigin(String origin) {this.origin = origin;}
}
package com.spring.ioc.entity;public class Child {private String name;private Apple apple;public Child(){}public Child(String name, Apple apple) {this.name = name;this.apple = apple;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Apple getApple() {return apple;}public void setApple(Apple apple) {this.apple = apple;}public void eat(){System.out.println(name + "吃到了" + apple.getOrigin() + "种植的" + apple.getTitle());}
}
import com.spring.ioc.entity.Apple;
import com.spring.ioc.entity.Child;public class Application {public static void main(String[]args){Apple apple1 = new Apple("红富士", "红色", "欧洲");Apple apple2 = new Apple("青苹果", "绿色", "中亚");Apple apple3 = new Apple("金帅", "黄色", "中国");Child lily = new Child("莉莉", apple1);Child andy = new Child("安迪", apple2);Child luna = new Child("卢娜", apple3);lily.eat();andy.eat();luna.eat();}}
运行结果展示:
弊端分析
1、字符串等文本信息是写死的。
2、对象是写死的,在编译时就已经确定了。
3、对象之间是硬关联。
传统编码方式很不利于程序的可维护性和扩展性,因为苹果根据季节不同信息会发生变化,孩子的口味和想吃的苹果会发生变化,或者我们想引入一个新的对象都需要对源码进行修改和审批,费时费力,此时Spring应运而生。
Spring最根本的目的就是通过配置的方式,完成对象的实例化,和对象与对象之间的依赖关系,目的都是为了提高程序的可维护性和可扩展性。