Mr. Cappuccino的第62杯咖啡——Spring之Bean的生命周期

Spring之Bean的生命周期

    • Aware接口
      • 项目结构
      • 项目代码
      • 运行结果
      • 源代码
      • 使用场景
    • InitializingBean接口
      • 项目结构
      • 项目代码
      • 运行结果
      • 源代码
    • BeanFactoryPostProcessor接口
      • 项目结构
      • 项目代码
      • 运行结果
      • 源代码
    • Bean的生命周期
      • 项目结构
      • 项目代码
      • 运行结果
      • 源代码

Aware接口

实现Aware接口是为了bean能获取某些信息、感知某些信息。Aware自身是一个空的接口,Spring提供了很多它的实现接口,开发者实现这些已有的接口就能获取特定的一些信息。

Spring提供了一些Aware接口的实现接口:
ApplicationContextAware、ApplicationEventPublisherAware、BeanClassLoaderAware、BeanFactoryAware、BeanNameAware、EmbeddedValueResolverAware、EnvironmentAware、ImportAware、LoadTimeWeaverAware、MessageSourceAware、NotificationPublisherAware、ResourceLoaderAware

项目结构

在这里插入图片描述

项目代码

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com</groupId><artifactId>spring-bean-life-cycle</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.1.RELEASE</version></dependency></dependencies></project>

AwareBean.java

package com.spring.bean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;/*** @author honey* @date 2023-08-13 16:08:02*/
public class AwareBean implements BeanNameAware, BeanClassLoaderAware, ApplicationContextAware {private String beanName;private ClassLoader classLoader;private ApplicationContext applicationContext;@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {this.classLoader = classLoader;}@Overridepublic void setBeanName(String beanName) {this.beanName = beanName;}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}public String getBeanName() {return beanName;}public ClassLoader getClassLoader() {return classLoader;}public ApplicationContext getApplicationContext() {return applicationContext;}
}

SpringTest01.java

package com.spring.test;import com.spring.bean.AwareBean;
import org.springframework.context.support.GenericApplicationContext;/*** @author honey* @date 2023-08-13 16:43:37*/
public class SpringTest01 {public static void main(String[] args) {GenericApplicationContext applicationContext = new GenericApplicationContext();applicationContext.registerBean("awareBean", AwareBean.class);applicationContext.refresh();AwareBean awareBean = applicationContext.getBean("awareBean", AwareBean.class);System.out.println("beanName:" + awareBean.getBeanName());System.out.println("classLoader:" + awareBean.getClassLoader());System.out.println("applicationContext:" + awareBean.getApplicationContext());applicationContext.close();}
}

运行结果

在这里插入图片描述

源代码


使用invokeAwareMethods方法处理部分Aware实现接口

AbstractApplicationContext.java

在这里插入图片描述

在这里插入图片描述

DefaultListableBeanFactory.java

在这里插入图片描述

AbstractBeanFactory.java

在这里插入图片描述

在这里插入图片描述

AbstractAutowireCapableBeanFactory.java

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


使用Bean对象后置处理器(ApplicationContextAwareProcessor)处理部分Aware实现接口

AbstractApplicationContext.java

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

从AbstractApplicationContext类的finishBeanFactoryInitialization方法一直进入到AbstractAutowireCapableBeanFactory类的initializeBean方法,具体跳转步骤此处省略,可参照上面的跳转步骤

AbstractAutowireCapableBeanFactory.java

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ApplicationContextAwareProcessor.java

在这里插入图片描述

在这里插入图片描述


使用场景

SpringContextUtils.java

package com.bubble.core.util;import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.stereotype.Component;/*** Spring上下文工具类** @author honey* @date 2021-09-21 18:27:54*/
@Component
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class SpringContextUtils implements ApplicationContextAware {private static ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {context = applicationContext;}public static ApplicationContext getApplicationContext() {return context;}public static <T> T getBean(String s, Class<T> clazz) {return context.getBean(s, clazz);}public static Boolean containsBean(String s) {return context.containsBean(s);}public static Boolean containsBean(Class<?> clazz) {String first = clazz.getSimpleName().substring(0, 1).toLowerCase();String after = clazz.getSimpleName().substring(1);return context.containsBean(first + after);}public static <T> T getBean(Class<T> clazz) {return context.getBean(clazz);}public static void publishEvent(ApplicationEvent event) {context.publishEvent(event);}
}

