本文参考的spring版本为5.2.6.RELEASE
this()方法
1.获取DefaultListableBeanFactory对象
2.注册PostProcessor
- org.springframework.context.annotation.internalConfigurationAnnotationProcessor
- org.springframework.context.annotation.internalAutowiredAnnotationProcessor
- org.springframework.context.annotation.internalCommonAnnotationProcessor(支持JSR-250)
- org.springframework.context.annotation.internalPersistenceAnnotationProcessor(支持JPA)
- org.springframework.context.event.internalEventListenerProcessor
- org.springframework.context.event.internalEventListenerFactory
3.注册默认filter - @Component以及衍生注解
- JSR-250
- JSR-330
4.设置环境变量
5.设置资源加载器
register()方法
1.拿到被注解类的信息
2.是否要跳过@Conditional修饰的:如果没有被@Conditional修饰,并且存在注解信息,直接跳过
3.添加回掉
4.判断ScopeMetaData,来判断是否为单例
5.如果bean没有名字,自动生成
6.处理通用注解:@Lazy、@Primary、@DependOn、@Description、@Role
7.判断@Qualifer、customizers(bean定义的定制化)
8.设置Scope代理模式
9.将配置类进行注册
scan()方法
按照提供的扫描包的根目录,直接扫描当前的根目录以及子目录。
再处理的过程,判断这个类是一个普通bean,还是添加一些注解的bean,例如:@Lazy、@Primary、@DependOn、@Description、@Role
在处理之后添加,进行注册。如果对象是单例模型,就会创建出来,如果不是就不会创建出来
refresh方法
*1.prepareRefresh()刷新钱的处理
- a.initPropertySources()初始化一些属性设置;子类自定义个性化的设置方法;
- b.getEnvironment().validateRequiredProperties();校验属性的合法等。
- c.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();容器中的一些早期的事件;
- 2.obtainBeanFactory:获取beanFactory
- a.refreshBeanFactory:刷新BeanFactory
- b.getBeanFactory:返回GenericApplicationContext创建的BeanFactory。
- c.将创建的DefaultListableBeanFactory返回。
- prepareBeanFactory:
- a.设置BeanFactory的类加载、支持表达式解析器
- b.添加部分BeanPostProcessor[ApplicationContextAwareProcessor]
- c.设置忽略自动装配的接口EnvironmentAware。
- d.注册可以解析的自动装配:BeanFactory、ResourceLoader、ApplicationEventPublisher。
- e.添加BeanPostProcessor[ApplicationListenDetector]
- f.添加编译时aspectj
- g.给BeanFactory注册一些能用的组件:environment[ConfigurableEnvironment]、systemProperties、systemEnvironment。
- postProcessBeanFactory: 子类自定义实现
- invokeBeanFactoryPostProcessor:执行BeanFactoryPostProcessor
- a.执行BeanFactoryPostProcessord的方法;
- a.1. 获取所有的BeanDefinitionRegistryPostProcessor;
- a.2. 先执行实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor;
- a.3. 先执行实现Ordered接口的BeanDefinitionRegistryPostProcessor;
- a.4 执行没有排序的BeanDefinitionRegistryPostProcessor;
- 执行postProcessBeanDefinitionRegistry
- b.执行BeanFactoryPostProcessor
- b.1 获取所有的BeanFactoryPostProcessor
- b.2.先执行实现PriorityOrdered接口的BeanFactoryPostProcessor;
- b.3 先执行实现Ordered接口的BeanFactoryPostProcessor;
- b.4 无序的BeanFactoryPostProcessor;
- 执行postProcessBeanFactory。
- registerBeanPostProcessor(beanFactory):拦截bean的创建过程
- 获取所有的BeanPostProcessor
- 按照PriorityOrdered、Ordered、无序方式来注册BeanPostProcessor
- 最终注册MergedBeanDefinitionPostProcessor。
- 注册一个ApplicationListenerDetector:在Bean创建完成之后检查是否是ApplicationListener,如果是,直接注册
- initMessageSource:初始化国际化组件
- 获取BeanFactory,
- 看容器中是否有id为messageSource的组件。如果有,直接赋值;如果没有,自己创建。
- 将创建好的messagesource注册到容器中,以后获取国际化配置文件的值,可以自动注入MessageSource。
- initApplicationEventMulticaster:初始化派发器
- 如果有自定义的,就是用自定义的
- 如果没有自定义的,使用默认的ApplicationEventMulticaster。
- 9.onRefresh: 留给子类重写刷新逻辑。
- 10.registerListener:注册监听器
- 11.finishBeanFactoryInitialization:初始化剩下的bean
- a.preInstantiateSingleton: 初始化剩下的单例bean
- 获取容器中所有的bean,以此进行初始化和创建对象
- 获取bean的bbean的定义信息
- bean不是抽象的,是单例的,是懒加载
- 判断是否为FactoryBean,获取其派生类
- 不是工厂,利用getBean创建对象
- getBean
- doGetBean
- 先判断单例bean是否存在与缓存
- 如果存在,就不处理,如果不能存在,就创建
- 标记bean正在创建
- 获取bean的定义信息
- 获取当前bean依赖的其他bean,然后执行getbean流程
- 启动单实例bean的创建流程
- createBean
- resolveBeforeInstantiation: 让BeanPostProcessor先返回代理对象
- InstantiationAwareBeanPostProcessor:提前执行;先触发postProcessorBeforeInstantiation(),如果有返回,触发postProcessorAfterInstantiation()
- 如果InstantiationAwareBeanPostProcessor没有返回对象,调用下面一步
- Object beanInstance = doCreateBean(beanName,mdbToUse,rgs);
- 利用工厂方法或者构造函数创建bean实例。
- 调用mergedBeanDefinitionPostProcessor。
- populateBean:属性赋值
- bean初始化
- 执行Aware接口
- 执行后置处理器初始化之前
- 执行初始化方法
- 执行后置处理器初始化之后
- 注册bean的销毁方法
- 将创建的bean放入到singletonObjects中。
- 所有bean利用getBean创建完成
- 检查所有的Bean是否是SmartInitializationSingleton的接口,如果是,执行afterSingletonInitializations()。
- 12.finishRefresh():完成BeanFactory的初始化创建工作,IOC容器创建完成。
网友评论