Sping的控制反转(IOC)和依赖注入(DI)代码详解;控制反转(IOC)和依赖注入(DI)如何实现解耦?

Sping的控制反转(IOC)和依赖注入(DI)代码详解:
  • IOC只原来是自己new对象,现在new对象这个过程交给了中介Spring来做,我们想用这个对象时,只需

  • 在这里插入图片描述

  • 这样来创建一个引用,指向XinxiPublishService对象,而Spring将对象注入到你引用的地方的过程就叫依赖注入。

  • 依赖注入:通过相关的容器控制程序来将XinxiPublishService对象在外部new出来并注入到引用这个类的类的引用xinxiPublishService中。

控制反转(IOC)和依赖注入(DI)如何实现解耦?
  • 另外,关于ioc解耦,可以这么理解,假如类gaifang功能是盖房子,直接new一个砍木头类的对象,这时砍木头这个对象是属于gaifang这个类创建并管理的,new完就相当于gaifang这个类拥有了砍木头对象的所有变量方法,也需要空间去存储这些变量方法,相当于我自己必须学习砍木头这个本领,使用new的方式相当于把所有的本领和材料自己学会运来,而使用ioc,好处在于gaifang这个类不需要创建并管理砍木头等对象,只需要跟spring说,我需要砍木头这个功能,写个注解spring就把这个砍木头工人给你派过来了,不需要gaifang这个类存储砍木头对象的变量方法,因为这些事spring都帮你做了,gaifang类和砍木头类没有直接关系了,由spring帮你维护,这就叫解耦。

  • 为什么用控制反转,IOC,多个地方调用同一个类的实例化对象时,如果不用控制反转,调用一次就得new一个对象出来,会产生多个对象,占用内存,使用控制反转,spring会帮你创建一个对象,需要时通过注解去拿到已经帮你创建好的对象就行,多个地方使用用的都是spring已经创建好的对象。即用来用去都是这一个对象。

  • 另外,为什么使用这种方式,在编译时就能报错,避免运行时报错呢?假如在一个类classabc中使用person类,加inject注解,调用person的方法,假如删除了person或改名成person1,那么编译时spring就会报错,如果不用ioc,那么,只有运行这个classabc类时,才会报错,就晚了。

  • @Inject
    private XinxiPublishService xinxiPublishService;
    这个代码的功能是创建一个指向spring帮我们创建好的XinxiPublishService 对象的引用,在另外的类中再写一个
    @Inject
    private XinxiPublishService xinxiPublishService;
    就又创建了一个指向XinxiPublishService 对象的引用,他们的地址相同,说明这就是同一个引用,在不同类中的是同一个引用
    ----------------- cn.com.xxx.xinxi.service.impl.XinxiPublishServiceImpl@9b75f1b -----------------
    ========== cn.com.xxx.xinxi.service.impl.XinxiPublishServiceImpl@9b75f1b ==========

  • 总之,解耦是一种思想,而不是具体的两个不同功能的代码相互隔离,没有关系。
    不使用控制反转(IOC)时,在类A中,new一个类B的对象,类B修改,类A也要修改。
    使用控制反转(IOC)时,类B修改,类A依然要修改,解耦只是一种思想,不要理解为解耦就是代码不用修改。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值