InitializingBean接口

InitializingBean接口为bean对象提供了初始化方法,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。

Spring为bean对象提供了三种初始化方式:
1.在bean对象中实现InitializingBean接口;
2.使用@Bean注解注入bean对象时指定initMethod属性;
3.在bean对象的方法上使用@PostConstruct注解;

实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率要高一点,但是init-method方式消除了对spring的依赖。如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。

@PostConstruct通过Bean对象后置处理器(CommonAnnotationBeanPostProcessor)实现,InitializingBean和@Bean通过IOC工厂(BeanFactory)实现。

项目结构

在这里插入图片描述

项目代码

InitBean.java

package com.spring.bean;import org.springframework.beans.factory.InitializingBean;import javax.annotation.PostConstruct;/*** @author honey* @date 2023-08-13 18:41:58*/
public class InitBean implements InitializingBean {@Overridepublic void afterPropertiesSet() {System.out.println("InitBean 调用afterPropertiesSet()");}@PostConstructpublic void init(){System.out.println("InitBean 调用init()");}public void initMethod(){System.out.println("InitBean 调用initMethod()");}
}

SpringConfig.java

package com.spring.config;import com.spring.bean.InitBean;
import org.springframework.context.annotation.Bean;/*** @author honey* @date 2023-08-13 18:52:09*/
public class SpringConfig {@Bean(initMethod = "initMethod")public InitBean initBean() {return new InitBean();}
}

SpringTest02.java

package com.spring.test;import com.spring.bean.InitBean;
import com.spring.config.SpringConfig;
import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
import org.springframework.context.annotation.ConfigurationClassPostProcessor;
import org.springframework.context.support.GenericApplicationContext;/*** @author honey* @date 2023-08-13 18:48:22*/
public class SpringTest02 {public static void main(String[] args) {GenericApplicationContext applicationContext = new GenericApplicationContext();applicationContext.registerBean("springConfig", SpringConfig.class);applicationContext.registerBean(CommonAnnotationBeanPostProcessor.class);applicationContext.registerBean(ConfigurationClassPostProcessor.class);applicationContext.refresh();InitBean initBean = applicationContext.getBean("initBean", InitBean.class);System.out.println("InitBean " + initBean);applicationContext.close();}
}

运行结果

在这里插入图片描述

源代码


@PostConstruct通过Bean对象后置处理器(CommonAnnotationBeanPostProcessor)实现,底层使用反射技术。

AbstractAutowireCapableBeanFactory.java

在这里插入图片描述

CommonAnnotationBeanPostProcessor.java

在这里插入图片描述

InitDestroyAnnotationBeanPostProcessor.java

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


InitializingBean通过IOC工厂(BeanFactory)实现,底层没有使用反射技术。

AbstractAutowireCapableBeanFactory.java

在这里插入图片描述

在这里插入图片描述


@Bean通过IOC工厂(BeanFactory)实现,底层使用反射技术。

AbstractAutowireCapableBeanFactory.java

在这里插入图片描述

在这里插入图片描述


BeanFactoryPostProcessor接口

实现BeanFactoryPostProcessor接口,可以在Spring的bean创建之前,修改bean的定义属性。也就是说,Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。可以同时配置多个BeanFactoryPostProcessor,并通过设置’order’属性来控制各个BeanFactoryPostProcessor的执行次序。
注意:BeanFactoryPostProcessor是在Spring容器加载了bean的定义文件之后,在bean实例化之前执行的。接口方法的入参是ConfigurrableListableBeanFactory。

ConfigurationClassPostProcessor:主要用于处理配置类,使@Bean、@Import、@ComponentScan等注解生效。

项目结构

在这里插入图片描述

项目代码

UserBean.java

package com.spring.bean;/*** @author honey* @date 2023-08-14 01:02:08*/
public class UserBean {private String name = "Faker";public String getName() {return name;}public void setName(String name) {this.name = name;}
}

