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

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.xdnf.cn/news/16497.html

相关文章:

  • Android MQTT 长连接最佳实践技术分享
  • Amazon Relational Database Service (Amazon RDS)入门课
  • C++ 构造函数中阻止资源泄漏的实践探索
  • Linux驱动20 --- FFMPEG视频API
  • 【 Python 】Collections库权威指南
  • 【多模态】天池AFAC赛道四-智能体赋能的金融多模态报告自动化生成part1-数据获取
  • 卫星图像数据集在农业领域的应用
  • Leetcode力扣解题记录--第136题(查找单数)
  • Redis C++客户端——命令使用
  • Vue 框架 学习笔记
  • 9-大语言模型—Transformer 核心:多头注意力的 10 步拆解与可视化理解
  • 【在Unity游戏开发中Dictionary、List介绍】
  • MongoDB索引及其原理
  • 2025 DevOps开源工具全景指南:构建面向未来的智能交付体系
  • 代码随想录训练因第三十天| 39.组合总和 40.组合总和ll 131.分割回文串
  • PyTorch武侠演义 第一卷:初入江湖 第7章:矿洞中的计算禁制
  • 链表算法综合——重排链表
  • 望言OCR视频字幕提取2025终极评测:免费版VS专业版提全方位对比(含免费下载)
  • 重生之我在暑假学习微服务第二天《MybatisPlus-下篇》
  • 主要分布于内侧内嗅皮层的层Ⅲ的边界向量细胞(BVCs)对NLP中的深层语义分析的积极影响和启示
  • @RefreshScope 核心原理深度解析:Spring Boot 的动态魔法
  • Node.js特训专栏-配置与环境部署:20.PM2进程守护与负载均衡
  • Rust Web 全栈开发(十一):WebAssembly 尝鲜
  • 数学建模——模糊综合评价
  • 【C语言网络编程基础】TCP 服务器详解
  • java8+springboot2.5.4环境Markdwon转word
  • SecureCRT连接密钥交换失败
  • Sql server开挂的OPENJSON
  • fchdir系统调用及示例
  • Git+宝塔面板部署Hugo博客