SptingBoot_3-IOC

Spring IOC

在这篇文章中,我将介绍IOC的详细功能与具体运用

前言:在Spring中存在非常重要的两大特性:IOC(控制反转)与Aop,这两个核心使Spring在开发框架中大放异彩,本节将详细说明IOC;IOC主要为控制反转与依赖注入,在初学时面对这些概念可能会使你无法理解其主要作用,下文我尽量使用通俗易解的说明使你了解IOC的强大功能

具体实现

先知道ioc是怎么实现的会时理解其功能更加透彻

spring中存在一个bean容器,你可以通过特殊方法来将你所写的类放入容器中,在spring项目启动时,会将其容器中的bean全都实例化;当你需要使用它时,通过特殊方法将其从容器中取出来即可,由于取出来的bean已经实例化为对象了,所以不需要额外new出对象

//担心一些基础较差的朋友看不动,做一点知识讲解
String user;//这是一个变量,而不是一个对象,此变量还未初始化,不可使用
new String();//这是一个实例化对象,你可以使用他的方法
//实例化了一个字符串对象并且统计了他的长度
System.out.println(new String("hello").length());
//为了希望构建的字符串对象多次被使用,可以将对象存储在变量中,操作变量就是来操作对应变量
user = new String("hello");
/*
* 结论:变量不是对象,变量只是为了方便操作对象来虚拟出的东西*/

Spring提供了四种方式来实现ioc:

  • 注解
  • XML
  • JavaConfig
  • 基于Groovy DSL配置

我们主要学习使用注解实现

将类放入容器:在类上使用@Component注解表明

取出实例注入对应变量:在变量声明使用@Autuwired/@Resource

演示:实现游戏中的吃饭功能

//新建接口,里面实现关于吃饭的功能
public interface Eat {
    int eat();
}
//实现接口
@Component//将其交给容器管理
public class BigEat implements Eat{
    @Override
    public int eat() {
        System.out.println("大口吃饭,回复100血");
        return 100;
    }
}
@RestController
public class As {
    @Autowired//注入
    private Eat a;
    @GetMapping("/eat")
    public void Eat(){
        a.eat();
    }
}

运行Spring项目,打开对应网址,控制台会输出大口吃饭,回复100血

详细介绍:

为什么会有IOC的出现:为了方便项目的维护,项目的维护主要为:出了问题需要找那块代码有问题/在原有基础上加入新功能/修改功能

IOC主要做的事情:管理对象与注入对象(类似与new一个对象),解决了对象管理与对象依赖的问题,原先我们的对象是new出来的,而使用Spring则是将他叫给了所谓的__IOC容器__来管理

而在此许多初学者可能会疑惑,什么是注入对象,我直接new出一个对象不好吗;这样想是正常的;当你真正去实现一个项目和后续维护才会了解其真正的内涵;若想死磕此概念,可以从项目的安全性,可靠性,稳定性以及灵活性考虑;

初步理解:IOC被称为控制反转,其中控制的意思为:控制对象创建的过程,反转的意思为:将创建对象的主体由程序员转化为容器(spring),我们只需要在外部定义bean的创建过程,真正的创建由容器来负责;

安全性:在spring工程被启动时,容器就会被初始,容器中的bean就会被实例化为对象->new出来的对象为运行期被创建出来;在此基础上思考,你写了个项目,并未使用ioc技术,而是层层new出对象,大功告成时,所有功能运行流畅,你觉得自己简直是程序界的天才,什么ioc,我只需轻轻new出一个对象便可无敌于世间;几天后,你突发奇想,想将一个功能再进化一下,你修改了一个接口和对应的几个实现,测试完新功能,你连忙推出新版本,但是天有不测风云,有一个类和其他接口实现类冲突了,你只顾着测试新功能,没有发现这个异常,而在用户使用时,程序异常,所有用户全部闪退,你的软件从好评如潮变成了评分低于三国杀,一代天才就此陨落,当你重新学习spring时,你震惊的发现,因为使用了ioc,bean在启动时就已经全部实例化为对象了,有什么接口冲突在启动时就会报异常,而不是在运行某个具体功能是才会爆出异常,项目安全性大大提高呀,维护起来更为容易

可靠性:如果将创建对象的过程交给程序员,每次一个对象就去new一个对象,当项目工程量较大时,每一个类的实例化对象被创建成千上百次,你的内存对象会饱满,项目可能就死机,而交给容器时,容器中对象的创建都是在启动前完成,而且都是单例的状态,谁需要就去拿出这个使用,死机概率大大降低,项目的可靠性也大大提高

解耦:设计原则上来说就是依赖倒置原则-高层模块不直接依赖于低层模块,而是要依赖于抽象(类似于接口),底层模块就是要实现抽象

举个例子:你需要实现一个购物功能

错误示范:新建一个购物类,书写购物结算方法

正确示范:新建一个购物接口,建立结算方法,再新建一个类实现此接口完成结算方法,当后续出现打折活动时,再新建一个实现类,实现结算方法(打折后),对应引用相关接口的只需再注入时修改注入的对象即可,调用结算方法的功能模块完全不由修改.这就是面向接口编程;

总结

对于ioc,初学者完全可以先掌握其实现方法,对其作用有大概了解,当有了项目经验积累,再来看ioc的概念就会更加透彻

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值