MyBeanFactoryPostProcessor.java

package com.spring.processor;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;/*** @author honey* @date 2023-08-14 01:00:25*/
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// 修改bean对象的属性值BeanDefinition userBean = beanFactory.getBeanDefinition("userBean");userBean.getPropertyValues().addPropertyValue("name", "Honey");}
}

SpringTest03.java

package com.spring.test;import com.spring.bean.UserBean;
import com.spring.processor.MyBeanFactoryPostProcessor;
import org.springframework.context.support.GenericApplicationContext;/*** @author honey* @date 2023-08-14 01:04:16*/
public class SpringTest03 {public static void main(String[] args) {GenericApplicationContext applicationContext = new GenericApplicationContext();applicationContext.registerBean("userBean", UserBean.class);applicationContext.registerBean(MyBeanFactoryPostProcessor.class);applicationContext.refresh();UserBean userBean = applicationContext.getBean("userBean", UserBean.class);System.out.println("userBean name:" + userBean.getName());applicationContext.close();}
}

运行结果

在这里插入图片描述

源代码


调用BeanFactoryPostProcessor接口的postProcessBeanFactory方法

AbstractApplicationContext.java

在这里插入图片描述

在这里插入图片描述

PostProcessorRegistrationDelegate.java

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


修改bean对象的属性值

AbstractApplicationContext.java

在这里插入图片描述

具体跳转步骤此处省略

AbstractAutowireCapableBeanFactory.java

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


Bean的生命周期

Spring bean的生命周期主要包含四个阶段:实例化 Instantiation --> 属性赋值 Populate --> 初始化 Initialization --> 销毁 Destruction

Spring bean的生命周期核心代码:AbstractBeanFactory#getBean()

  1. 实例化Bean对象,执行构造方法;
  2. 属性赋值,对Bean对象中的属性进行赋值,如在Bean对象中使用@Autowired注解实现依赖注入以及通过BeanFactoryPostProcessor修改Bean对象中的属性值;
  3. 初始化阶段,执行Bean对象中Aware相关接口的实现方法;
  4. 初始化阶段,执行BeanPostProcessor#postProcessBeforeInitialization(),在初始化方法之前执行;
  5. 初始化阶段,执行初始化方法;
  6. 初始化阶段,执行BeanPostProcessor#postProcessAfterInitialization(),在初始化方法之后执行;
  7. 销毁Bean对象;
  1. 实例化Bean对象,当客户向容器请求一个尚未初始化的Bean对象时,或初始化Bean对象的时候需要注入另一个尚末初始化的依赖时,容器就会调用doCreateBean()方法进行实例化,实际上就是通过反射的方式创建出一个bean对象;
  2. Bean对象的实例创建完成后,接着就是给这个Bean对象进行属性填充,也就是注入这个Bean依赖的其它Bean对象;
  3. 属性填充完成后,初始化Bean对象,初始化阶段又可以分为几个步骤:
    3.1. 执行Bean对象中Aware相关接口的实现方法;
    3.2. Spring会检测Bean对象是否实现了xxxAware接口,通过Aware类型的接口,可以让我们拿到Spring容器的某些资源。如实现BeanNameAware接口可以获取到BeanName,实现BeanFactoryAware接口可以获取到BeanFactory等等;
    3.3. 执行BeanPostProcessor的前置处理方法postProcessBeforeInitialization(),对Bean进行一些自定义的前置处理;
    3.4. 判断Bean是否实现了InitializingBean接口,如果实现了则会执行InitializingBean的afterPropertiesSet()进行初始化;
    3.5. 执行用户自定义的初始化方法,如init-method等;
    3.6. 执行BeanPostProcessor的后置处理方法postProcessAfterInitialization() ,对Bean进行一些自定义的后置处理;
  4. 初始化完成后,Bean对象就成功创建了,之后就可以使用这个Bean对象, 当Bean对象不再需要时,则会进行销毁操作;
    4.1. 首先判断Bean对象是否实现了DestructionAwareBeanPostProcessor接口,如果实现了则会执行DestructionAwareBeanPostProcessor后置处理器的销毁回调方法;
    4.2. 其次会判断Bean对象是否实现了DisposableBean接口,如果实现了将会调用其实现的destroy()方法;
    4.3. 最后判断这个Bean是否配置了dlestroy-method等自定义的销毁方法,如果是则会自动调用其配置的销毁方法;

