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.pswp.cn/diannao/93065.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93065.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93065.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

搜狐新聞直播間適配HarmonyOs實現點贊動畫

01背景介紹隨著新聞客戶端鴻蒙單框架系統適配工作的推進&#xff0c;從原來的基礎功能到現在已經適配全功能的85%以上。與此同時&#xff0c;我們也在持續深入挖掘鴻蒙系統的特性&#xff0c;以提升整體應用的質量與用戶體驗。在這一過程中&#xff0c;動畫作為增強交互與視覺體…

83、設置有人DTU設備USR-M100采集傳感器數據,然后上傳阿里云服務

基本思想:設置M100 采集傳感器數據 一、首先將DTU設備USR-M100連接路由器上,然后使用python代碼搜索同一局域網設備, import platform import sys import os import time import threadinglive_ip = 0def get_os():os = platform.system()if os == "Windows":re…

P1019 [NOIP 2000 提高組] 單詞接龍

題目描述單詞接龍是一個與我們經常玩的成語接龍相類似的游戲&#xff0c;現在我們已知一組單詞&#xff0c;且給定一個開頭的字母&#xff0c;要求出以這個字母開頭的最長的“龍”&#xff08;每個單詞都最多在“龍”中出現兩次&#xff09;&#xff0c;在兩個單詞相連時&#…

詳解力扣高頻SQL50題之1633. 各賽事的用戶注冊率【簡單】

傳送門&#xff1a;1633. 各賽事的用戶注冊率 題目 用戶表&#xff1a; Users -------------------- | Column Name | Type | -------------------- | user_id | int | | user_name | varchar | -------------------- user_id 是該表的主鍵(具有唯一值的列)。 該表中的每行包…

FROM stakater/java8-alpine 構建cocker鏡像

在 Dockerfile 中&#xff0c;FROM stakater/java8-alpine 是第一條也是最核心的指令&#xff0c;它定義了構建新鏡像所基于的「基礎鏡像」。以下是逐層解析&#xff1a;&#x1f50d; 關鍵字拆解 1. FROM —— 起點指令 ? 作用&#xff1a;聲明當前鏡像的起點&#xff08;父鏡…

Word2Vec模型訓練全流程解析:從數據預處理到實體識別應用

請添加圖片描述 訓練Word2Vec模型 概述 問題 我們如何訓練Word2Vec模型&#xff1f;在特定數據集上訓練Word2Vec模型何時是有利的&#xff1f; 目標 理解在自有數據上訓練Word2Vec模型而非使用預訓練模型的優勢 Colab環境配置 運行以下代碼以啟用輔助函數并重新讀取數據…

在Ubuntu上使用QEMU學習RISC-V程序(2)gdb調試

文章目錄一、準備工作二、基本調試流程1. 設置斷點2. 執行程序3. 查看源代碼/匯編三、查看寄存器1. 查看通用寄存器2. 查看特殊寄存器四、查看內存1. 內存查看命令2. 內存修改命令五、調試實戰示例六、高級調試技巧1. 條件斷點2. 自動顯示3. 內存斷點&#xff08;觀察點&#x…

不止于“亮”:一盞智慧路燈的技術進化史——塔能科技用“落地性”定義行業標準

在凌晨3點的園區道路之上&#xff0c;路燈會隨著車輛的靠近而自動亮起&#xff0c;待車輛逐漸遠去之后&#xff0c;又會緩緩地調暗下來&#xff1b;當電纜意外被觸碰的時候&#xff0c;系統能夠在短短3秒之內自動發出報警信息&#xff0c;并且推送出維修工單&#xff1b;而當一…

Redis的String數據類型底層實現

redis就是用c語言寫&#xff0c;但redis的string并沒有直接用c語言的string&#xff0c;而是自己搞了一個 SDS 結構體來表示字符串。SDS 的全稱是 Simple Dynamic String&#xff0c;中文叫做“簡單動態字符串”。想知道為什么這么做&#xff0c;我們先看看c語言的string是什么…

【音視頻學習】四、深入解析視頻技術中的YUV數據存儲方式:從原理到實踐

文章目錄 引言 1. YUV 基礎:為什么它比 RGB 更適合視頻? 1.1 YUV 與 RGB 的核心區別 1.2 YUV色度下采樣簡介 2. YUV 的三大存儲方式 方式一:平面格式(Planar) 方式二:半平面格式(Semi-Planar ) 方式三:打包格式(Packed YUV) 三種存儲方式對比: 3. 如何選擇合適的 Y…

前端項目組成

