步骤 | 执行过程 | 描述 |
1 | ThreadLocal.set | bean创建之前将beanName的一些属性放进ThreadLocal,避免多线程创建bean导致问题,并发创建会抛BeanCurrentlyInCreationException异常 |
2 | InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation | bean创建之前的回调,如果该方法返回不为null则不进行bean的创建过程,完成到第13步 |
3 | MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition | bean创建之后的回调,处理bean的合并,如Autowire注释的处理器处理注入信息 |
4 | InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation | bean创建之后的回调,如果该方法返回true,则不会进行第5、6步 |
5 | InstantiationAwareBeanPostProcessor.postProcessPropertyValues | 处理BeanDefinition的PropertyValues,为下一步注入属性打基础 |
6 | BeanWrapper.setPropertyValues | 注入依赖:根据上一步处理的结果(即PropertyValues),将bean的属性(字段)赋值 |
7 | BeanNameAware.setBeanName | bean实现了BeanNameAware接口则会调用 |
8 | BeanClassLoaderAware.setBeanClassLoader | bean实现了BeanClassLoaderAware接口则会调用 |
9 | BeanFactoryAware.setBeanFactory | bean实现了BeanFactoryAware接口则会调用 |
10 | BeanPostProcessor.postProcessBeforeInitialization |
初始化方法调用之前的回调,这其中有个processor进行接口方法回调,执行EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware对应方法 |
11 | InitializingBean.afterPropertiesSet | 调用bean的初始化方法,bean实现了InitializingBean接口则会调用afterPropertiesSet方法,PostConstruct注释修饰的方法也会被当做初始化方法 |
12 | BeanPostProcessor.postProcessAfterInitialization | 初始化方法调用之后的回调 |
13 | FactoryBean.getObject | 如果返回的对象是FactoryBean,则进一步调用FactoryBean的getObject方法并最终返回此方法返回的对象,否则直接返回原对象 |
14 | ThreadLocal.remove | bean创建完成之后清空ThreadLocal |
15 | ConcurrentHashMap.put | 如果是单例模式的bean的则放入map缓存类中 |
相关文章
- spring的bean创建过程
- Eclipse中安装Spring Tool Suite(STS)插件的正确过程
- 解决eclipse创建spring boot项目加载不到application.properties配置文件的问题
- spring Junit单元测试 bean 无法注入的问题
- java学习笔记——spring 之 ioc容器在项目中的使用(创建与销毁)
- 基于IDEA创建Spring boot 项目实现登陆注册(Spring的学习之旅 二)
- Springboot整合shiro,项目启动报错无法创建shiroFilterFactory的bean对象的问题
- mybatis+spring开发过程中的保存对象源码详解
- QT源码解析(七)Qt创建窗体的过程
- pl/sql developer创建数据表的过程