目录
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最根本的目的就是通过配置的方式,完成对象的实例化,和对象与对象之间的依赖关系,目的都是为了提高程序的可维护性和可扩展性。