Spring源码系列02——IOC容器加载过程

public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
        this();
        //将配置类注册到容器中
        this.register(annotatedClasses);
        //初始化容器
        this.refresh();
    }
org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext()

(1)去获取一个beanfactory
(2)获取一个BeanDefinitionReader——一些创世纪的类,实现beanfactorypostProccer接口;
(3)定义一个扫描器:不是解析实例的扫描器,是给提供给用户调用的

doscanner:扫描配置类

org.springframework.context.annotation.AnnotationConfigApplicationContext#register
把用户的config类注册到BeanDefinitionMap中;

容器初始化前的一些准备工作

在这里插入图片描述

向BeanDefinitionHolder中注册了如下Processor:
1、internalConfigurationAnnotationProcessor
负责解析处理所有@Configuration标签类,并将Bean定义注册到BeanFactory中
Spring如何加载和解析@Configuration标签

2、internalAutowiredAnnotationProcessor
负责解析@Autowired注解
3、internalRequiredAnnotationProcessor
4、internalCommonAnnotationProcessor
5、internalPersistenceAnnotationProcessor

org.springframework.context.support.AbstractApplicationContext#refresh
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh();
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
this.prepareBeanFactory(beanFactory);

        try {
            this.postProcessBeanFactory(beanFactory);
            //调用我们的bean工厂的后置处理器,会先实例话创世纪的BeanDefinition; //1、会将class转换成BeanDefinition;2把配置类中的类扫描到BeanDefinitionMap中;
            this.invokeBeanFactoryPostProcessors(beanFactory);
            //注册bean的后置处理器
            this.registerBeanPostProcessors(beanFactory);
            this.initMessageSource();
            this.initApplicationEventMulticaster();
            this.onRefresh();
            this.registerListeners();
            //注册所有的单例bean
            this.finishBeanFactoryInitialization(beanFactory);
            this.finishRefresh();
        } catch (BeansException var5) {
            this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt", var5);
            this.destroyBeans();
            this.cancelRefresh(var5);
            throw var5;
        }

    }
}

IOC容器加载Bean的主要流程

在这里插入图片描述

this.isFactoryBean(beanName)?是不是工厂bean;

factorybean和beanfactory的区别:

factorybean用来修饰普通bean;最终getBean是调用getObject获取的实例;集成mybatis;

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])

//第一次调用bean的后置处理器;可以阻止bean的创建;总共有九次调用
beanInstance = this.resolveBeforeInstantiation(beanName, mbd);  

======
//实例化bean,此时属性为空
instanceWrapper = this.createBeanInstance(beanName, mbd, args);

//属性填充
this.populateBean(beanName, mbd, instanceWrapper);

//初始化; Aware 、@PostConstruct和initLinizing、initMethod
exposedObject = this.initializeBean(beanName, exposedObject, mbd);

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
//执行AOP动态代理
wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
加入到一级缓存中

问题:

介绍BeanFactoryPostProcesser在spring中的用途?
可以解析配置类

spring中有哪些扩展点,以及调用时机?
在invokeBeanFactoryPostProcessors中会调用BeanFactory后置处理器,解析配置类为beandefinition;
在创建Bean的时候会调用bean的后置处理器;
在属性填充之后,会调用三个aware回调,beanInitializing,@PostConstruct,@initMethod四个回调。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值