手写简易版Spring IOC容器【学习】

BeanDefinition

beanDefinition类

beanDefinition的作用主要是保存一个对象的类信息.

public class BeanDefinition {
    private Class beanClass;

    public BeanDefinition(Class beanClass){
        this.beanClass = beanClass;
    }

    public Class getBeanClass() {
        return beanClass;
    }

    public void setBeanClass(Class beanClass) {
        this.beanClass = beanClass;
    }
}

单例对象

单例对象注册(SingletonBeanRegistry)

public interface SingletonBeanRegistry {
    Object getSingleton(String beanName);
}

DefaultSingletonBeanRegistry

单例对象保存的具体类,存入到map中,同时拥有get add单例的方法

public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {

    private Map<String, Object> singletonObjects = new HashMap<>();

    @Override
    public Object getSingleton(String beanName) {
        return singletonObjects.get(beanName);
    }

    protected void addSingleton(String beanName, Object singletonObject){
        singletonObjects.put(beanName, singletonObject);
    }

}

模板方法 BeanFactory

BeanFactory接口

定义了一个bean工厂拥有的基本方法
其中第一个代表无参生成bean,第二个代表有参生成bean

public interface BeanFactory {

    public Object getBean(String name);

    public Object getBean(String name,Object ...args);

}

AbstractBeanFactory 抽象工厂模板 (getBean)

继承单例 获得单例的全部方法,实现BeanFactory接口
然后定义模板方法和两个抽象方法让子类实现.

public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {

    @Override
    public Object getBean(String name) throws BeansException {
        // 首先从单例对象的map中去获取.
        Object bean = getSingleton(name);
        if(bean != null) return bean;
        // 去执行子方法的逻辑获取beanDefinition
        BeanDefinition beanDefinition = getBeanDefinition(name);
        return createBean(name,beanDefinition,null);
    }

    @Override
    public Object getBean(String name, Object... args) {
        // 首先从单例对象的map中去获取.
        Object bean = getSingleton(name);
        if(bean != null) return bean;
        // 去执行子方法的逻辑获取beanDefinition
        BeanDefinition beanDefinition = getBeanDefinition(name);
        return createBean(name,beanDefinition,args);
    }

    protected abstract BeanDefinition getBeanDefinition(String beanName);

    protected abstract Object createBean(String beanName,BeanDefinition beanDefinition,Object[] args) throws BeansException;
}

AbstractAutowireCapableBeanFactory (createBean 创建bean)

继承上一个抽象类实现其中模板定义的一个方法 (createBean)

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory {

    private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();

    @Override
    protected Object createBean(String beanName, BeanDefinition beanDefinition, Object[] args) throws BeansException {
        Object bean = null;
        try {
            bean = createBeanInstance(beanDefinition,beanName,args);
        }catch (Exception e){
            e.printStackTrace();
        }
        addSingleton(beanName,bean);
        return bean;
    }

    protected Object createBeanInstance(BeanDefinition beanDefinition, String beanName, Object[] args) throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException {
        Constructor constructorToUse = null;
        Class<?> beanClass = beanDefinition.getBeanClass();
        Constructor<?>[] declaredConstructors = beanClass.getDeclaredConstructors();
        for (Constructor ctor : declaredConstructors) {
            if (null != args && ctor.getParameterTypes().length == args.length) {
                constructorToUse = ctor;
                break;
            }
        }
        return instantiationStrategy.instantiate(beanDefinition, beanName, constructorToUse, args);
    }
}

DefaultListableBeanFactory (getBeanDefinition) 获得bean定义

实现模板方法中bean定义的收集.

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry {
    private Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();
    @Override
    public BeanDefinition getBeanDefinition(String beanName) {
        BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);
        if (beanDefinition == null) throw new RuntimeException("发生了异常");
        return beanDefinition;
    }
    // 注册bean.
    @Override
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
        beanDefinitionMap.put(beanName, beanDefinition);
    }
}

在这里插入图片描述

相关推荐

  1. 简易Spring IOC容器02【学习

    2024-07-19 05:52:02       15 阅读
  2. 简易Spring IOC容器04【学习

    2024-07-19 05:52:02       22 阅读
  3. 简易Spring IOC容器05【学习

    2024-07-19 05:52:02       18 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 05:52:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 05:52:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 05:52:02       58 阅读
  4. Python语言-面向对象

    2024-07-19 05:52:02       69 阅读

热门阅读

  1. 构建RSS订阅机器人:观察者模式的实践与创新

    2024-07-19 05:52:02       20 阅读
  2. 手机日历如何与Outlook同步

    2024-07-19 05:52:02       21 阅读
  3. IPython:提升Python编程体验的魔法工具

    2024-07-19 05:52:02       16 阅读
  4. Python中的构造方法、析构方法和__str__方法

    2024-07-19 05:52:02       18 阅读
  5. Perl 语言的特点

    2024-07-19 05:52:02       23 阅读
  6. Spark SQL----CREATE TABLE

    2024-07-19 05:52:02       16 阅读
  7. IntelliJ IDEA 和 Eclipse的区别

    2024-07-19 05:52:02       23 阅读