项目结构

在这里插入图片描述

项目代码

AutowireBean.java

package com.spring.bean;/*** @author honey* @date 2023-08-14 01:48:12*/
public class AutowireBean {
}

LifeCycleBean.java

package com.spring.bean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;/*** @author honey* @date 2023-08-14 01:47:44*/
public class LifeCycleBean implements BeanNameAware, BeanClassLoaderAware, ApplicationContextAware, InitializingBean, DisposableBean {private String name;public LifeCycleBean() {System.out.println("1.执行无参构造方法");System.out.println("LifeCycleBean 执行LifeCycleBean()");}@Autowiredpublic void setAutowireBean(AutowireBean autowireBean) {System.out.println("2.设置对象属性");System.out.println("LifeCycleBean 执行setAutowireBean() autowireBean = " + autowireBean);}public void setName(String name) {System.out.println("2.设置对象属性");System.out.println("LifeCycleBean 执行setName() name = " + name);this.name = name;}@Overridepublic void setBeanName(String name) {System.out.println("3.执行Aware接口中的方法");System.out.println("LifeCycleBean 执行setBeanName()");}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println("3.执行Aware接口中的方法");System.out.println("LifeCycleBean 执行setBeanClassLoader()");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("3.执行Aware接口中的方法");System.out.println("LifeCycleBean 执行setApplicationContext()");}@Overridepublic void afterPropertiesSet() {System.out.println("5.执行初始化方法");System.out.println("LifeCycleBean 执行afterPropertiesSet()");}@PostConstructpublic void postConstruct() {System.out.println("5.执行初始化方法");System.out.println("LifeCycleBean 执行postConstruct()");}public void initMethod() {System.out.println("5.执行初始化方法");System.out.println("LifeCycleBean 执行initMethod()");}@Overridepublic void destroy() {System.out.println("7.执行销毁方法");System.out.println("LifeCycleBean 执行destroy()");}@PreDestroypublic void preDestroy() {System.out.println("7.执行销毁方法");System.out.println("LifeCycleBean 执行preDestroy()");}public String getName() {return name;}
}

LifeCycBeanFactoryPostProcessor.java

package com.spring.processor;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;/*** @author honey* @date 2023-08-14 02:13:45*/
public class LifeCycBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// 修改bean对象的属性值BeanDefinition userBean = beanFactory.getBeanDefinition("lifeCycleBean");userBean.getPropertyValues().addPropertyValue("name", "Honey");}
}

LifeCycleBeanPostProcessor.java

package com.spring.processor;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;/*** @author honey* @date 2023-08-14 02:01:57*/
public class LifeCycleBeanPostProcessor implements BeanPostProcessor {private final String beanName = "lifeCycleBean";@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (this.beanName.equals(beanName)) {System.out.println("4.bean对象后置处理器初始化方法之前执行");System.out.println("LifeCycleBean 执行postProcessBeforeInitialization()");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (this.beanName.equals(beanName)) {System.out.println("6.bean对象后置处理器初始化方法之后执行");System.out.println("LifeCycleBean 执行postProcessAfterInitialization()");}return bean;}
}

SpringConfig02.java

package com.spring.config;import com.spring.bean.AutowireBean;
import com.spring.bean.LifeCycleBean;
import com.spring.processor.LifeCycBeanFactoryPostProcessor;
import com.spring.processor.LifeCycleBeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;/*** @author honey* @date 2023-08-14 02:17:17*/
@Import({LifeCycBeanFactoryPostProcessor.class, LifeCycleBeanPostProcessor.class})
public class SpringConfig02 {@Bean(initMethod = "initMethod")public LifeCycleBean lifeCycleBean() {return new LifeCycleBean();}@Beanpublic AutowireBean autowireBean() {return new AutowireBean();}
}

SpringTest04.java

