这一行代码到底做了什么?

每天叫醒你的不是闹钟,而是梦想

● 前言

    我们在了解Spring的Bean时候,首先要明白Bean对象与普通的对象有什么区别,怎样才能成为Spring中的Bean。一个Bean一定是一个对象,一个对象不一定是Spring的Bean,通俗来讲Spring中的Bean必须经过完整的生命周期。由于现在主流的方式采用JavaConfig风格+注解的方式来开发一个Spring项目,同时也是Spring官方所推荐。

    我们的解说采用Spring5.0.0的版本,从下面一行代码出发:

AnnotationConfigApplicationContext context = new AnnotationConfigApplic
tionContext(Appconfig.class);

● AnnotationConfigApplicationContextApp构造器解读

    首先我们通过AnnotationConfigApplicationContext创建一个Spring的容器。可以看出来,有参的构造方法直接调用的是无参的构造方法,在无参的构造方法里面创建了一个专门读取Bean定义的读取器和一个扫描包或者是类的扫描器。但实际上我们扫描包的工作不是scanner这个对象来完成的,而是spring自己创建的ClassPathBeanDefinitionScanner来完成的。

    回过头来看有参的构造器,这个构造器方法需要传入一个javaconfig的配置类,然后会把这个配置类通过注解读取器读取后,继续执行。

public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
    this();
    this.register(annotatedClasses);
    this.refresh();
}
public AnnotationConfigApplicationContext() {
    this.reader = new AnnotatedBeanDefinitionReader(this);
    this.scanner = new ClassPathBeanDefinitionScanner(this);
}

● beanFactory的构建以及重用组成部分

    由于AnnotationConfigApplicationContext在创建的过程中,首先会调用他的父类GenericApplicationContext的构造方法,在下放的代码中可以看出,是实例化一个DefaultListableBeanFactory对象。由于在创建Bean创建的时候需要有产生Bean的原料。beanFactory有一个重要的成员beanDefinitionMap,他说Map集合负责存放每一个beanName对应的BeanDefinition对象,他包含了Bean创建过程所需要信息,如Bean类名、类对象、是否单实例。这些Bean的信息是Spring通过扫描Class对象转换后得来的。

    正常顺序下,在beanFactory调用PreInstantiateSingletons()时候,会用beanDefinitionMap中的定义信息来创建Bean,放入Spring的单例池中。

public GenericApplicationContext() {
    this.customClassLoader = false;
    this.refreshed = new AtomicBoolean();
    this.beanFactory = new DefaultListableBeanFactory();
}
//BeanFactory对象负责的产生Bean原料
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap(256);

什么是Spring容器

    Spring正常工作中所有组件加起来可以称为Spring容器,比如说BeanFactory、扫描器(BeanDefinitionRegistry)、读取器(BeanDefinitionRegistry)、单例池(singletonObjects)等。

专注分享Java技术,跟我一起学习吧

长按识别二维码关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值