我们先来看下spring如何手动初始化一个对象

ClassPathResource res = new ClassPathResource("beans.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);
User user=(User) factory.getBean("user");
复制代码

所以我们先从DefaultListableBeanFactory开始了解 AbstractBeanFactory

public <T> T getBean(String name, Class<T> requiredType, Object... args) throws BeansException {return doGetBean(name, requiredType, args, false);}
复制代码
    protected <T> T doGetBean(final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)throws BeansException {复制代码

1.去掉&

       final String beanName = transformedBeanName(name);
复制代码
    protected String transformedBeanName(String name) {return canonicalName(BeanFactoryUtils.transformedBeanName(name));}
复制代码

2.如果是单例且存在,就直接取过来

        Object bean;// Object sharedInstance = getSingleton(beanName);if (sharedInstance != null && args == null) {....bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);}
复制代码

3.如果已经创建,抛出异常

        else {if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}
复制代码

4.在父BeanFactory查找

           BeanFactory parentBeanFactory = getParentBeanFactory();if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {// Not found -> check parent.String nameToLookup = originalBeanName(name);if (args != null) {// Delegation to parent with explicit args.return (T) parentBeanFactory.getBean(nameToLookup, args);}else {// No args -> delegate to standard getBean method.return parentBeanFactory.getBean(nameToLookup, requiredType);}}
复制代码

5.创建标记,(用于清除)

          if (!typeCheckOnly) {markBeanAsCreated(beanName);}
复制代码

6.寻找bean定义信息,并针对bean定义进行验证

           try {final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);
复制代码

7.处理依赖信息,这里会针对xml定义中的depends-on进行处理

              String[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {for (String dependsOnBean : dependsOn) {if (isDependent(beanName, dependsOnBean)) {....registerDependentBean(dependsOnBean, beanName);getBean(dependsOnBean);}}
复制代码

具体通过这个私有方法来解决依赖的 假设A依赖于B,那么在创建A之前,必须保证B先被创建。 在创建了B之后,这里会进行依赖信息存储。后面在递归调用一下,不过依赖关系反过来。 dependentBeanMap放 A->[B,C,D] (A所依赖的B,C,D)

private boolean isDependent(String beanName, String dependentBeanName, Set<String> alreadySeen) {if (alreadySeen != null && alreadySeen.contains(beanName)) {return false;}String canonicalName = canonicalName(beanName);Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);if (dependentBeans == null) {return false;}if (dependentBeans.contains(dependentBeanName)) {return true;}for (String transitiveDependency : dependentBeans) {if (alreadySeen == null) {alreadySeen = new HashSet<String>();}alreadySeen.add(beanName);if (isDependent(transitiveDependency, dependentBeanName, alreadySeen)) {return true;}}return false;}
复制代码

单例模式就调用getSingleton(String beanName, ObjectFactory<?> singletonFactory)

// 单例if (mbd.isSingleton()) {....bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}
复制代码
    public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {....synchronized (this.singletonObjects) {Object singletonObject = this.singletonObjects.get(beanName);....beforeSingletonCreation(beanName);....singletonObject = singletonFactory.getObject();....addSingleton(beanName, singletonObject);}return (singletonObject != NULL_OBJECT ? singletonObject : null);}}
复制代码

原型模式

                else if (mbd.isPrototype()) {Object prototypeInstance = null;try {beforePrototypeCreation(beanName);prototypeInstance = createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}
复制代码

其他模式,比如scope=request

                else {String scopeName = mbd.getScope();final Scope scope = this.scopes.get(scopeName);....try {Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {@Overridepublic Object getObject() throws BeansException {beforePrototypeCreation(beanName);try {return createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}}});bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}....}}....}
复制代码

8.无论哪种模式都会进入AbstractAutowireCapableBeanFactory的createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)

                ....RootBeanDefinition mbdToUse = mbd;// 解析beanDefinition,以确保bean定义中的class可以被正确解析Class<?> resolvedClass = resolveBeanClass(mbd, beanName);if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {mbdToUse = new RootBeanDefinition(mbd);mbdToUse.setBeanClass(resolvedClass);}// Prepare method overrides.try {mbdToUse.prepareMethodOverrides();}....try {// 如果实现了InstantiationAwareBeanPostProcessor就先postProcessBeforeInstantiation(Class<?> beanClass, String beanName)->postProcessAfterInitialization(Object bean, String beanName)Object bean = resolveBeforeInstantiation(beanName, mbdToUse);if (bean != null) {return bean;}}....Object beanInstance = doCreateBean(beanName, mbdToUse, args);....}return beanInstance;
复制代码

9.Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)

                         ....if (exposedObject != null) {exposedObject = initializeBean(beanName, exposedObject, mbd);}....复制代码

