Spring注解驱动开发——BeanFactory的准备工作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rubulai/article/details/80822424

一、BeanFactory预准备

Spring容器的refresh()【创建刷新】:

public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
	this();
	register(annotatedClasses);
	refresh();
}

1、prepareRefresh()刷新前的预处理

    1)、initPropertySources()自定义初始化一些属性设置,比如子类(继承AnnotationConfigApplicationContext)自定义的个性化的属性设置方法
    2)、getEnvironment().validateRequiredProperties():检验属性的合法等
    3)、earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>()保存容器中的一些早期的事件
2、obtainFreshBeanFactory()获取BeanFactory
    1)、refreshBeanFactory()创建BeanFactory实例
        创建了一个beanFactory:this.beanFactory = new DefaultListableBeanFactory();
        并设置其id
    2)、getBeanFactory()获取刚才在GenericApplicationContext中创建的BeanFactory对象
    3)、将创建的BeanFactory【DefaultListableBeanFactory】返回
3、prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置)
    1)、设置BeanFactory的类加载器、支持表达式解析器等等
    2)、添加部分BeanPostProcessor,比如ApplicationContextAwareProcessor
    3)、设置忽略的自动装配的接口,比如EnvironmentAware、EmbeddedValueResolverAware等等
    4)、注册可以解析的自动装配,我们能直接在任何组件中自动注入这些Spring为我们提供的组建,比如:
        BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
    5)、添加BeanPostProcessor,类型为ApplicationListenerDetector
    6)、添加编译时的AspectJ
    7)、给BeanFactory中注册一些能用的组件,比如:
        id为environment,类型为ConfigurableEnvironment
        id为systemProperties,类型为Map<String, Object>
        id为systemEnvironment,类型为Map<String, Object>

4、postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作,子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置

二、执行BeanFactoryPostProcessor

    invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的后置处理方法;
BeanFactoryPostProcessor:BeanFactory的后置处理器,在BeanFactory标准初始化之后执行的
两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
1、先执行BeanDefinitionRegistryPostProcessor(是BeanFactoryPostProcessor的子接口)
    1)、获取所有的BeanDefinitionRegistryPostProcessor;
    2)、先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor
        postProcessor.postProcessBeanDefinitionRegistry(registry)
    3)、再执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor
        postProcessor.postProcessBeanDefinitionRegistry(registry)
    4)、最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors
        postProcessor.postProcessBeanDefinitionRegistry(registry)
2、再执行BeanFactoryPostProcessor的方法
    1)、获取所有的BeanFactoryPostProcessor
    2)、执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor
        postProcessor.postProcessBeanFactory()
    3)、再执行实现了Ordered顺序接口的BeanFactoryPostProcessor
        postProcessor.postProcessBeanFactory()
    4)、最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor

        postProcessor.postProcessBeanFactory()

三、注册BeanPostProcessors,此时并不执行这些bean的后置处理器

    registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器,拦截bean的创建过程)
不同接口类型的BeanPostProcessor,在Bean创建前后的执行时机是不一样的,后置处理器都默认可以通过PriorityOrdered、Ordered接口来指定优先级
    BeanPostProcessor
    DestructionAwareBeanPostProcessor
    InstantiationAwareBeanPostProcessor
    SmartInstantiationAwareBeanPostProcessor
    MergedBeanDefinitionPostProcessor(此类型的BeanPostProcessor放在internalPostProcessors中,最后注册)
1)、获取所有的 BeanPostProcessor
2)、先注册实现了PriorityOrdered优先级接口的BeanPostProcessor
    把每一个BeanPostProcessor添加到BeanFactory中
    beanFactory.addBeanPostProcessor(postProcessor);
3)、再注册Ordered接口的BeanPostProcessor
4)、最后注册没有实现任何优先级接口的

5)、最终注册MergedBeanDefinitionPostProcessor

registerBeanPostProcessors(beanFactory, internalPostProcessors);

6)、注册一个ApplicationListenerDetector,来在Bean创建完成后检查是否是ApplicationListener,如果是则先将其保存在容器中
applicationContext.addApplicationListener((ApplicationListener<?>) bean);

四、初始化MessageSource

    initMessageSource();初始化MessageSource组件(SpringMvc中做国际化功能;消息绑定,消息解析)
1)、获取BeanFactory
2)、看容器中是否有id为messageSource类型是MessageSource的组件
如果有赋值给messageSource,如果没有自己创建一个DelegatingMessageSource类型的MessageSource
MessageSource:用来取出国际化配置文件中的某个key的值(能按照区域信息获取)
3)、把创建好的MessageSource注册在容器中,在获取国际化配置文件中的值的时候,可以自动注入MessageSource组件,并调用其getMessage(String code, Object[] args, String defaultMessage, Locale locale);方法获取国际化配置信息

beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);

五、初始化事件派发器

    initApplicationEventMulticaster();初始化事件派发器
1)、获取BeanFactory
2)、从BeanFactory中获取id为applicationEventMulticaster的ApplicationEventMulticaster

    如果上一步没有获取到,则创建一个SimpleApplicationEventMulticaster,并将其添加到BeanFactory中,以后其他组件可以直接自动注入

六、onRefresh();是一个空方法,留给容器的子类实现,子类重写这个方法,在容器刷新的时候可以自定义一些逻辑

七、注册事件驱动

    registerListeners();在容器中注册所有的ApplicationListener

1、从容器中拿到所有的ApplicationListener
2、将每个监听器添加到事件派发器中
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);

3、派发之前步骤产生的事件

Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
this.earlyApplicationEvents = null;
if (earlyEventsToProcess != null) {
	for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
		getApplicationEventMulticaster().multicastEvent(earlyEvent);
	}
}

猜你喜欢

转载自blog.csdn.net/rubulai/article/details/80822424
今日推荐