IoC与Spring

目录

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

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值