当前位置: 首页 > news >正文

Spring之【Bean的生命周期】

目录

1、生成BeanDefinition

BeanDefinitionRegistry接口

DefaultListableBeanFactory实现类

2、合并BeanDefnition

AbstractBeanFactory类

3、BeanFactoryPostProcessor的方法回调

AbstractApplicationContext类

PostProcessorRegistrationDelegate类

4、BeanPostProcessor的注册

AbstractApplicationContext类

PostProcessorRegistrationDelegate类

AbstractBeanFactory类

5、执行InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation方法

AbstractApplicationContext类

DefaultListableBeanFactory类

AbstractBeanFactory类

DefaultSingletonBeanRegistry类

ObjectFactory接口

AbstractAutowireCapableBeanFactory类

6、Bean的实例化

AbstractAutowireCapableBeanFactory类

7、执行MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition方法

AbstractAutowireCapableBeanFactory类

8、Bean的属性填充

AbstractAutowireCapableBeanFactory类

9、BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口对应的set方法回调

AbstractAutowireCapableBeanFactory类

10、执行BeanPostProcessor#postProcessBeforeInitialization方法

AbstractAutowireCapableBeanFactory类

11、执行InitializingBean#afterPropertiesSet方法

AbstractAutowireCapableBeanFactory类

12、执行BeanPostProcessor#postProcessAfterInitialization方法

AbstractAutowireCapableBeanFactory类

13、执行SmartInitializingSingleton#afterSingletonsInstantiated方法

SmartInitializingSingleton接口

DefaultListableBeanFactory类


1、生成BeanDefinition

Spring会为Bean创建对应的Bean定义信息对象(也就是BeanDefinition类型对象),并储存到DefaultListableBeanFactory类定义的beanDefinitionMap集合中

BeanDefinitionRegistry接口

package org.springframework.beans.factory.support;// 用于管理BeanDefinition对象的接口
public interface BeanDefinitionRegistry extends AliasRegistry {// 定义了添加BeanDefinition的方法    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException;// ...
}

DefaultListableBeanFactory实现类

package org.springframework.beans.factory.support;//DefaultListableBeanFactory实现了BeanDefinitionRegistry接口
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {// ...// 用于存储Bean的定义信息,key是beanName, value是BeanDefinition对象private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);// 实现了添加Bean定义信息的方法@Overridepublic void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {// ...// 存放Bean的定义信息到beanDefinitionMap集合中this.beanDefinitionMap.put(beanName, beanDefinition);// ...}// ...
}

 如下图中可以看到beanDefinitionMap集合中存储了Bean的Bean定义信息,有GenericBeanDefinition类型对象,也有RootBeanDefinition类型对象

2、合并BeanDefnition

AbstractBeanFactory类

package org.springframework.beans.factory.support;public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {// ...// 用于存放合并后的BeanDefinition, key为beanName,value为RootBeanDefinition对象private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<>(256);// 获取合并后的RootBeanDefinitionprotected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {// 先从集合中获取RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);// 已经合并过的直接返回if (mbd != null && !mbd.stale) {return mbd;}// 合并BeanDefinition,返回RootBeanDefinitionreturn getMergedBeanDefinition(beanName, getBeanDefinition(beanName));}// ...
}

如下图中所示,BeanDefinition已经合并

3、BeanFactoryPostProcessor的方法回调

AbstractApplicationContext类

package org.springframework.context.support;public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext {// ...// Spring容器启动的关键方法refresh()@Overridepublic void refresh() throws BeansException, IllegalStateException {// ...// 执行容器中的Bean工厂后置处理器invokeBeanFactoryPostProcessors(beanFactory);// ...}// ...
}

PostProcessorRegistrationDelegate类

