Spring容器初始化流程

Spring容器初始化流程

//容器启动类
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class)

点进去可以看到有两个方法

	public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
		this();
		//将配置类封装成为beanDefinition,然后放到DefaultListableBeanFactory容器内的
		//private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);缓存中
		register(annotatedClasses);
		
		//进行容器的初始化工作
		refresh();
	}

具体refresh的逻辑

         // Allows post-processing of the bean factory in context subclasses.
         //允许在上下文子类中对bean工厂进行后处理 默认空实现
        postProcessBeanFactory(beanFactory);

        // Invoke factory processors registered as beans in the context.
        //将工厂processors创建并注册到容器中
        invokeBeanFactoryPostProcessors(beanFactory);

        // Register bean processors that intercept bean creation.
        //注册用于拦截bean创建的beanProcessors
        registerBeanPostProcessors(beanFactory);

        // Initialize message source for this context.
        initMessageSource();

        // Initialize event multicaster for this context.
        initApplicationEventMulticaster();

        // Initialize other special beans in specific context subclasses.
        onRefresh();

        // Check for listener beans and register them.
        registerListeners();

        // Instantiate all remaining (non-lazy-init) singletons.
        //初始化所有非懒加载的单利bean
        finishBeanFactoryInitialization(beanFactory);

        // Last step: publish corresponding event.
        //发布对应的事件
        finishRefresh();

一、初始化容器的后置处理器

首先看invokeBeanFactoryPostProcessors(beanFactory)
顾名思义是将工厂相关的processors创建并注册:
具体的会初始化两类后置处理器

  1. BeanDefinitionRegistryPostProcessor 负责beanDefinition注册的后置处理器
  2. BeanFactoryPostProcessor 负责beanFactory容器的后置处理器

ConfigurationClassPostProcessor是BeanDefinitionRegistryPostProcessor的实现类
负责的配置类@Bean,@ComponentScan…等注解的解析封装成为beanDefinition
如果有多个BeanDefinitionRegistryPostProcessor的实现的话创建的顺序遵循

  1. 实现PriorityOrdered接口
  2. 实现Ordered接口
  3. 普通的实现类

以PriorityOrdered举例:

	String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				    //如果是实现PriorityOrdered的话,
				    //beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)
				    //创建bean,getBean方法后续再说。。。。。
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}

可以看到ConfigurationClassPostProcessor就是实现了PriorityOrdered的

public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPostProcessor,
		PriorityOrdered, ResourceLoaderAware, BeanClassLoaderAware, EnvironmentAware

创建好了processor之后循环遍历postProcessBeanFactory方法
以ConfigurationClassPostProcessor举例:
ConfigurationClassPostProcessor中有个ConfigurationClassParser(配置类的解析器)

  1. 首先看是否有贴component注解,有的话就解析当前类的内部类(内部类必须是@configuration或者@Bean才会创建)
  2. 看当前类是否有PropertySources注解,和配置文件相关的注解
  3. 看当前类是否是ComponentScans注解,解析packages,
  4. @Import ,importSelector ImportBeanDefinitionRegistrar类
  5. ImportResource类
  6. 解析@Bean
  7. 接口的
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值