问题:什么是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);
}
}