package com.spring.test;import com.spring.bean.LifeCycleBean;
import com.spring.config.SpringConfig02;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** @author honey* @date 2023-08-14 02:15:22*/
public class SpringTest04 {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig02.class);LifeCycleBean lifeCycleBean = applicationContext.getBean("lifeCycleBean", LifeCycleBean.class);System.out.println("-----------------------------------");System.out.println("LifeCycleBean " + lifeCycleBean);System.out.println("-----------------------------------");applicationContext.close();}
}

运行结果

在这里插入图片描述

源代码

AbstractBeanFactory.java

在这里插入图片描述
在这里插入图片描述

AbstractAutowireCapableBeanFactory.java

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/35598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器视觉项目流程和学习方法

机器视觉项目流程&#xff1a; 00001. 需求分析和方案建立 00002. 算法流程规划和业务逻辑设计 00003. 模块化编程和集成化实现 00004. 调试和优化&#xff0c;交付客户及文档 学习机器视觉的方法&#xff1a; 00001. 实战学习&#xff0c;结合项目经验教训 00002. 学习…

NAS搭建指南二——影视资源中心

1. 刮削 这一部分是利用 tinyMediaManager 进行影视资源的评分、简介以及图片的搜集工作tinyMediaManager 官方网站地址下载及安装过程&#xff1a;略我的主要修改的设置项如下所示&#xff1a; 使用方法&#xff1a; a. 点击更新媒体库 b. 选择影片–>右键单击–>…

时序预测 | MATLAB实现基于BiLSTM双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于BiLSTM双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于BiLSTM双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 Matlab实现BiLST…

年之年的选择,组装版

组件&#xff1a;<!--* Author: liuyu liuyuxizhengtech.com* Date: 2023-02-01 16:57:27* LastEditors: wangping wangpingxizhengtech.com* LastEditTime: 2023-06-30 17:25:14* Description: 时间选择年 - 年 --> <template><div class"year-range-pick…

04.利用Redis国逻辑过期实现缓存功能---解决缓存击穿

学习目标&#xff1a; 提示&#xff1a;学习如何利用Redis逻辑过期实现添加缓存功能解决缓存击穿 学习产出&#xff1a; 缓存击穿讲解图&#xff1a; 解决方案&#xff1a; 采用互斥锁采用逻辑过期 1. 准备pom环境 <dependency><groupId>org.springframework…

⑤ Axios网络请求

Axios安装 cnpm install --save axios post请求需要用到的&#xff1a; cnpm install --save querystring(用来转换格式的) 引入 一般是全局引入&#xff0c;在main.js中引入 全局引入后的get和post方式使用 get请求方式 post请求方式 先引入&#xff1a; axios封装…

STM32 定时器自动重装载寄存器ARR带来的影响,ARPE0和1区别

ARR是啥 自动重载寄存器是预装载的。对自动重载寄存器执行写入或读取操作时会访问预装载寄存器。预装载寄存器的内容既可以直接传送到影子寄存器&#xff0c;也可以在每次发生更新事件 (UEV) 时传送到影子寄存器&#xff0c;这取决于 TIMx_CR1 寄存器中的自动重载预装载使能位 …

1.作用域

1.1局部作用域 局部作用域分为函数作用域和块作用域。 1.函数作用域: 在函数内部声明的变量只能在函数内部被访问&#xff0c;外部无法直接访问。 总结&#xff1a; (1)函数内部声明的变量&#xff0c;在函数外部无法被访问 (2)函数的参数也是函数内部的局部变量 (3)不同函数…

Redis——三个特殊的数据类型+事务

概述 全称为远程字典服务。 Redis——基础篇(包含redis在云服务上的docker化安装和连接以及常用命令)_连接docker中的redis_北岭山脚鼠鼠的博客-CSDN博客 Redis能干什么&#xff1f; 1.内存存储、持久化&#xff0c;内存中是断电即失&#xff0c;因此持久化很重要&#xff…

【LVS-NAT配置】

配置 node1&#xff1a;128&#xff08;客户端&#xff09; node2&#xff1a;135&#xff08;调度器&#xff09; RS&#xff1a; node3&#xff1a;130 node4&#xff1a;132 node2添加网络适配器&#xff08;仅主机模式&#xff09; [rootnode2 ~]# nmtui[rootnode2 ~]#…

