Spring(一则故事搞懂什么是IOC

一、IOC思想(控制反转)

在正式学习ioc之前,我们先讲一个故事。

有一天,早上起来后的小白同学感觉头晕晕的好似发烧了,于是他来到药店准备找医生开点药吃吃,可当他到药店后,却发现医生都不见了。无奈之下小白同学只好自己去药房的找点药吃,可是小白只是一个苦逼的程序猿,哪里知道自己该吃什么药呢,于是他拿起手机一顿搜索,这时他看到了一篇推文:《震惊!x某误食x药导致x痿》,他开始害怕了,不敢自己胡乱拿药。他的头更痛了,他多想有个医生出来告诉他该吃什么药呀!

故事到这里结束了,现在我们用编程的思路描述一下这个故事 

小白想治好头疼:需求

药店里的各种药品:对象  

未曾出现的医生:管理药品(对象)的人:IOC容器 

当然,这里的各种药品彼此之前存在着某种联系和依赖(药不能乱吃哦~) 

我们想要实现的效果是:当一个需求产生后,我们可以不再关注对象是如何产生的,反转让IOC容器直接把我们所需要的对象生成出来给我们使用

对象不依赖于其它对象,不依赖于其它对象,这就达到了松耦合。 

高耦合:

                                    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaXZhbjgyMDgxOQ==,size_10,color_FFFFFF,t_70,g_se,x_16

解耦: 

                                 91b4c7ce1be947dda69f76b24be165e1.png

 控制:我们不在自己new出对象,而是将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制

反转:由容器来帮忙创建及注入依赖对象,由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转,依赖对象的获取被反转了

 

IOC思想总结:使用对象时,由主动new产生对象转换为“外部”提供对象,此过程中对象的创建权由程序内部转换到“外部”,这就是控制反转

Spring提供了这么个容器,称为IOC容器,用来充当IOC思想里的“外部”。IOC容器负责对象的创建、初始化等工作,被管理的对象统称为Bean

 

二、DI(依赖注入)

我认为,IOC和DI本质上是同一种东西,DI只是实现IOC思想的方式

在IOC容器中为Bean与Bean之间建立起依赖关系的整个过程,就是DI(依赖注入)

现在我们来实现一个DI的案例

在pom.xml导入spring依赖

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.9</version>
        </dependency>

 DAO:

public class BookDaoImpl implements BookDao {
    @Override
    public void save() {
        System.out.println("人家是Dao啦~~~~~~~~~");
    }
}

SERVICE:

public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();

    @Override
    public void save() {
        System.out.println("人家是Service啦~~~~~~~~~");
        bookDao.save();
    }
}

测试类:

public class testDemo {
    @Test
    public void test(){
        BookService bookService = new BookServiceImpl();
        bookService.save();
    }
}

测试结果:

5c6214cd95f045af8d9b77b37c8b78fc.png

 现在我们改用DI注入完成该操作

创建applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id = "fromBookDao" class="com.brrbaii.dao.daoImpl.BookDaoImpl" />

    <bean id = "bookService" class="com.brrbaii.service.serviceImpl.BookServiceImpl" >
        <!--
        name:具体要配置的一个属性
        ref:参照哪一个Bean
        这里表示的是:我们要配置bookService里创建的bookDao对象,
        而这个对象来自于Bean里的fromBookDao
        -->
        <property name="bookDao" ref="fromBookDao">
        </property>
    </bean>
</beans>

aa08d9400eae47c19a42cff1b8dc2388.png

 修改Service 

 b3b731b281424896b36349e6182a830b.png

 这里的setBookDao方法是由IOC容器自动调用的

 修改测试类

public class testDemo {
    @Test
    public void test(){
        //1,获取IOC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2,从容器中得到Bean
        //传入容器里的ID值,返回的是Objece属性我们转换一下
        BookService bookService = (BookService) ctx.getBean("bookService");
        //3,调用方法
        bookService.save();

    }
}

  查看结果

df2c5cd122584c9fb79699310fbd7ba9.png

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白日日白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值