Spring基础:入门理解IOC

问题:什么是IOC?

IOC:控制反转

  • 控制:控制对象的创建及销毁(生命周期)
  • 反转:将对象的控制权交给IOC容器。

技术描述:

  • 简单来说,在类A中需要依赖类B,传统的操作就是在类A中创建出类B,而IOC就是将类B在外部创建,从类A的构造函数中传入。而管理着这个类B的生命周期的类就是IOC容器。

问题:什么是依赖注入?

IOC的实现方式有两种

  • 依赖注入
    • 需要注入的类被动的接收对象,通过类型或名称来判断将不同的对象注入到不同的属性中。
  • 依赖查找
    • 主动索取相应类型的对象,获得依赖对象的时间也可以在代码中自由控制。

问题:为什么需要IOC?

  • IOC其实是面向对象编程(OOP)中的一种设计原则,让我们更容易从现实的角度理解程序。
  • 它主要的目的是用来减低计算机代码之间的耦合度。
  • 例子:有两个对象,一个是我,一个是杯子,我需要用杯子完成喝水的动作。
    • 传统的模式:需要在我喝水这个动作上创建出杯子,然后利用杯子去喝水。这不符合现实,我不会创造一个杯子,然后才去用杯子喝水。
    • IOC模式:从外部传入了一个杯子给我(比如我买了),我拥有了一个杯子(属性),然后我用这个杯子去完成喝水。这种情况更符合现实。

问题:IOC的约定规则是什么?

  • 所有Bean的生命周期交由IOC容器管理
  • 所有被依赖的Bean通过构造方法执行注入
  • 被依赖的Bean需要优先创造

问题:如何实现一个简单的IOC?

package com.miracle.study;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author Miracle
 * @date 2021/5/3 21:44
 */
public class IocTest {

    /**
     * 所有bean的集合
     */
    private Map<String, Object> beanObject = new ConcurrentHashMap<>();

    /**
     * 获取Bean
     * @param beanId BeanId
     * @return
     */
    public Object getBean(String beanId){
        return beanObject.get(beanId);
    }

    /**
     * 创建Bean
     * @param clazz 要创建的Bean的Class
     * @param beanId bean的ID
     * @param paramBeanIds Bean的构造方法所需要的beanId
     */
    public void setBean(Class<?> clazz, String beanId, String... paramBeanIds) throws InvocationTargetException, InstantiationException, IllegalAccessException {

        Object[] paramValues = new Object[paramBeanIds.length];
        for (int i = 0; i < paramBeanIds.length; i++) {
            paramValues[i] = beanObject.get(paramBeanIds);
        }

        Object bean = null;
        for (Constructor<?> constructor: clazz.getConstructors()){
            bean = constructor.newInstance(paramBeanIds);
        }

        if (Objects.isNull(bean)){
            throw new RuntimeException("无法实例化bean对象");
        }

        beanObject.put(beanId, bean);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

萌白在努力

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

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

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

打赏作者

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

抵扣说明:

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

余额充值