一、前端項目常見模塊及功能&#xff08;以 Vue/React 通用結構為例&#xff09; 前端項目的模塊本質是「按功能拆分的代碼文件/文件夾」&#xff0c;就像蓋房子的「磚、梁、窗」各司其職&#xff1a;模塊類型功能說明&#xff08;大白話&#xff09;舉個例子pages&#xff08;…

聚觀早報 | 猿編程推動中美青少年AI實踐;華為Pura 80數字版售價公布;iPhone 17 Air電池曝光

聚觀早報每日整理最值得關注的行業重點事件&#xff0c;幫助大家及時了解最新行業動態&#xff0c;每日讀報&#xff0c;就讀聚觀365資訊簡報。整理丨肖羽7月24日消息猿編程推動中美青少年AI實踐華為Pura 80數字版售價公布iPhone 17 Air電池曝光亞馬遜收購AI初創公司Bee蜂巢半固…

unittest 案例執行順序詳解

unittest 案例執行順序詳解在 unittest 框架中&#xff0c;測試用例的執行順序有默認規則&#xff0c;也可通過自定義方式調整。以下是具體說明&#xff1a;一、默認執行順序規則unittest 對測試用例的執行順序遵循 “按測試方法名的 ASCII 碼排序” 原則&#xff0c;具體邏輯如…

【web大前端】001_前端開發入門:創建你的第一個網頁

前端開發入門&#xff1a;創建你的第一個網頁 在當今數字化時代&#xff0c;網頁已經成為人們獲取信息和交流的重要平臺。對于想要學習編程的人來說&#xff0c;前端開發往往是一個不錯的起點。本文將帶你通過簡單的兩步&#xff0c;創建屬于你的第一個網頁程序。 點擊這里去…

HTTP性能優化終極指南:從協議原理到企業級實踐

前言&#xff1a;為什么性能優化是Web開發的生命線&#xff1f;根據Google研究數據&#xff0c;當頁面加載時間從1秒增加到3秒時&#xff0c;跳出率提升32%&#xff1b;當達到5秒時&#xff0c;轉化率下降90%。本文將通過七層優化體系&#xff0c;帶您掌握HTTP性能優化的核心技…

Python 數據分析(二):Matplotlib 繪圖

目錄 1. 簡介2. 繪圖 2.1 折線圖 2.1.1 單線2.1.2 多線2.1.3 子圖 2.2 散點圖2.3 直方圖2.4 條形圖 2.4.1 縱置2.4.2 橫置2.4.3 多條 2.5 餅圖 1. 簡介 Matplotlib 是 Python 提供的一個繪圖庫&#xff0c;通過該庫我們可以很容易的繪制出折線圖、直方圖、散點圖、餅圖等豐…

Scrapy分布式爬蟲數據統計全棧方案:構建企業級監控分析系統

引言&#xff1a;數據統計在分布式爬蟲中的戰略價值在分布式爬蟲系統中&#xff0c;??數據統計與分析??是系統優化的核心驅動力。根據2023年爬蟲工程調查報告&#xff1a;實施專業統計方案的爬蟲系統性能提升??40%以上??數據驅動的優化策略可減少??70%??的資源浪費…

計劃任務(at和cron命令介紹及操作)

簡介計劃任務主要做一些周期性的任務&#xff0c;目前最主要的是定期備份數據分類at&#xff1a;一次性調度執行cron&#xff1a;循環調度執行at簡介at 是一個用于安排一次性任務的命令行工具&#xff0c;適合在指定時間點執行單次任務語法at 時間 選項若要提交&#xff0c;通過…

[2025CVPR:圖象合成、生成方向]WF-VAE:通過小波驅動的能量流增強視頻 VAE 的潛在視頻擴散模型

論文概述? 這篇論文提出了一種名為WF-VAE(Wavelet Flow VAE)?的新型視頻變分自編碼器(Video VAE),旨在解決潛在視頻擴散模型(LVDM)中的關鍵瓶頸問題,包括高計算成本和潛在空間不連續性。WF-VAE利用小波變換(Wavelet Transform)來分解視頻信號,并通過能量流路徑優…

Map接口-實現類HashMap

目錄 一、什么是Map&#xff1f; 二、實現類HashMap 1.關鍵特點 無序、key唯一、value允許重復、key和value允許為null。 2.數據結構 2.1 JDK 1.7 2.2 JDK 1.8 2.3 關鍵參數 2.4 關鍵計算 3.擴容方式 3.1 初始化 3.2 擴容 4.常見方法 4.1 根據key存入value 4.2 …