手写一个简易的spring

手写一个简易的spring之Ioc的实现

Spring核心功能

  • 手写一个简易的spring之Ioc的实现
  • 一、概念
  • 二、Spring中容器的获取
    • BeanDefinition
    • BeanFactory
    • 测试
  • 总结

一、概念

控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指
将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的创建,属性赋值,依赖的管理。简单来说,这里的反转指的就是将原先new代码的权力交付给spring的容器去实现。

二、Spring中容器的获取

手写一个简易的spring_第1张图片
如上,我们先来看看ApplicationContext,ApplicationContext 是一个接口,
ApplicationContext 用于加载 Spring 的配置文件,在程序中充当“容
器”的角色。将配置文件的路径传给ClassPathXmlApplicationContext(常用实现类),读取配置文件,完成容器对象对象的初始化。

容器对象初始化时,一次性全部装配好所有的Bean,效率高,但占内存,哈哈哈哈哈哈,也算空间换时间吧。

当我们创建好一个容器对象之后,我们就可以从这个容器对象里面getBean方法去取数据了,如下
手写一个简易的spring_第2张图片

根据前面我们可以大致了解spring中Bean是如何操作的,接下来我将带大家去实现一个最基本的Bean的存和取。
手写一个简易的spring_第3张图片
定义:BeanDefinition,可能这是你在查阅 Spring 源码时经常看到的一个类,例如它会包括 singleton、prototype、BeanClassName 等。但目前我们初步实现会更加简单的处理,只定义一个 Object 类型用于存放对象。

此处的只用Object实际上是不妥的,后面会改成Class,通过反射newInstance创建对象。

注册:这个过程就相当于我们把数据存放到 HashMap 中,只不过现在 HashMap 存放的是定义了的 Bean 的对象信息。
获取:最后就是获取对象,Bean 的名字就是key,Spring 容器初始化好 Bean 以后,就可以直接获取了。

BeanDefinition

public class BeanDefinition {

    private Object bean;

    public BeanDefinition(Object bean) {
        this.bean = bean;
    }

    public Object getBean() {
        return bean;
    }

}

BeanFactory

public class BeanFactory {

    private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();

    public Object getBean(String name) {
        return beanDefinitionMap.get(name).getBean();
    }

    public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
        beanDefinitionMap.put(name, beanDefinition);
    }

}

通过以上两个类,我们可以发现,我们是通过BeanDefination存取一个bean对象,并将它的名字和beandefination作为kv存入ConcurrentHashMap(后面出个专题研究下这个类)中。

测试

@Test
public void test_BeanFactory(){
    // 1.初始化 BeanFactory
    BeanFactory beanFactory = new BeanFactory();
    
    // 2.注册 bean
    BeanDefinition beanDefinition = new BeanDefinition(new UserService());
    beanFactory.registerBeanDefinition("userService", beanDefinition);
    
    // 3.获取 bean
    UserService userService = (UserService) beanFactory.getBean("userService");
    userService.queryUserInfo();
}

注:省略了userservice

总结

以上就是简单的bean容器实现,其实抽丝破茧一下,最基本的bean容器就是这样操作的,后面我们会更深入研究ioc,下期见。
(部分内容参考bugStack)

你可能感兴趣的:(spring)