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

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

相關文章

微信小程序實現圖片多點裁剪

話不多說&#xff0c;直接上代碼 1、頁面布局 <view class"buttons" style"height: 50px;"><view class"upload btn" style"background-color: #d18118;"bindtap"uploadImage"> 上傳圖片 </view><vie…

機器視覺項目流程和學習方法

機器視覺項目流程&#xff1a; 00001. 需求分析和方案建立 00002. 算法流程規劃和業務邏輯設計 00003. 模塊化編程和集成化實現 00004. 調試和優化&#xff0c;交付客戶及文檔 學習機器視覺的方法&#xff1a; 00001. 實戰學習&#xff0c;結合項目經驗教訓 00002. 學習…

c++參數傳遞

函數的參數傳遞 指的是形參與實參結合的過程&#xff0c;其基本方式包括值傳遞和引用傳遞兩種。 值傳遞 該方法把參數的實際值復制給函數的形式參數。在這種情況下&#xff0c;修改函數內的形式參數對實際參數沒有影響 #include<iostream> using namespace std;void swap…

NAS搭建指南二——影視資源中心

1. 刮削 這一部分是利用 tinyMediaManager 進行影視資源的評分、簡介以及圖片的搜集工作tinyMediaManager 官方網站地址下載及安裝過程&#xff1a;略我的主要修改的設置項如下所示&#xff1a; 使用方法&#xff1a; a. 點擊更新媒體庫 b. 選擇影片–>右鍵單擊–>…

時序預測 | MATLAB實現基于BiLSTM雙向長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價)

時序預測 | MATLAB實現基于BiLSTM雙向長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價) 目錄 時序預測 | MATLAB實現基于BiLSTM雙向長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價)預測結果基本介紹程序設計參考資料 預測結果 基本介紹 Matlab實現BiLST…

C++中的回調函數

1.普通函數作為回調函數 #include <iostream>void programA_FunA1() { printf("Iam ProgramA_FunA1 and be called..\n"); }void programA_FunA2() { printf("Iam ProgramA_FunA2 and be called..\n"); }void programB_FunB1(void (*callback)()) {…

年之年的選擇,組裝版

組件&#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 寄存器中的自動重載預裝載使能位 …

Go和Java實現中介者模式

Go和Java實現中介者模式 下面通過一個同事之間相互通信的例子來說明中介者模式的使用。 1、中介者模式 中介者模式是用來降低多個對象和類之間的通信復雜性。這種模式提供了一個中介類&#xff0c;該類通常處理不同類之間的 通信&#xff0c;并支持松耦合&#xff0c;使代碼…

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)在…

從零開始學Python(三)函數與lambda表達式

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下來看看由輝輝所寫的關于Python的相關操作吧 目錄 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.函數 1.函數與方法的區別 2.函數的定…

[PaddlePaddle] [學習筆記] [上] 計算機視覺(卷積、卷積核、卷積計算、padding計算、BN、縮放、平移、Dropout)

1. 計算機視覺的發展歷程 計算機視覺作為一門讓機器學會如何去“看”的學科&#xff0c;具體的說&#xff0c;就是讓機器去識別攝像機拍攝的圖片或視頻中的物體&#xff0c;檢測出物體所在的位置&#xff0c;并對目標物體進行跟蹤&#xff0c;從而理解并描述出圖片或視頻里的場…

深入解析 SOCKS5 代理及其在網絡安全與爬蟲中的應用

在當今數字化時代&#xff0c;網絡安全和數據獲取成為了互聯網時代的重要課題。為了實現安全的網絡連接和高效的數據采集&#xff0c;各種代理技術應運而生。本文將深入探討 SOCKS5 代理及其在網絡安全和爬蟲領域的應用&#xff0c;同時比較其與其他代理方式的優勢與劣勢。 1.…

TypeScript 語法

環境搭建 以javascript為基礎構建的語言&#xff0c;一個js的超集&#xff0c;可以在任何支持js的平臺中執行&#xff0c;ts擴展了js并且添加了類型&#xff0c;但是ts不能被js解析器直接執行&#xff0c;需要編譯器編譯為js文件&#xff0c;然后引入到 html 頁面使用。 ts增…