| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 【Spring源码】Bean对象的创建和从容器中获取对象的过程 -> 正文阅读 |
|
[Java知识库]【Spring源码】Bean对象的创建和从容器中获取对象的过程 |
一、前期准备1.1 环境依赖
1.2 实体类简单的User类,在测试过程中创建这个User类的对象。
1.3 applicationContext.xml在applicationContext.xml配置bean对象。
1.4 测试代码通过applicationContext.xml配置应用程序的上下文,在容器中创建User对象。
二、探究过程2.1 目标目标:Spring容器中的Bean是何时创建的?为什么我们能从容器中获取到?
2.2 方法如果调用User的无参构造器创建了User对象,那么控制台将打印【创建了】。
我们通过打断点Debug的方式,时刻观察控制台的输出分析是哪段代码执行结束后创建了User对象。 可以通过【Ctrl + 鼠标左键】查看某个方法的具体实现;如果通过【Ctrl + 鼠标左键】跳转到了接口的抽象方法上,此时,我们需要通过【Ctrl + Alt + 鼠标左键】跳转到具体的实现方法上。
2.3 探究创建Bean对象过程2.3.1 SpringDemo测试类
2.3.2 ClassPathXmlApplicationContext在ClassPathXmlApplicationContext中重载了很多构造器,我们只看程序调用到的构造器。
在Debug过程中,发现在执行完 2.3.3 AbstractApplicationContext🔶 跳转到了 在Debug过程中,发现在执行完下面这行代码后创建了bean对象。
从名字和注解上我们可以看出来,这个方法可以实例化所有非懒加载的单例对象。 🔶 跳转到了 在Debug过程中,发现在执行完下面这行代码后创建了bean对象。
从名字和注解上我们可以看出来,这个方法是通过bean工厂实例化所有非懒加载的单例对象。 通过【Ctrl + Alt + 左键】跳转。 2.3.4 DefaultListableBeanFactory
我们只需要看DefaultListableBeanFactory实现类中的 通过for循环实例化所有非懒加载对象,不过这里只包含一个User对象。
② 通过if判断这个对象是不是FactoryBean。(不成立)
2.3.5 AbstractBeanFactory🔶 跳转到AbstractBeanFactory抽象类的
这个方法由调用了 🔶 在这里创建bean对象,通过lambda表达式和匿名内部类来实现的。 虽然 3.3.6 DefaultSingletonBeanRegistry下面来看看
所以这段代码就是实现了3.3.5节中的: 3.3.7 AbstractAutowireCapableBeanFactory🔶 下面跳转到 通过调用 🔶 🔶 在这个方法中经过一系列的分析,使用无参构造器创建对象。 3.3.8 SimpleInstantiationStrategy获取空参构造器,通过Bean工具实例化类对象。 3.3.9 BeanUtilsBeanUtils:JavaBeans的静态方法,用于初始化bean、检查bean的属性类型、复制bean属性等。 通过传入 2.4 探究Bean对象加入容器过程🔶 我们回到【3.3.6节】的DefaultSingletonBeanRegistry的 此时对象就是
🔶 将单例对象加入到工厂的单例缓存 2.5 从容器中获取Bean对象的过程从刚刚创建的容器中获取user对象。 🔶 AbstractBeanFactory的 这时候我们就可以通过方法 下面来看看 2.6 总结非懒加载的单实例bean会在容器创建的时候创建。容器内部会创建一个beanFactory,使用beanFactory的doGetBean方法来进行创建,并且在创建后会把bean放入一个单例bean的map集合(singletonObjects)中存储。key就是我们配置的bean的名称。 我们调用容器getBean()方法来获取对象的时候,其实也是调用了doGetBean方法。就会从对应的集合中获取到之前创建的对象。 2.7 新的疑问RootBeanDefination是什么?如何通过bean名获取对应的RootBeanDefinition对象的? 如果是FactoryBean是怎么创建的? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 20:01:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |