package cn.lzx.spring;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Map;
/**
* <pre>
* 总结:
* 1. Spring容器在启动的时候,先回保存所有注册进行的bean的定义信息
* 1.1. xml注册的bean
* 1.2. @Service,@Bean标注的bean
* 2. spring容器会在合适的时候创建这些bean
* 2.1. 用到这个bean的时候,利用getBean创建这个bean,并加入单例池
* 2.2. 最后会统一创建剩下的bean
* 3. 后置处理器
* 3.1. 每一个bean创建完成之后,都会使用各种后置处理器进行处理,来增强bean的功能
* 3.2. 例如属性注入的 AutowiredAnnotationBeanPostProcessor
* 3.3. public AutowiredAnnotationBeanPostProcessor() {
* this.autowiredAnnotationTypes.add(Autowired.class);
* this.autowiredAnnotationTypes.add(Value.class);
* }
* 3.4. AnnotationAwareAspectJAutoProxyCreator aop的后置处理器,创建代理对象的后置处理器
* 4. 事件驱动模型
* 4.1. ApplicationListener 事件监听器
* 4.2. ApplicationEventMulticaster事件派发器
*
*
*
* </pre>
* <pre>
* // 刷新IOC容器
* 1. refresh()
* // 预刷新处理
* =======================================对上下文环境,初始化属性,早期的事件进行预处理=====================================
* 1.1. prepareRefresh();
* // 初始化资源文件,属性设置,留给子类实现(父类空实现)
* 1.1.1. initPropertySources();
* // 通过属性解析器,对上面初始化的属性就行校验操作
* 1.1.2. getEnvironment().validateRequiredProperties()
* // 允许将一下事件添加到这个集合,待事件派发器初始化完毕,就发布事件
* 1.1.3. this.earlyApplicationEvents = new LinkedHashSet<>();
* =======================================对上下文环境,初始化属性,早期的事件进行预处理=====================================
*
* ======================================对BeanFactory工厂进行预处理,设置属性,以及其他处理================================
* // 获取BeanFactory
* 2.1. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
* // 给BeanFactory设置一个序列化ID
* 2.1.1. this.beanFactory.setSerializationId(getId());
* // 获取bean工厂
* 2.1.2. getBeanFactory()
* // 创建一个默认的BeanFactory对象,什么属性都是默认的值
* 2.1.2.1. return GenericApplicationContext.this.beanFactory = new DefaultListableBeanFactory()
*
* // 对BeanFactory进行预处理,也即是对默认的BeanFactory设置初始属性
* 3.1. prepareBeanFactory(beanFactory);
* // 添加一个处理后置Aware接口的后置处理器,处理一些实现了Aware接口的实现了
* 3.1.1 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
* // 忽略一些接口,这个接口不会成为spring的bean,因此无法注入
* 3.1.2. beanFactory.ignoreDependencyInterface(ApplicationContextAware.class,EnvironmentAware.class,EmbeddedValueResolverAware.class,ResourceLoaderAware.class,ApplicationEventPublisherAware.class);
* // 注册一些可以解析的依赖,也就是可以在Spring中任何地方可以注入的类型
* 3.1.3. beanFactory.registerResolvableDependency(BeanFactory.class, ResourceLoader.class,ApplicationEventPublisher.class,ApplicationContext.class);
* // 注册一下环境组件
* 3.1.4. beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
* // 注册一下环境相关的属性,系统变量组件 ctx.getBean("systemProperties","systemEnvironment");
* 3.1.5 beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
*
* // 允许在上下文子类中对 bean 工厂进行后处理,默认空实现,留给子类,BeanFactory对象生成之后,对BeanFactory进行处理
* 4.1. postProcessBeanFactory(beanFactory);
* ======================================对BeanFactory工厂进行预处理,设置属性,以及其他处理================================
*
* ======================================执行BeanFactoryPostProcessor================================
* // 执行BeanFactoryPostProcessors后置处理器,在BeanFactory标准初始化之后执行的,也是前面的这四步骤
* // BeanFactoryProcessor有一个子接口BeanDefinitionRegistryPostProcessor,是Bean注册的后置处理器
* // 在BeanFactory中的bean定义未完全加载的时候执行
* 5.1. invokeBeanFactoryPostProcessors(beanFactory);
* // 遍历所有的BeanFactoryPostProcessor,如果beanFactoryPostProcessors存在的话
* 5.1.1. for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
* // 判断是否是bean定义注册器的后置处理器
* 5.1.1.1. if (postProcessor instanceof BeanDefinitionRegistryPostProcessor){
* // 执行BeanDefinitionRegistryPostProcessor后置处理器的postProcessBeanDefinitionRegistry方法,用于手动注册bean
* 5.1.1.1.1. registryProcessor.postProcessBeanDefinitionRegistry(registry);
* // 保存这个处理器,用于后面执行后置处理器的后置方法
* 5.1.1.1.2. registryProcessors.add(registryProcessor);
* 5.1.1.2. 如果BeanFactoryPostProcessor
* // 保存这个处理器,用于后面执行后置处理器的后置方法
* 5.1.1.2.1. regularPostProcessors.add(postProcessor);
* // 如果beanFactoryPostProcessors这个集合不存在元素,则需要去BeanFactory中找
* 5.2. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
* // 遍历所有找出来的BeanDefinitionRegistryPostProcessor
* 5.2.1. for (String ppName : postProcessorNames) {
* // 判断是否实现了PriorityOrdered接口,因为实现 后置处理器有最高优先级
* 5.2.1.1 if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class))
* // 将后置处理器保存
* 5.2.1.1.1. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
* // 对实现了PriorityOrdered的BeanDefinitionRegistryPostProcessor还需要排序一下
* 5.2.1.1.2. sortPostProcessors(currentRegistryProcessors)
* // 执行上面保存的currentRegistryProcessors的BeanDefinitionRegistryPostProcessor后置处理器
* 5.2.1.1.3 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors)
* // 判断是否实现了Ordered接口,因为后置处理器有优先级第二高
* 5.2.1.2 if (beanFactory.isTypeMatch(ppName, Ordered.class))
* 5.2.1.2 与5.2.1.1的逻辑步骤完全一样
* // 所有的BeanDefinitionRegistryPostProcessor执行完毕,需要找到BeanFactoryPostProcessor的后置处理器
* 5.3. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
* // 对实现了PriorityOrdered接口的优先级进行排序
* 5.3.1. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
* // 保存优先级最高的
* 5.3.1.1. priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
* // 对实现了Ordered接口的优先级进行排序
* 5.3.2. if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
* // 保存优先级第二高的
* 5.3.1.1. orderedPostProcessorNames.add(ppName);
* // 保存剩下没有实现优先级顺序的
* 5.3.3. nonOrderedPostProcessorNames.add(ppName);
* // 对同一类型的的后置处理器还需要排序
* 5.3.4. sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
* // 执行优先级最高的后置处理器
* 5.3.5. invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
* 5.3.6 执行优先级第二高(Order接口)的后置处理器
* 5.3.7 执行优先级最低的后置处理器
* ======================================执行BeanFactoryPostProcessor=================================================
*
* ======================================注册BeanPostProcessor,不会执行=================================================
* // 注册BeanPostProcessor,在Bean的前后执行
* 6.1. registerBeanPostProcessors(beanFactory);
* 6.1.1. BeanPostProcessor的子接口
* //
* 6.1.1.1. DestructionAwareBeanPostProcessor
* 6.1.1.2. MergedBeanDefinitionPostProcessor
* 6.1.1.3. SmartInstantiationAwareBeanPostProcessor
* 6.1.1.4. InstantiationAwareBeanPostProcessor
* // 找到所有的BeanPostProcessor
* 6.1.2. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
* // 对有BeanPostProcessor进行有限及排序分类
* 6.1.2.1. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
* // 保存到priorityOrderedPostProcessors容器中
* 6.1.2.1.1. priorityOrderedPostProcessors.add(pp);
* 6.1.2.2. if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
* // 保存到orderedPostProcessorNames容器中
* 6.1.2.2.1. orderedPostProcessorNames.add(pp);
* // 保存到nonOrderedPostProcessorNames容器
* 6.1.2.3. nonOrderedPostProcessorNames.add(pp);
* 6.1.2.4. if (pp instanceof MergedBeanDefinitionPostProcessor) {
* // 保存到internalPostProcessors这个容器中
* 6.1.2.4.1 internalPostProcessors.add(pp);
* 6.1.3 注册priorityOrderedPostProcessors容器中的BeanPostProcessor,也就是添加到工厂中
* 6.1.4 注册orderedPostProcessorNames容器中的BeanPostProcessor,也就是添加到工厂中
* 6.1.5 注册nonOrderedPostProcessorNames容器中的BeanPostProcessor,也就是添加到工厂中
* 6.1.6 注册internalPostProcessors(MergedBeanDefinitionPostProcessor)容器中的BeanPostProcessor,也就是添加到工厂中
* // 添加一个监听器的后置处理器
* 6.1.7. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
* // 后置处理器会将这个bean添加到容器中
* 6.1.7.1 this.applicationContext.addApplicationListener((ApplicationListener<?>) bean);
* ======================================注册BeanPostProcessor,不会执行=================================================
*
* ======================================初始化国际化资源组件=============================================================
* // 初始化MessageSource组件(做国际化,消息绑定,消息解析)
* 7.1.initMessageSource();
* // 获取bean工厂
* 7.1.1. getBeanFactory();
* // 判断容器中是否有messageSource这个组件
* 7.1.2. if (beanFactory.containsLocalBean(messageSource))
* // 如果有
* 7.1.2.1. this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
* // 如果没有,创建一个这个组件
* 7.1.2.2. this.messageSource = new DelegatingMessageSource();
* // 存入容器
* 7.1.2.2.1 beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
* 7.1.2.3. MessageSource是取出国际化配置文件中key的值,还能按照区域信息
* ======================================初始化国际化资源组件=============================================================
*
* ======================================初始化事件派发器=============================================================
* // 初始化事件派发器
* 8.1. initApplicationEventMulticaster();
* // 获取bean工厂
* 8.1.1 getBeanFactory()
* // 判断是否包含这个组件
* 8.1.2. if (beanFactory.containsLocalBean(applicationEventMulticaster)) {
* // 如果包含,从容器中获取
* 8.1.2.1 this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
* // 如果不包含,创建一个简单的派发器
* 8.1.2.2. this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
* // 放入IOC容器
* 8.1.2.3. beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
* ======================================初始化事件派发器=============================================================
*
* // 初始化特定上下文子类中的其他特殊bean,留给子类的
* 9.1. onRefresh();
*
* ======================================注册实现了ApplicationLister的监听器=============================================================
* // 注册监听器
* 10.1. registerListeners();
* // 找到所有实现了ApplicationListener的监听器
* 10.1.1. String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
* // 遍历,将每一个listener添加到事件分发器中
* 10.1.2. getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
* // 如果存在早前的事件,也就是还没有初始化派发器时发布的事件,会添加到 earlyApplicationEvents这个容器中
* 10.1.3. if (CollectionUtils.isEmpty(this.earlyApplicationEvents)) {
* // 发布事件
* 10.1.3.1. for (ApplicationEvent earlyEvent : earlyEventsToProcess) { getApplicationEventMulticaster().multicastEvent(earlyEvent);}
* ======================================注册实现了ApplicationLister的监听器=============================================================
*
* ======================================实例下剩下的单实例bean=============================================================
* // 实例下剩下的单实例bean,因为很多bean在之前初始化过,还有写剩下的没有初始化
* 11.1. finishBeanFactoryInitialization(beanFactory);
* // 实例下剩下的单实例bean
* 11.1.1. beanFactory.preInstantiateSingletons();
* // 遍历所有bean的名称,一一创建bean
* 11.1.1.1. for (String beanName : beanNames) {
* // 如果是factory bean
* 11.1.1.1.1. if (isFactoryBean(beanName)) {
* // factory bean的beanName 为 &beanName
* 11.1.1.1.1.1 Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
* // 如果不是FactoryBean
* 11.1.1.1.2. Object bean = getBean(beanName);
* // 创建或者获取bean
* 11.1.2. getBean()
* // 调用doGetBean创建bean
* 11.1.2.1 doGetBean(name, requiredType, args, false);
* // 获取bean是否已经被创建
* 11.1.2.1.1. Object sharedInstance = getSingleton(beanName);
* 11.1.2.1.2. 如果Bean没有存在,获取beanFactory工厂,即将创建bean
* // 标记这个bean已被创建
* 11.1.2.1.3. markBeanAsCreated();
* // 获取bean的定义信息
* 11.1.2.1.4. RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
* // 获取所有依赖的bean,@DependsOn(XXX.class)
* 11.1.2.1.5. String[] dependsOn = mbd.getDependsOn();
* // 遍历所有的dependsOn依赖的bean,先创建
* 11.1.2.1.6. for (String dep : dependsOn) { getBean(dep);}
* // 调用这个获取单实例方法,如果是单例bean的前提下
* 11.1.2.1.7. getSingleton(beanName, () -> {return createBean(beanName, mbd, args);}
* // 创建bean
* 11.1.2.1.8. singletonFactory.getObject(); --> createBean()
* // 获取bean定义信息
* 11.1.2.1.9. RootBeanDefinition mbdToUse = mbd;
* // 让BeanPostProcessor提前拦截,返回代理对象,此时还没开始创建对象
* 11.1.2.1.10. Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
* // 判断当前BeanDefinition是不是InstantiationAwareBeanPostProcessor这个后置处理器
* 11.1.2.1.10.1. if (bp instanceof InstantiationAwareBeanPostProcessor) {
* // 如果是,之前这个后置处理器的初始化前的方法
* 11.1.2.1.10.1.1. bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
* // 如果这个初始化前方法就返回了一个对象
* 11.1.2.1.10.1.2. if (bean != null) {
* // 直接执行这个后置处理器的初始化后方法
* 11.1.2.1.10.1.3. bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
* 11.1.2.1.10.1.4. 此时bean已经处理完成,这个bean完全是由applyBeanPostProcessorsBeforeInstantiation的逻辑进行处理的
* // 如果11.1.2.1.10.实例化前后置处理器步骤没有返回一个bean的话,会执行这个创建bean实例
* 11.1.2.1.11. Object beanInstance = doCreateBean(beanName, mbdToUse, args);
* 11.1.2.1.11.1. Object beanInstance = doCreateBean(beanName, mbdToUse, args);
* // 创建bean的实例
* 11.1.2.1.11.2. instanceWrapper = createBeanInstance(beanName, mbd, args);
* // 执行MergedBeanDefinitionPostProcessor后置处理器,实在实例化之后,原始对象,没有属性赋值只有原始对象
* 11.1.2.1.11.3. applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
* // 属性注入,依赖注入
* 11.1.2.1.11.4. populateBean(beanName, mbd, instanceWrapper);
* // 遍历所有InstantiationAwareBeanPostProcessor后置处理器,执行这个对象的实例化后方法
* 11.1.2.1.11.4.1. (InstantiationAwareBeanPostProcessor) ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)
* // 遍历所有InstantiationAwareBeanPostProcessor后置处理器,执行这个对象的实例化后属性初始化方法
* 11.1.2.1.11.4.1. (InstantiationAwareBeanPostProcessor) ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
* // 应用bean的属性值,为属性利用set方法赋值
* 11.1.2.1.11.4.1. applyPropertyValues(beanName, mbd, bw, pvs);
* // 对包装类的属性赋值 bw为包装类对象,mpvs为封装的属性值对象
* 11.1.2.1.11.4.1.1. bw.setPropertyValues(mpvs);
* // 根据属性名找到对应的字段
* 11.1.2.1.11.4.1.1.1. Field field = findField(getWrappedClass(), propertyName);
* // 放开权限
* 11.1.2.1.11.4.1.1.2. makeAccessible(field);
* // 对字段赋值
* 11.1.2.1.11.4.1.1.3. setField(field, getWrappedInstance(), value);
* // 属性赋值值后,对bean进行初始化操作
* 11.1.2.1.11.5. initializeBean(beanName, exposedObject, mbd);
* // 执行一些aware接口 BeanNameAware,BeanClassLoaderAware,BeanFactoryAware
* 11.1.2.1.11.5.1. invokeAwareMethods(beanName, bean);
* // 执行后置处理器初始化之前的方法
* 11.1.2.1.11.5.2. wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
* // 执行bean的初始化方法
* 11.1.2.1.11.5.3. invokeInitMethods(beanName, wrappedBean, mbd);
* // 执行实现了InitializingBean的接口
* 11.1.2.1.11.5.3.1. ((InitializingBean) bean).afterPropertiesSet();
* // 执行用户定义的@Bean(initMethod) <bean init-method/>
* 11.1.2.1.11.5.3.2. invokeCustomInitMethod(beanName, bean, mbd);
* // 执行bean的初始化后的后置处理器
* 11.1.2.1.11.5.4. wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
* // 注册一些实现了销毁接口的bean,实现了销毁接口的bean,当容器关闭之后需要执行
* 11.1.2.1.11.6. registerDisposableBeanIfNecessary(beanName, bean, mbd);
* // 判断这个bean是否实现了DisposableBean
* 11.1.2.1.11.6.1. this.bean instanceof DisposableBean
* // 保存实现了DestructionAwareBeanPostProcessor销毁的后置处理器
* 11.1.2.1.11.6.2. if (processor instanceof DestructionAwareBeanPostProcessor) { filteredPostProcessors.add(dabpp);}
* // 添加到单例池中
* 11.1.2.1.8. addSingleton(beanName, singletonObject);
* // 遍历所有的bean,因为在这之前,所有的bean都创建完成
* 11.1.3. for (String beanName : beanNames) {
* 11.1.2.1. Object singletonInstance = getSingleton(beanName);
* // 如果是SmartInitializingSingleton这种类型,会在所有的bean完成生命周期之后执行
* 11.1.2.1.1. if (singletonInstance instanceof SmartInitializingSingleton) { smartSingleton.afterSingletonsInstantiated();}
* ======================================实例下剩下的单实例bean=============================================================
*
* ======================================完成容器的刷新============================================================
* // 完成容器刷新
* 12.1. finishRefresh();
* // 初始化生命周期相关的处理器
* 12.1.1. initLifecycleProcessor();
* // 获取bean工厂
* 12.1.1.1. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
* // 如果包含这个lifecycleProcessor的处理器,则从bean工厂获取对象
* 12.1.1.2. if (beanFactory.containsLocalBean(lifecycleProcessor)) { this.lifecycleProcessor = beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);}
* // 如果容器中不存在,则创建一个默认的生命周期处理器
* 12.1.1.3. this.lifecycleProcessor = new DefaultLifecycleProcessor();
* // 注册这个处理器
* 12.1.1.4. beanFactory.registerSingleton(lifecycleProcessor, this.lifecycleProcessor);
* // 获取12.1.1初始化好的生命周期处理器接口的 onRefresh方法
* 12.1.2. getLifecycleProcessor().onRefresh();
* // 发布一个事件,容器刷新的事件
* 12.1.3. publishEvent(new ContextRefreshedEvent(this));
*
* ======================================完成容器的刷新============================================================
*
*
*
*
* </pre>
*/
@ComponentScan("cn.lzx.spring")
public class SpringSource {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringSource.class);
Evn evn = ctx.getBean(Evn.class);
Instantiation instantiation = ctx.getBean(Instantiation.class);
instantiation.test();
}
}
@Component
class Evn {
@Qualifier("systemProperties")
@Resource
private Map<String, Object> systemProperties;
@Qualifier("systemEnvironment")
@Resource
private Map<String, Object> systemEnvironment;
@Bean
public AntiYa antiYa() {
return new AntiYa();
}
}
Spring的源码浅析
于 2021-06-04 01:54:04 首次发布
由于博客内容为空,暂无法提供包含关键信息的摘要。
1628

被折叠的 条评论
为什么被折叠?