package org.springframework.context.support;final class PostProcessorRegistrationDelegate {public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {// ...// 执行BeanDefinitionPostProcessor的postProcessBeanDefinitionRegistry方法invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);// 执行BeanDefinitionPostProcessor的postProcessBeanFactory方法invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);// 执行BeanFactory的postProcessBeanFactory方法invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);// ...}private static void invokeBeanDefinitionRegistryPostProcessors(Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {postProcessor.postProcessBeanDefinitionRegistry(registry);}}private static void invokeBeanFactoryPostProcessors(Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {for (BeanFactoryPostProcessor postProcessor : postProcessors) {postProcessor.postProcessBeanFactory(beanFactory);}}
}

4、BeanPostProcessor的注册

AbstractApplicationContext类

package org.springframework.context.support;public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext {// ...// Spring容器启动的关键方法refresh()@Overridepublic void refresh() throws BeansException, IllegalStateException {// ...// 注册Bean后置处理器registerBeanPostProcessors(beanFactory);// ...}// ...
}

PostProcessorRegistrationDelegate类

package org.springframework.context.support;final class PostProcessorRegistrationDelegate {public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {// ...// 添加Bean后置处理器到容器中registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);registerBeanPostProcessors(beanFactory, orderedPostProcessors);registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);registerBeanPostProcessors(beanFactory, internalPostProcessors);beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));// ...}// 向容器中添加BeanPostProcessorprivate static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {for (BeanPostProcessor postProcessor : postProcessors) {beanFactory.addBeanPostProcessor(postProcessor);}}
}

AbstractBeanFactory类

package org.springframework.beans.factory.support;public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {// ...// 用于存放容器中的Bean后置处理器的集合private final List<BeanPostProcessor> beanPostProcessors = new CopyOnWriteArrayList<>();// 执行添加BeanPostProcessor的逻辑@Overridepublic void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {// ...this.beanPostProcessors.remove(beanPostProcessor);if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {this.hasInstantiationAwareBeanPostProcessors = true;}if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {this.hasDestructionAwareBeanPostProcessors = true;}this.beanPostProcessors.add(beanPostProcessor);}// ...
}

5、执行InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation方法

AbstractApplicationContext类

package org.springframework.context.support;public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext {// ...// Spring容器启动的关键方法refresh()@Overridepublic void refresh() throws BeansException, IllegalStateException {// ...// 实例化所有剩余的非懒加载的单例BeanfinishBeanFactoryInitialization(beanFactory);// ...}protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// ...beanFactory.preInstantiateSingletons();}// ...
}

DefaultListableBeanFactory类

package org.springframework.beans.factory.support;public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {// ...@Overridepublic void preInstantiateSingletons() throws BeansException {// 获取所有的beanNameList<String> beanNames = new ArrayList<>(this.beanDefinitionNames);// Trigger initialization of all non-lazy singleton beans...// 遍历beanNamefor (String beanName : beanNames) {// ...// 获取合并后的RootBeanDefinitionRootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);// 非抽象&&单例的&&非懒加载的if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {// 调用getBean方法getBean(beanName);}// ...}}// ...
}

AbstractBeanFactory类

package org.springframework.beans.factory.support;public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {// ...@Overridepublic Object getBean(String name) throws BeansException {// 调用doGetBean方法return doGetBean(name, null, null, false);}protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {// ...if (mbd.isSingleton()) {// 参数一:beanName// 参数二:ObjectFactory函数式接口sharedInstance = getSingleton(beanName, () -> {try {return createBean(beanName, mbd, args);}catch (BeansException ex) {// ...}});// ...}// ...}// ...
}

DefaultSingletonBeanRegistry类

package org.springframework.beans.factory.support;public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {// 一级缓存private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);// 三级缓存private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);// 二级缓存private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);// ...public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory){// ...Assert.notNull(beanName, "Bean name must not be null");synchronized (this.singletonObjects) {// 先从一级缓存中获取bean对象Object singletonObject = this.singletonObjects.get(beanName);// 一级缓存中没有if (singletonObject == null) {try {// 这里执行传递过来的lambda表达式,也就是createBean方法singletonObject = singletonFactory.getObject();newSingleton = true;}catch (IllegalStateException ex) {// ....}}}// ...}}

ObjectFactory接口

package org.springframework.beans.factory;// 函数式接口
@FunctionalInterface
public interface ObjectFactory<T> {T getObject() throws BeansException;}

AbstractAutowireCapableBeanFactory类

package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...@Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {// ...try {// 执行BeanPostProcessor的实例化之前方法回调Object bean = resolveBeforeInstantiation(beanName, mbdToUse);if (bean != null) {return bean;}}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,"BeanPostProcessor before instantiation of bean failed", ex);}// ...}@Nullableprotected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {Object bean = null;// ...// 执行Bean实例化之前的方法bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);// ...}@Nullableprotected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {// 获取容器中的BeanPostProcessor集合,进行遍历for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;// 执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);if (result != null) {return result;}}}return null;}// ...
}

6、Bean的实例化

AbstractAutowireCapableBeanFactory类

package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...// 实例化BeanBeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}if (instanceWrapper == null) {instanceWrapper = createBeanInstance(beanName, mbd, args);}// ...}// ...
}

7、执行MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition方法

AbstractAutowireCapableBeanFactory类

package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...// 执行MergedBeanDefinitionPostProcessor方法applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);// ...}protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {// 获取容器中的BeanPostProcessor,遍历for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof MergedBeanDefinitionPostProcessor) {MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;// MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法回调bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);}}}// ...
}

8、Bean的属性填充

AbstractAutowireCapableBeanFactory类

package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...Object exposedObject = bean;try {// 填充属性populateBean(beanName, mbd, instanceWrapper);// ...}catch (Throwable ex) {// ...}// ...}protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {// ...// 执行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法回调(Bean实例化后的方法回调)if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {return;}}}}// 执行InstantiationAwareBeanPostProcessor的postProcessProperties方法回调// AutowiredAnnotationBeanPostProcessor对@Autowired、@Value注解的处理// CommonAnnotationBeanPostProcessor对@Resource注解的处理for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);// ...}}// ...}// ...
}

9、BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口对应的set方法回调

AbstractAutowireCapableBeanFactory类

package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...Object exposedObject = bean;try {//Bean的初始化exposedObject = initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {// ...}// ...}protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {// ...// 执行Aware接口的方法invokeAwareMethods(beanName, bean);// ...}private void invokeAwareMethods(final String beanName, final Object bean) {if (bean instanceof Aware) {// BeanNameAware的setBeanName方法回调if (bean instanceof BeanNameAware) {((BeanNameAware) bean).setBeanName(beanName);}// BeanClassLoaderAware的setBeanClassLoader方法回调if (bean instanceof BeanClassLoaderAware) {ClassLoader bcl = getBeanClassLoader();if (bcl != null) {((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);}}// BeanFactoryAware的setBeanFactory的方法回调if (bean instanceof BeanFactoryAware) {((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}}// ...
}

10、执行BeanPostProcessor#postProcessBeforeInitialization方法

AbstractAutowireCapableBeanFactory类

package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...Object exposedObject = bean;try {//Bean的初始化exposedObject = initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {// ...}// ...}protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {// ...// 执行BeanPostProcessor的初始化前方法回调Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}// ...}@Overridepublic Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;// 获取容器中的BeanPostProcessor,遍历for (BeanPostProcessor processor : getBeanPostProcessors()) {// 执行BeanPostProcessor的postProcessBeforeInitialization方法回调// 这里执行了CommonAnnotationBeanPostProcessor对@PostConstruct注解的处理Object current = processor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}// ...
}

11、执行InitializingBean#afterPropertiesSet方法

AbstractAutowireCapableBeanFactory类

package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...Object exposedObject = bean;try {//Bean的初始化exposedObject = initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {// ...}// ...}protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {// ...// 执行初始化方法invokeInitMethods(beanName, wrappedBean, mbd);// ...}protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)throws Throwable {boolean isInitializingBean = (bean instanceof InitializingBean);if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {// ...// 执行InitializingBean#afterPropertiesSet方法回调((InitializingBean) bean).afterPropertiesSet();}}// ...
}

12、执行BeanPostProcessor#postProcessAfterInitialization方法

AbstractAutowireCapableBeanFactory类

package org.springframework.beans.factory.support;public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactoryimplements AutowireCapableBeanFactory {// ...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// ...Object exposedObject = bean;try {//Bean的初始化exposedObject = initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {// ...}// ...}protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {// ...// 执行BeanPostProcessor初始化后的方法if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}// ...}@Overridepublic Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {// 执行BeanPostProcessor#postProcessAfterInitialization方法回调Object current = processor.postProcessAfterInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;}// ...
}

13、执行SmartInitializingSingleton#afterSingletonsInstantiated方法

SmartInitializingSingleton接口

package org.springframework.beans.factory;public interface SmartInitializingSingleton {void afterSingletonsInstantiated();
}

DefaultListableBeanFactory类

package org.springframework.beans.factory.support;public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {@Overridepublic void preInstantiateSingletons() throws BeansException {// ...List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);// 第一次遍历beanNames// ...// 第二次遍历beanNamesfor (String beanName : beanNames) {Object singletonInstance = getSingleton(beanName);if (singletonInstance instanceof SmartInitializingSingleton) {final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;// ...// 执行SmartInitializingSingleton#afterSingletonsInstantiated方法回调smartSingleton.afterSingletonsInstantiated();}}}    
}

http://www.lryc.cn/news/601453.html

相关文章:

  • 视频转GIF工具,一键批量制作高清动图
  • GIt学习——分布式版本控制工具
  • Triton IR
  • Python折线图
  • Java面试新趋势:云原生与新兴框架实战解析
  • 零基础学习性能测试第五章:Tomcat的性能分析与调优-Tomcat原理,核心配置项,性能瓶颈分析,调优
  • MySQL ROUTER安装部署
  • Java面试实战:安全框架与大数据技术深度解析
  • 深度解析 inaSpeechSegmenter:高效音频语音分割与检测开源工具
  • 基于 LSTM 与 SVM 融合的时间序列预测模型:理论框架与协同机制—实践算法(1)
  • maven命令详解
  • Redis C++客户端——命令使用
  • 《不只是接口:GraphQL与RESTful的本质差异》
  • Libevent(4)之使用教程(3)配置
  • PHP框架之Laravel框架教程:3. 数据库操作(简要)
  • net8.0一键创建支持(RabbitMQ)
  • 积分兑换小程序Java
  • Torchv Unstrustured 文档解析库
  • Matplotlib(二)- Matplotlib简单绘图
  • 在docker中安装frp实现内网穿透
  • 【数据结构与算法】数据结构初阶:详解排序(二)——交换排序中的快速排序
  • 【51单片机和数码管仿真显示问题共阴共阳代码】2022-9-24
  • 算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现
  • hackthebox-Pwn-Restaurant(ret2libc)
  • MySQL 8.4 Windows 版安装记录与步骤参考
  • STM32-USART串口实现接收数据三种方法(1.根据\r\n标志符、2.空闲帧中断、3.根据定时器辅助接收)
  • 数据结构第1问:什么是数据结构?
  • 三、构建一个Agent
  • 栈----5.柱状图中最大的矩形
  • RabbitMq 常用命令和REST API