ETLCloud+MaxCompute实现云数据仓库的高效实时同步

MaxCompute介绍 MaxCompute是适用于数据分析场景的企业级SaaS&#xff08;Software as a Service&#xff09;模式云数据仓库&#xff0c;以Serverless架构提供快速、全托管的在线数据仓库服务&#xff0c;消除了传统数据平台在资源扩展性和弹性方面的限制&#xff0c;最小化用…

欧拉公式之证明

首先&#xff0c;我们考虑复数函数的泰勒级数展开式。对于任意一个复数函数f(z)&#xff0c;我们可以将其在za处进行泰勒级数展开&#xff1a; f(z) f(a) f(a)(z-a) f(a)(z-a)^2/2! f(a)(z-a)^3/3! ... 其中f(a)表示f(z)在za处的导数&#xff0c;f(a)表示f(z)在…

[PaddlePaddle] [学习笔记] [上] 计算机视觉(卷积、卷积核、卷积计算、padding计算、BN、缩放、平移、Dropout)

1. 计算机视觉的发展历程 计算机视觉作为一门让机器学会如何去“看”的学科&#xff0c;具体的说&#xff0c;就是让机器去识别摄像机拍摄的图片或视频中的物体&#xff0c;检测出物体所在的位置&#xff0c;并对目标物体进行跟踪&#xff0c;从而理解并描述出图片或视频里的场…

TypeScript 语法

环境搭建 以javascript为基础构建的语言&#xff0c;一个js的超集&#xff0c;可以在任何支持js的平台中执行&#xff0c;ts扩展了js并且添加了类型&#xff0c;但是ts不能被js解析器直接执行&#xff0c;需要编译器编译为js文件&#xff0c;然后引入到 html 页面使用。 ts增…

04 mysql innodb record

前言 最近看到了 何登成 大佬的 "深入MySQL源码 -- Step By Step" 的 pdf 呵呵 似乎是找到了一些 方向 之前对于 mysql 方面的东西, 更多的仅仅是简单的使用[业务中的各种增删改查], 以及一些面试题的背诵 这里会参照 MySQL Internals Manual 来大致的看一下 i…

通过matlab对比music,mvdr以及tdoa三种定位算法的性能

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 MUSIC&#xff08;Multiple Signal Classification&#xff09; 4.2 MVDR&#xff08;Minimum Variance Distortionless Response&#xff09; 4.3 TDOA&#xff08;Time Difference o…

开发一个RISC-V上的操作系统(七)—— 硬件定时器(Hardware Timer)

目录 往期文章传送门 一、硬件定时器 硬件实现 软件实现 二、上板测试 往期文章传送门 开发一个RISC-V上的操作系统&#xff08;一&#xff09;—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统&#xff08;二&#xff09;—— 系统引导…

AD域机器KMS自动激活

1、打开AD域控&#xff0c;点击DNS管理 2、创建其它记录 3、选择服务位置 SRV 4、输入相关信息 服务&#xff1a;_VLMCS协议&#xff1a;_TCP权重&#xff1a;100端口号&#xff1a;1688KMS服务器地址&#xff1a;10.3.0.211 5、成功&#xff0c;这时域内主机重启后&#xff0…

腾讯云CVM服务器2核2g1m带宽支持多少人访问?

腾讯云2核2g1m的服务器支持多少人同时访问&#xff1f;2核2g1m云服务器短板是在1M公网带宽上&#xff0c;腾讯云服务器网以网站应用为例&#xff0c;当大规模用户同时访问网站时&#xff0c;很大概率会卡在公网带宽上&#xff0c;所以压根就谈不上2核2G的CPU内存计算性能是否够…

烧写PYNQ镜像到SD卡

一&#xff0c;安装 Win32diskimager 首先将Micro SD卡插入读卡器的卡槽中&#xff0c;然后再将读卡器插入计算机USB接口&#xff0c;此时计算机将会识别到插入的可移动磁盘。双击打开Win32DiskImager-1.0.0.zip 压缩文件&#xff0c;里面win32diskimager-1.0.0-install.exe文…