spring内幕(七)bean的初始化之creatBean()方法

本文详细探讨了Spring框架中Bean的初始化过程,从`creatBean()`方法开始,涉及后置处理器、`doCreateBean()`方法、`createBeanInstance()`、无参构造函数的`instantiateBean()`以及Cglib子类化策略。在Bean实例化过程中,重点解释了MethodOverrides的作用,如何处理`lookup-method`和`replace-method`属性,以及如何解决循环依赖问题。Bean生命周期的第一阶段——创建阶段至此结束,接下来是属性初始化和初始化方法的调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在creatbean中
先看该beanName有没有设置后置处理器,如果有 则返回一个代理对象
在这里插入图片描述

然后看doCreateBean方法
在这里插入图片描述

在doCreateBean方法里面
createBeanInstance方法将会创建一个对象
在这里插入图片描述
在createBeanInstance方法里面

有从提供者那获取bean instanceSupplier是一个回调接口
在这里插入图片描述
从工厂方法中获取bean,该工厂方法要先通过配置解析到beanDefinition里面
在这里插入图片描述

使用指定注入的构造函数进行实例化
在这里插入图片描述

使用默认的构造函数绝对bean进行实例化
在这里插入图片描述
最后还有 没有任何特殊处理 使用无参构造函数实例化
在这里插入图片描述

这里我们只看无参构造函数实例化 也就是instantiateBean()方法

在这里插入图片描述

默认的实例化策略是CglibSubclassingInstantiationStrategy
在这里插入图片描述

那么再看下默认的策略里面instantiate方法在这里插入图片描述

需要注意的是

这个MethodOverrides ,是方法重写集,用于确定运行时springIOC容器会重写托管对象的哪些方法
methodOverrides列表 记录的是bean的属性中包含有lookup-method和replace-method属性的bean
lookup-method 是当单例bean依赖非单例bean的时候,能够每次重新创建非单例bean的时候使用
replace-method则是直接替换整个方法,用于替换的bean需要实现MethodReplacer接口 ,可以替换掉指定的方法

拥有以上步骤的 需要cglib来动态生成子类代理 来解决 靠反射创建原来的实例无法解决

以上就是完成了一个bean实例的创建。
此时已经有了一个bean对象,但是还不可以使用,因为其依赖的属性还没有初始化。

此时流程刚从createBeanInstance中返回,回到了doCreateBean方法
bean已经创建好了对象, 但是属性尚未填充,但是为了解决循环依赖
此时可以作为早期bean暴露出去
在这里插入图片描述
将这个bean 放到了singletonFactories里面,也就是所谓的第三级缓存中
这样在填充属性的时候,发现有依赖到这个bean的 就可以从singletonFactories里面取出来。

在这里插入图片描述

bean的声明周期,第一阶段 创建bean 就完成了 核心方法是instantiateBean

接下来是初始化属性,和调用初始化方法
再就是bean的使用 和销毁阶段。

### 如何将YOLOPyQt结合使用 为了实现YOLOPyQt的集成,可以按照以下方法构建应用程序: #### 1. 安装依赖库 确保安装了必要的Python包。这通常包括`opencv-python`用于图像处理以及`torch`和`tqdm`等其他可能需要的机器学习框架。 ```bash pip install opencv-python torch tqdm pyqt5 ``` #### 2. 加载并配置YOLO模型 加载预训练好的YOLO权重文件,并设置好检测参数。这部分代码可以从官方GitHub仓库获取或者基于已有的YOLO版本调整[^1]。 ```python import cv2 from ultralytics import YOLO model = YOLO('yolov8n.pt') # Load model ``` #### 3. 创建PyQt界面 设计图形用户界面(GUI),允许用户选择视频源或图片路径作为输入给YOLO进行目标识别。这里展示了一个简单的窗口布局例子[^2]。 ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel, QLineEdit class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("YOLO Object Detection") layout = QVBoxLayout() label = QLabel("Enter image path:") line_edit = QLineEdit() button = QPushButton("Detect Objects!") layout.addWidget(label) layout.addWidget(line_edit) layout.addWidget(button) container = QWidget() container.setLayout(layout) self.setCentralWidget(container) ``` #### 4. 实现对象检测逻辑 当点击按钮时触发事件处理器,在其中调用YOLO来进行预测并将结果显示出来。注意要处理不同类型的媒体数据(如摄像头流、本地文件)[^3]。 ```python def on_button_clicked(self): img_path = self.line_edit.text() # Get input from user results = model(img_path) # Perform inference using loaded model res_plotted = results[0].plot() # Plot bounding boxes over detected objects cv2.imshow("Detected Image", res_plotted) # Show result in a window cv2.waitKey(0) button.clicked.connect(on_button_clicked) ``` 以上就是基本的工作流程;当然实际项目可能会更复杂一些,比如还需要考虑多线程运行以提高性能等问题。对于具体细节上的差异,则取决于所选用的具体YOLO变体及其对应的API接口文档说明[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值