10.Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd)

      if (System.getSecurityManager() != null) {AccessController.doPrivileged(new PrivilegedAction<Object>() {@Overridepublic Object run() {//setBeanName#BeanNameAware//->setBeanClassLoader#BeanClassLoaderAware//->setBeanFactory#BeanFactoryAwareinvokeAwareMethods(beanName, bean);return null;}}, getAccessControlContext());}else {invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {//->postProcessBeforeInitialization#BeanPostProcessorwrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {//->afterPropertiesSet#InitializingBeaninvokeInitMethods(beanName, wrappedBean, mbd);}....if (mbd == null || !mbd.isSynthetic()) {//->postProcessAfterInitialization#BeanPostProcessorwrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;
复制代码
    private void invokeAwareMethods(final String beanName, final Object bean) {if (bean instanceof Aware) {if (bean instanceof BeanNameAware) {((BeanNameAware) bean).setBeanName(beanName);}if (bean instanceof BeanClassLoaderAware) {((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());}if (bean instanceof BeanFactoryAware) {((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}}
复制代码
    protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)throws Throwable {boolean isInitializingBean = (bean instanceof InitializingBean);if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {....if (System.getSecurityManager() != null) {try {AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {@Overridepublic Object run() throws Exception {((InitializingBean) bean).afterPropertiesSet();return null;}}, getAccessControlContext());}catch (PrivilegedActionException pae) {throw pae.getException();}}else {((InitializingBean) bean).afterPropertiesSet();}}if (mbd != null) {String initMethodName = mbd.getInitMethodName();if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&!mbd.isExternallyManagedInitMethod(initMethodName)) {invokeCustomInitMethod(beanName, bean, mbd);}}}
复制代码

postProcessBeforeInstantiation(Class<?> beanClass, String beanName)#InstantiationAwareBeanPostProcessor ->postProcessAfterInitialization(Object bean, String beanName)#InstantiationAwareBeanPostProcessor ->setBeanName#BeanNameAware ->setBeanClassLoader#BeanClassLoaderAware ->setBeanFactory#BeanFactoryAware ->postProcessBeforeInitialization#BeanPostProcessor ->afterPropertiesSet#InitializingBean ->postProcessAfterInitialization#BeanPostProcessor

public class InitAndDestroySeqBean implements InitializingBean,DisposableBean,BeanPostProcessor,InstantiationAwareBeanPostProcessor {public InitAndDestroySeqBean() {System.out.println("构造方法");}@PostConstructpublic void postConstruct(){System.out.println("@PostConstruct");}@Override public void afterPropertiesSet() throws Exception {System.out.println("afterPropertiesSet()#InitializingBean");}public void initMethod(){System.out.println("init-method");}@PreDestroypublic void preDestroy(){System.out.println("@PreDestroy");}@Override public void destroy() throws Exception {System.out.println("destroy()#DisposableBean");}public void destroyMethod(){System.out.println("destroy-method");}@Override public Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException {System.out.println("postProcessBeforeInitialization(Object bean, String beanName)#BeanPostProcessor");return bean;}@Override public Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException {System.out.println("postProcessAfterInitialization(Object bean, String beanName)#BeanPostProcessor");return bean;}@Override public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)throws BeansException {System.out.println("postProcessBeforeInstantiation(Class<?> beanClass, String beanName)#InstantiationAwareBeanPostProcessor");return null;}@Override public boolean postProcessAfterInstantiation(Object bean, String beanName)throws BeansException {System.out.println("postProcessAfterInstantiation(Object bean, String beanName)#InstantiationAwareBeanPostProcessor");return false;}@Override public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds,Object bean, String beanName) throws BeansException {System.out.println("postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds,\n"+ "            Object bean, String beanName)#InstantiationAwareBeanPostProcessor");return null;}
}复制代码

20170308:11:34:52.866 [main] INFO Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@49c43f4e, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@290dbf45, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@12028586, org.springframework.test.context.support.DirtiesContextTestExecutionListener@17776a8, org.springframework.test.context.transaction.TransactionalTestExecutionListener@69a10787, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@2d127a61]20170308:11:34:52.972 [main] INFO Loading XML bean definitions from URL [file:/Users/dsc/IdeaProjects/firDemo/firdemo/web/target/classes/init.xml] 20170308:11:34:53.105 [main] INFO Refreshing org.springframework.context.support.GenericApplicationContext@2b4a2ec7: startup date [Wed Mar 08 11:34:53 CST 2017]; root of context hierarchy 构造方法 @PostConstruct afterPropertiesSet()#InitializingBean init-method postProcessBeforeInstantiation(Class<?> beanClass, String beanName)#InstantiationAwareBeanPostProcessor postProcessAfterInstantiation(Object bean, String beanName)#InstantiationAwareBeanPostProcessor postProcessBeforeInitialization(Object bean, String beanName)#BeanPostProcessor postProcessAfterInitialization(Object bean, String beanName)#BeanPostProcessor postProcessBeforeInstantiation(Class<?> beanClass, String beanName)#InstantiationAwareBeanPostProcessor postProcessAfterInstantiation(Object bean, String beanName)#InstantiationAwareBeanPostProcessor postProcessBeforeInitialization(Object bean, String beanName)#BeanPostProcessor postProcessAfterInitialization(Object bean, String beanName)#BeanPostProcessor postProcessAfterInstantiation(Object bean, String beanName)#InstantiationAwareBeanPostProcessor postProcessBeforeInitialization(Object bean, String beanName)#BeanPostProcessor postProcessAfterInitialization(Object bean, String beanName)#BeanPostProcessor 20170308:11:34:53.286 [Thread-0] INFO Closing org.springframework.context.support.GenericApplicationContext@2b4a2ec7: startup date [Wed Mar 08 11:34:53 CST 2017]; root of context hierarchy @PreDestroy destroy()#DisposableBean destroy-method

从源码了解spring bean实例化过程相关推荐

  1. Spring5源码 - 07 Spring Bean 生命周期流程 源码解读02

    文章目录 Pre 通俗流程 finishBeanFactoryInitialization Pre Spring5源码 - 06 Spring Bean 生命周期流程 概述 01 接上文 通俗流程 下 ...

  2. Spring5源码 - 06 Spring Bean 生命周期流程 概述 01

    文章目录 Bean生命周期概述 Demo finishBeanFactoryInitialization(beanFactory) 核心流程 Bean生命周期概述 说到Spring Bean的生命周期 ...

  3. Spring Bean实例化过程,怎么解决循环依赖

    1.Spring是什么? Spring有很庞大的家族,Spring一般指的其实就是SpringFramework! Ioc和aop 包含在SpringFramework中! SpringFramewo ...

  4. Spring源码分析之Bean的创建过程详解

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostProcessor调用过程详解 本文内容: 在 ...

  5. Spring源码阅读之bean对象的创建过程

    Spring源码阅读之bean对象的创建过程 ​ Spring是通过IOC容器来管理对象的,该容器不仅仅只是帮我们创建了对象那么简单,它负责了对象的整个生命周期-创建.装配.销毁.这种方式成为控制反转 ...

  6. 小米面试官:说说Spring源码里面的Bean的生命周期!

    1. Bean的实例化概述 前一篇分析了BeanDefinition的封装过程,最终将beanName与BeanDefinition以一对一映射关系放到beanDefinitionMap容器中,这一篇 ...

  7. 跟着小马哥学系列之 Spring IoC(源码篇:Bean 生命周期)

    跟着小马哥学系列之 Spring IoC(源码篇:Bean 生命周期) 简介 Bean 元信息来源 Bean 元信息解析成 BeanDefinition 并注册 BeanDefinition 转变成 ...

  8. Spring源码分析系列——bean创建过程分析(三)——工厂方法创建bean

    前言 spring创建bean的方式 测试代码准备 createBeanInstance()方法分析 instantiateUsingFactoryMethod()方法分析 总结 spring创建be ...

  9. Spring:源码解读Spring IOC原理

    2019独角兽企业重金招聘Python工程师标准>>> 一.什么是Ioc/DI? IOC容器:主要是完成了 完成对象的创建和依赖的管理注入等. 先从我们自己设计这样一个视角来考虑: ...

最新文章

  1. 尼克的任务 dp 洛谷1280
  2. 英特尔近日发布最新版实感™ SDK R5 (v7)
  3. ASP.NET网页中RAR、DOC、PDF等文件下载功能实例源代码
  4. python系统关键字_python基础之常用关键字总结
  5. 自动化运维之 部署Saltstack 并批量部署 Nginx
  6. 2019.6.16完成classstack任务
  7. SpringBoot:与MyBatis合作
  8. matplotlib调整子图尺寸,消除大图白边框
  9. Android的TextView设置padding无效
  10. 网络TCP/IP基础(IP地址网络汇总与规划)
  11. 浏览器打开exe(IE和谷歌)
  12. 海贼王里面路飞的一些台词翻译
  13. java8-stream示例
  14. 一位百度AI工程师的求职经历(offer/面经/干货/感悟)
  15. 泰坦尼克号幸存预测项目
  16. safari浏览器的兼容
  17. 振荡次数计算机控制系统,计算机控制第四章.ppt
  18. Unity制作自己的Project Template
  19. c语言 不用锁存器 数码管倒计时,倒计时器课程设计.doc
  20. iOS 代理(Delegate)

热门文章

  1. C++中重载(overload)和重写(override)和隐藏
  2. mysql 技术交流群_二进制部署MySQL(运维技术交流群:926402931,欢迎大家一起来交流。)...
  3. smbus使用 树莓派_树莓派学习笔记——I2C使用 PCF8574 Python SMBUS
  4. oracle_plseq客户端中文乱码
  5. ImageView 缩放
  6. js面向对象程序设置——创建对象
  7. API Hooking 的原理
  8. 函数模块:POPUP_TO_INFORM
  9. jquery实现页面导航列表点击添加active样式
  10. 读《程序是怎样跑起来的》第5章