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

技术面:Spring (bean的生命周期、创建方式、注入方式、作用域)

Spring Bean的生命周期是什么样的?

在Spring容器里一个Bean的从创建到销毁一般都是经历了以下几个阶段:
定义阶段(Bean元信息配置)=>实例化阶段(创建Bean对象)=>初始化阶段(执行初始化逻辑)=>使用阶段(Bean可用)=>销毁阶段(释放资源)
Spring bean的生命周期

定义阶段(BeanDefinition解析)

Spring通过配置(XML、注解、Java配置)解析Bean的元数据,生成BeanDefinition对象
BeanDefinition存储了Bean的类名、作用域(scope)、依赖项(depends-on)、初始化方法、销毁方法等元数据。
所有BeanDefinition存储在容器的BeanDefinitionMap(一个HashMap)中,键为Bean名称,值为BeanDefinition对象。
解析器:

  • XML配置:XmlBeanDefinitionReader解析<bean>标签。
  • 注解配置:ClassPathBeanDefinitionScanner扫描@Component等注解。
  • Java配置:ConfigurationClassPostProcessor解析@Bean方法。

实例化阶段(创建Bean实例)

根据BeanDefinition通过反射或工厂方法创建Bean实例(对象),但此时属性未注入
默认通过无参构造方法实例化(若未指定,Spring会强制要求无参构造)。

AbstractAutowireCapableBeanFactory类中的createBeanInstance方法中实现。

属性值填充(依赖注入)

为Bean的属性设置值或注入依赖

  • 通过@Autowired@ValueXML<property>等方式注入属性。
  • 若注入的依赖是其他Bean,会递归触发依赖Bean的生命周期。
  • 循环依赖问题:在属性注入阶段处理循环依赖(通过三级缓存解决)。

AbstractAutowireCapableBeanFactorypopulateBean方法中处理。

Aware接口回调设置

若Bean实现了特定Aware接口,Spring会回调对应方法,注入容器相关对象

  • BeanNameAware:注入Bean在容器中的名称(setBeanName(String beanName))。
  • BeanFactoryAware:注入当前Bean所在的BeanFactory(setBeanFactory(BeanFactory beanFactory))。
  • ApplicationContextAware:若容器是ApplicationContext,注入应用上下文(setApplicationContext(ApplicationContext applicationContext))。

AbstractAutowireCapableBeanFactoryinitializeBean方法中调用。

BeanPostProcessor前置处理

在Bean初始化前,允许自定义BeanPostProcessor对Bean实例进行处理。
主要是调用BeanPostProcessorpostProcessBeforeInitialization方法。
常见的实现类

  • ApplicationContextAwareProcessor:处理ApplicationContextAware接口。
  • InitDestroyAnnotationBeanPostProcessor:处理@PostConstruct注解。

AbstractAutowireCapableBeanFactoryapplyBeanPostProcessorsBeforeInitialization方法执行。

InitializingBean处理以及自定义init-method处理

执行Bean的初始化逻辑。
InitializingBean处理,在所有Bean属性设置完成后进行初始化操作。如果Bean实现了InitializingBean接口,InitializingBeanafterPropertiesSet方法会被调用。

自定义init-method处理,如果Bean在配置文件中定义了初始化方法那么该方法会被调用。
例如:通过XML配置init-method或Java配置@Bean(initMethod="xxx")。

AbstractAutowireCapableBeanFactoryinvokeInitMethods方法中调用

BeanPostProcessor后置处理

在Bean初始化后,允许自定义BeanPostProcessor对Bean实例进行处理。
BeanPostProcessorpostProcessAfterInitialization方法会被调用。

常见用途:AOP代理(如AbstractAutoProxyCreator在此阶段为目标对象创建代理)

AbstractAutowireCapableBeanFactoryapplyBeanPostProcessorsAfterInitialization方法执行

注册DisposableBean回调

如果Bean实现了DisposableBean接口或在Bean定义中指定了自定义的销毁方法,Spring容器会为这些Bean注册一个销毁回调,确保在容器关闭时能够正确地清理资源。

AbstractAutowireCapableBeanFactory类中的registerDisposableBeanlfNecessary方法中实现

Bean使用阶段

Bean已完全初始化,可被应用程序使用。通过依赖注入获取Bean实例(如@AutowiredApplicationContext.getBean())。
此阶段Bean处于“可用”状态,直到容器关闭。

Bean销毁阶段

容器关闭时,释放Bean资源。
主要步骤:

  • 接口回调:若Bean实现了DisposableBean,调用destroy方法。
  • 注解:若方法标注了@PreDestroy,Spring会调用该方法。
  • 自定义销毁方法:通过XML配置destroy-method或Java配置@Bean(destroyMethod="xxx")
  • 资源释放:如关闭数据库连接、释放文件句柄等。

DisposableBeanAdapterdestroy方法中实现

总结

通过代码出处,可以观察到整个Bean的创建的过程都依赖于AbstractAutowireCapableBeanFactory这个类,而销毁主要依赖DisposableBeanAdapter这个类。
AbstractAutowireCapableBeanFactory 的入口处,doCreateBean的核心代码如下,其中包含了实例化、设置属性值、初始化Bean以及注册销毁回调的几个核心方法。
这里就不贴代码了,想更深入看细节的可以去看源码。

Spring中创建Bean的方式有哪些?

基于注解的自动扫描

通过注解标记类,并配合组件扫描实现自动注册。
常见的注解有
@Component, @Service, @Repository, @Controller(及其衍生注解)。

例如:当在类上添加@Component时,再在配置类或 XML 中启用组件扫描(@ComponentScan<context:component-scan>)。这个类在服务启动时会自动被扫描到,然后注入到Spring容器。

@Configuration
@ComponentScan("com.jimoer.service")
public class BeanConfig {}
@Service
public class UserService {public void hello() {System.out.println("Hello from UserService");}
}@Component
public class UserHandler {public void hello() {System.out.println("Hello from UserHandler");}
}@Repository
public class UserRepository {public void hello() {System.out.println("Hello from UserRepository");}
}@Controller
public class UserController {public void hello() {System.out.println("Hello from UserController");}
}

使用@Configuration与@Bean 注解

通过 @Configuration 标注的配置类,显式定义 Bean 的创建逻辑。
适用于:需要精确控制 Bean 的初始化逻辑(如依赖其他 Bean 或复杂条件)。

@Configuration
public class AppConfig {@Beanpublic UserService userService() {return new UserService();}
}

XML 配置文件

通过 xml 的方式来定义 Bean。
在SpringBoot 流行以前,这种方式挺多的, SpringBoot 流行起来之后,这么用的越来越少了。

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"<bean id="userService" class="com.jimoer.demo.UserServiceImpl"><property name="message" value="Hello Spring!" /></bean>
</beans>
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService");

更适用于遗留项目或需要与非注解配置兼容的场景。

使用@Import注解

@Import注解的作用是快速导入某一个或多个类,使这些类能够被Spring加载到IOC容器中进行管理。
让类被Spring 的 IOC 容器管理,这不也是创建 Bean 么,因此,这种方式也可以算是创建Bean的一种方式。

@Import({UserServiceImpl.class})
@Configuration
public class UserBeanConfiguration {
}

自定义注解

通过自定义一种注解,然后在 Spring 应用启动过程中,通过自定义的 BeanDefinitionRegistryPostProcessorBeanfactoryPostProcessor 来扫描配置的包路径,识别出带有自定义注解的类。
这些处理器解析注解中的属性(如接口类、版本号、超时时间等),并基于这些信息创建 Spring的 BeanDefinition
例如:Dubbo框架使用的@DubboService注解

@DubboService("version=1.0.0")
public class UserServiceImpl implements UserFacadeService {}

动态注册(运行时注册)

在运行时通过 BeanDefinitionRegistry 动态注册 Bean。

// 获取 BeanFactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();// 定义 Bean 的元数据
GenericBeanDefinition userDefinition = new GenericBeanDefinition();
userDefinition.setBeanClass(UserService.class);// 注册 Bean
beanFactory.registerBeanDefinition("userService", userDefinition);

适用于:根据运行时条件动态生成 Bean(如插件化系统、动态配置)。

Spring Bean的注入方式有哪些?

使用@Autowired注解

@Autowired注解是Spring框架提供的一个注解,支持多种方式自动将Spring的bean注入到其他Bean中。

字段注入

@Component
public class JimoerUserService {@Autowiredprivate UserRepository userRepository;
}

构造方法注入

@Component
public class JimoerUserService {private final UserRepository userRepository;// Spring 4.3+ 可省略 @Autowired(单构造器)@Autowiredpublic JimoerUserService(UserRepository userRepository) {this.userRepository = userRepository;}
}

setter注入

@Component
public class JimoerUserService {private UserRepository userRepository;@Autowiredpublic void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}
}

使用@Resource和@Inject注解

除了Spring提供的注解,JDK也提供了可以互相注入Bean的注解,有@Resource@Inject

@Component
public class JimoerUserService {@Resourceprivate UserRepository userRepository;
}@Component
public class JiomerUserService {@Injectprivate UserRepository userRepository;
}

使用XML配置注入

如何不使用注解注入,还可以使用XML文件的配置进行Bean的互相注入。

<bean id="userRepository" class="com.jimoer.UserRepository"/>
<!-- 构造方法注入 -->
<bean id="userService" class="com.jiomer.UserService"><constructor-arg ref="userRepository"/>
</bean>
<!-- 字段注入 -->
<bean id="jimoerUserService" class="com.jiomer.JimoerUserService"><property name="userRepository" ref="userRepository"/>
</bean>

构造方法自动注入

其实从 Spring 4.3 开始,除非一个类中声明了至少两个构造函数,否则不需要用 @Autowired 标注构造函数,这个构造函数也能直接注入 Bean。

@Component
public class JimoerUserService {private UserRepository userRepository;public JimoerUserService(UserRepository userRepository){this.userRepository=userRepository;}
}

Spring Bean的作用域有哪些?

Spring的Bean的作用域,就是指这个Bean在哪个范围内可以被使用。
不同的作用域决定了Bean的创建管理和销毁的方式。

常见的作用域有SingletonPrototypeRequestSessionApplication这五种。
在代码中,可以在定义一个Bean的时候,通过@Scope 注解来指定他的作用域。

如果没有指定Bean的作用域,默认是Singleton(单例)。

Singleton(单例)

  • 周期:Spring 容器启动时创建实例,容器关闭时销毁。
  • 作用域:每个Spring IOC容器,只创建一个Bean实例。
  • 适用于:无状态服务(如工具类、缓存管理器、数据库连接池)。
  • 线程安全:需注意,若 Bean 有可变状态(即Bean中存在线程共享变量),需通过同步机制或线程安全集合处理。
  • 配置方式:
@Component // 默认即为 singleton
public class SingletonBean {
}

Propertype(原型)

  • 周期:每次调用 getBean() 或注入时创建新实例,容器不负责销毁。
  • 适用于:有状态 Bean(如用户会话数据、临时对象)。
  • 线程安全:实例独立,避免线程安全问题。
  • 配置方式:
@Component
@Scope("prototype")
public class PrototypeBean {
}

Request(HTTP 请求)

  • 周期:每个 HTTP 请求创建一个实例,请求结束后销毁。
  • 适用于:Web 应用中请求级别的数据共享(如请求日志、上下文信息)。

仅适用于 Web 应用环境。

  • 配置方式:
@Component
@Scope("request")
public class RequestBean {
}

Session(HTTP 会话)

  • 周期:每个用户会话(HttpSession)创建一个实例,会话结束时销毁。
  • 适用于:用户会话数据(如购物车、用户偏好设置)。

仅适用于 Web 应用环境。

  • 配置方式:
@Component
@Scope("session")
public class SessionBean {
}

Application(应用)

  • 周期:Web 应用启动时创建实例,应用关闭时销毁。
  • 适用于:全局配置或共享资源(如应用级缓存、配置信息)。类似 singleton,但绑定到 ServletContext

仅适用于 Web 环境

  • 配置方式:
@Component
@Scope("application")
public class ApplicationBean {
}

Websocket(WebSocket 会话)

  • 周期:WebSocket 连接建立时创建实例,连接关闭时销毁。
  • 适用于:WebSocket 会话上下文数据(如实时通信状态)。

仅适用于 WebSocket 应用。

  • 配置方式:
@Component
@Scope("websocket")
public class WebSocketBean {
}

自定义作用域

一般情况下,在开发过程中,都是使用Singleton作用域,有时候也会用Propertype,其他几个用的都不多。但是除了上面列举的6个Spring提供作用域以外,还可以自己定义Bean作用域。

自定义一个Spring Bean的作用域,需要实现org.springframework.beans.factory.config.Scope接口,主要是实现如下几个方法来管理Bean的生命周期。

package org.springframework.beans.factory.config;import org.springframework.beans.factory.ObjectFactory;public interface Scope {Object get(String var1, ObjectFactory<?> var2);Object remove(String var1);void registerDestructionCallback(String var1, Runnable var2);Object resolveContextualObject(String var1);String getConversationId();
}

自定义一个类,然后实现Scope接口,来实现我们自己的Bean作用域。

public class JimoerScope implements Scope{@Overridepublic Object get(String s, ObjectFactory<?> objectFactory) {// 获取Bean的逻辑return objectFactory.getObject();}@Overridepublic Object remove(String s) {// 移除Bean的逻辑return null;}@Overridepublic void registerDestructionCallback(String s, Runnable runnable) {// 注册Bean销毁时的回调}@Overridepublic Object resolveContextualObject(String s) {// 解析上下文return null;}@Overridepublic String getConversationId() {// 获取会话IDreturn "";}
}

接下来,我们将Spring配置中注册这个自定义的作用域。
这可以通过ConfigurableBeanFactory.registerScope 方法实现。

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic JimoerScope jimoerScope(ConfigurableBeanFactory beanFactory) {JimoerScope jimoerScope = new JimoerScope();beanFactory.registerScope("jimoer", jimoerScope);return jimoerScope;}}

此时在Bean定义中使用自定义的作用域的名称jimoer
Spring 容器将会根据你的自定义逻辑来创建和管理这些 Bean。

@Component
@Scope("jimoer")
public class CustomerScopeTest {
}

相关文章:

技术面:Spring (bean的生命周期、创建方式、注入方式、作用域)

Spring Bean的生命周期是什么样的? 在Spring容器里一个Bean的从创建到销毁一般都是经历了以下几个阶段: 定义阶段(Bean元信息配置)=>实例化阶段(创建Bean对象)=>初始化阶段(执行初始化逻辑)=>使用阶段(Bean可用)=>销毁阶段(释放资源)定义阶段(BeanDef…...

马尔可夫决策

马尔可夫决策 马尔可夫决策:随机动态环境下序贯决策,其核心假设是 “马尔可夫性”—— 即 “未来状态的概率分布仅依赖于当前状态,与当前状态之前的历史无关”。MDP 的最终目标是找到一套最优策略 π(π: S→A,即 “在每个状态下选择哪个动作” 的规则) 马尔可夫决策可以…...

十九、指令流水线的基本概念

目录一、核心思想:类比工厂装配线二、一个经典的5级流水线模型(RISC)三、流水线的可视化:时空图四、流水线的优势五、流水线的挑战: hazards(冒险/冲突)总结指令流水线是一个计算机体系结构中的核心概念,旨在提高处理器的效率和吞吐率。 一、核心思想:类比工厂装配线 …...

本地布署Diffusers库 实现文生图 - yi

本地布署Diffusers库 实现文生图本地布署Diffusers库实现文生图 本次随笔,记录开源Python库Diffusers库的使用。 Diffusers库由Hugging Face维护,拥有活跃的社区和丰富的文档。Diffusers库是专注于扩散模型(Diffusion Models)的开源Python库。Diffusers库多任务支持​​:支…...

【光照】[光照模型]发展里程碑时间线

【从UnityURP开始探索游戏渲染】专栏-直达图形学光照模型发展史:技术演进与里程碑 section 基础奠基期(1960s-1970s)1967 : Lambert模型(漫反射) - Bui Tuong Phong提出 1971 : Gouraud着色 - Henri Gouraud发明顶点插值着色 1973 : Warnock算法 - 首次实现隐藏面消除 1975…...

算法设计作业-week1

任务一:企业内部编码规范参考 https://max.book118.com/html/2020/1120/8077006051003017.shtm任务二:《数学之美》阅读 读《数学之美》第二章:自然语言处理从规则到统计的启示 在阅读吴军博士《数学之美》第二章后,我对自然语言处理(NLP)的发展历程有了深刻的认识。这一…...

git merge

git merge :合并分支,从指定的分支名合并到当前所处的分支上。...

C语言学习

file:/D:/study/C语言/test1.c 现在开始学习c语言了,感觉跟java的大差不差,之后一段时间就学他吧。还有就是想吐槽一下devc的功能性有点差,连把代码文件拖拽到这里都不行。...

Ubuntu 的剪贴板

在 Ubuntu 上可以安装 copyq: sudo apt install copyq然后启动 copyq: copyqUbuntu 默认 Win+V 快捷键是打开通知,可以进行修改:为 copyq 添加快捷键,命令必须是 copyq toggle,名称可以随意。...

IDAPro--MCP详细配置教程

IDAPro--MCP详细配置教程 本文介绍如何配置idamcp实现ai自动化分析二进制文件,用于解决CTF竞赛中reverse与pwn类型的题目 IDA版本:9.1专业版 mcp:cherrystudio,lmstudio(本地部署ai) 一、项目简介 项目地址:https://github.com/mrexodia/ida-pro-mcp 功能:与IDApro实现联动…...

安全不是一个功能-而是一个地基

GitHub 主页 安全不是一个功能,而是一个地基 🔒🏗️ 我入行大概十年的时候,经历过一次让我至今心有余悸的安全事件。我们当时在为一个金融客户做一套在线交易系统。一个年轻的程序员,在写一个查询历史订单的接口时,为了图方便,直接用字符串拼接了 SQL 语句。是的,你没…...

你的测试又慢又不可靠-因为你测错了东西

GitHub 主页 你的测试又慢又不可靠?因为你测错了东西!🧪➡️✅ “我们应该写更多的测试。” 在每一个技术会议上,这句话都会被反复提起,就像一句神圣的咒语。人人都点头称是,人人都知道这是“正确”的。但一回到座位上,很多人脸上的表情就变得痛苦起来。😫 为什么?因…...

别再猜了-开始测量吧-一份实用的Web性能指南

GitHub 主页 别再猜了,开始测量吧:一份实用的 Web 性能指南 又是一年“黑五”,凌晨三点,我的手机像疯了一样尖叫起来。😱 不是闹钟,是监控警报。我们的主打电商服务,那个我们花了半年心血构建的系统,在流量洪峰面前,像纸糊的一样,彻底崩溃了。CPU 100%,内存溢出,日…...

你的中间件一团糟-是时候修复它了-️

GitHub 主页 中间件(Middleware)。这是 Web 开发中最强大的概念之一,也是最容易被滥用的概念之一。理论上,这是一个美妙的想法:一个由可复用组件构成的管道,可以检查、转换或终止请求。但在实践中,在我多年来使用过的许多框架中,它变成了一团乱麻,函数调用函数,控制流…...

文件不只是数据-一份稳健的文件处理指南

GitHub 主页 文件不只是数据:一份稳健的文件处理指南 📁💾 我永远忘不了那个下午。我们刚刚上线了一个允许用户上传个人头像的新功能。一切看起来都很完美。直到一个用户,出于无心或有意,尝试上传了一个他电脑上 2GB 大小的电影文件。🎬 服务器的内存监控瞬间飙红,CP…...

告别框架臃肿-我如何在不牺牲性能的情况下重新发现简单之美

GitHub 主页 我写了四十多年的代码。我刚开始编程的时候,打孔卡还是主流,互联网还只是大学实验室里一个遥不可及的梦想。我见证了无数语言和框架的兴衰起落,如同王朝更迭。我曾驾驭过技术的浪潮,也曾目睹它们在现实的海岸上撞得粉碎。如果说我从中学到了什么,那就是复杂性…...

超越-env-一份成熟的应用程序配置指南

GitHub 主页 超越.env:一份成熟的应用程序配置指南 🧐 让我给你讲个鬼故事。👻 几年前,我们团队的一个新来的小伙子,在一次紧急的线上热修复中,不小心把一个配置项搞错了。他本该把数据库地址指向生产环境的只读副本,结果,他忘了在生产服务器上更新那个小小的.env文件…...

20250913 NFLS 模拟赛 部分题目

简单倍增 #include <bits/stdc++.h> using namespace std; using ll = long long;int main() {freopen("fountain.in","r",stdin);freopen("fountain.out","w",stdout);ios::sync_with_stdio(false);cin.tie(nullptr);int n, q;…...

帐号内容定位

帐号定位原则和逻辑...

基于YOLOv8的茶叶病害识别项目|完整源码数据集+图形化界面+训练教程

本文介绍了一个基于 YOLOv8 的茶叶病害识别系统,从数据集构建、模型训练到 PyQt5 可视化界面实现,完整展示了茶叶病害检测的开发流程。该系统不仅能够识别 8类茶叶病虫害及健康状态,还具备 高精度、实时性强、操作简单 等特点,适用于科研、茶园管理以及智能农业应用场景。未…...

2025第三届“陇剑杯”网络安全大赛初赛-夺旗闯关赛wp

应急 应急响应siem百度网盘:通过网盘分享的文件:siem-加密.rar链接: https://pan.baidu.com/s/1wtfdSY2hThOAzVRGr9jwcg 提取码: e86t 解压密码:x2p1nsWFG4KfXp5BXegb题目描述:题目描述在比赛过程中变了一次,具体如下:初始:某企业内网被攻破了,请分析出问题并给出正确的…...

《Python数据结构与算法分析》第二弹《2.2.2 异序词检测示例》

2.2.2 异序词检测示例 要展示不同数量级的算法,一个好例子就是经典的异序词检测问题。如果一个字符串只是重排了另一个字符串的字符,那么这个字符串就是另一个的异序词,比如heart与earth,以及python与typhon。为了简化问题,假设要检查的两个字符串长度相同,并且都是由26个…...

深入解析:柱状图(Vue3)

深入解析:柱状图(Vue3)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size…...

计算机毕业设计springboot基于微信小程序的手机点餐软件 基于Spring Boot框架的微信小程序点餐体系设计与实现 微信小脚本点餐应用开发:Spring Boot技术的应用

计算机毕业设计springboot基于微信小程序的手机点餐软件 基于Spring Boot框架的微信小程序点餐体系设计与实现 微信小脚本点餐应用开发:Spring Boot技术的应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block…...

二叉树的相关知识

二叉树的相关知识 问题一:知道二叉树的后序遍历和中序遍历,如何得到前序遍历 我的想法:遍历后序序列,找到根结点在前序序列中找到你刚刚找到的根结点根据找到的根结点,把前序列表中的序列分为两部分,一部分为根结点的左子树,另一部分为根结点的右子树分别遍历左子树和右…...

原假设的选择准则:总损失视角的假设检验

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 在假设检验中,原假设(𝐻0)与备择假设(𝐻1)的设定是统计推断的核心。原假设通常代表“无效应”或“现状维持”,提供可操作的基准,例如总体均值等于…...

dfs序基础+树上差分

dfs序基础1 给一棵有根树,这棵树由编号为 \(1\dots N\) 的 \(N\) 个结点组成。根结点的编号为 \(R\)。每个结点都有一个权值,结点 \(i\) 的权值为 \(v_i\)。 接下来有 \(M\) 组操作,操作分为两类:1 a x,表示将结点 \(a\) 的权值增加 \(x\); 2 a,表示求结点 \(a\) 的子树…...

Python中的if __name__ == __main__是什么?

引言 当初学习Python编程语言时,经常会遇到一段代码:if name == "main"。初学者可能会疑惑这段代码的作用和意义是什么,为什么要这样写。本文将对这段代码进行详细地解析,并提供代码示例,帮助初学者更好地理解这一概念。 if name == "main"的基本概念…...

钻石

目前抖音福袋扭蛋机的用户产出的DY钻石比较多,我们努力撮合商家和散户之间的交易,中间向商家收取一定的费用和少许保证金(为保证交易安全)。 收购价格为每100钻石7元,不封顶。比如100钻石/7元,1000钻石/70元,10000钻石/700元。打赏给我们指定的直播间即可。 需要出售和收…...

随机游走理解

随机游走理解赌徒破产定理:为什么赌博最终会归零 引言 在概率论中,"赌徒破产定理"(Gamblers Ruin)是一个经典的结果,它表明在一个公平的赌博游戏中,如果赌徒拥有有限的本金而庄家拥有无限的资金,赌徒最终破产的概率是1。即使游戏是公平的(胜负概率各50%,赔率…...

【基于协同过滤的校园二手交易强大的平台】

【基于协同过滤的校园二手交易强大的平台】pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节

对于神经网络来说,我们已经习惯了层状网络的思维:数据进来,经过第一层,然后第二层,第三层,最后输出结果。这个过程很像流水线,每一步都是离散的。 但是现实世界的变化是连续的,比如烧开水,谁的温度不是从30度直接跳到40度,而是平滑的上生。球从山坡滚下来速度也是渐渐…...

PKU_Compiler

from pixiv 资源NJU Compiler 课程 中科大 Compiler 课程 LLVM IR Github book教程 Koopa IR 框架 PKU 讲义本体 Github仓库Lv0 环境配置 Docker 获取编译实践的镜像: sudo docker pull maxxing/compiler-devdocker安装配置docker镜像vim /etc/docker/daemon.json{"regist…...

lc1026-节点与其祖先之间的最大差值

难度:中等(伪境)题目描述给定一棵二叉树,找到最大的“节点与其祖先节点的差值的绝对值”示例 输入:root = [8,3,10,1,6,null,14,null,null,4,7,13] 输出:7 解释:8/ \3 10/ \ \ 1 6 14/ \ /4 7 13|8 - 1| = 7输入:root = [1,null,2,null,0,3] 输出:3 解释…...

如何绕过谷歌反爬策略爬取搜索结果

背景 尝试开发一个爬虫,绕过谷歌反爬策略并获取谷歌搜索的结果。 技术栈docker管理开发环境,操作系统为centos7 puppeteer-extra-plugin-stealth插件 + chromium浏览器模拟真实用户 xvfb模拟图形界面环境 相关的实现代码很多,这里不再赘述,只讲解决问题的过程。问题 开发完…...

[SSL]

有免费的SSL证书可以使用,并且通常需要定时更新 ,比较知名的免费SSL证书颁发机构是Lets Encrypt Lets Encrypt特点免费且自动化:提供的SSL证书完全免费,并且支持自动化申请、安装和续期,大大降低了网站部署HTTPS的门槛。 安全性高:所颁发的证书符合行业标准,能提供强大的…...

求细胞数量

2025.9.13 曹立 题目内容 一矩形阵列由数字 \(0\) 到 \(9\) 组成,数字 \(1\) 到 \(9\) 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数 输入描述 第一行两个整数代表矩阵大小 \(m\) 和 \(m\) 接下来 \(m\) 行,每行一个长度为…...

你的部署流程已然落伍-热重启的失传艺术

GitHub 主页 你的部署流程已然落伍:热重启的失传艺术 我依然清晰地记得那个周五的午夜。我,一个本该在家享受周末的四十多岁男人,却身处冰冷的机房,耳边是服务器风扇的嗡嗡声,眼前是终端上不断滚动的错误日志。一次本应“简单”的版本更新,变成了一场灾难。服务起不来,回…...

[豪の学习笔记] 软考中级备考 基础复习#9

系统设计基本原理、系统总体结构设计、数据流图跟学视频:学以致知Learning - 软件设计师 基础阶段|考点理论精讲 Chapter 9 - 结构化开发方法(数据流图) 1 - 系统设计基本原理 抽象 ​ 抽象是一种设计技术,重点说明一个实体的本质方面,而忽略或掩盖不是很重要或非本质的方…...

Shiro概述 - 详解

Shiro概述 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px !…...

2025CCPC南昌邀请赛游记

Day 0 晚上八点的飞机,由于我们三个人中只有一个队友做过飞机,出于谨慎我们六点就去机场了。飞机起飞后我才意识到自己晕机。九点四十多到的南昌,下了飞机第一感觉还是非常晕。等到出了机场后才意识到原来南方这么热。找了一家民宿,打车到了之后就睡觉了。 Day 1 前一天晚上…...

双因素认证暴力破解绕过技术解析(2023更新版)

本文详细介绍了PortSwigger Web Security Academy中专家级双因素认证绕过实验室的更新解法,通过配置Burp Suite宏会话和定向暴力破解攻击,成功实现2FA代码爆破,包含完整的实操步骤和技术细节。PortSwigger:使用暴力攻击绕过双因素认证(2023年更新) 作者:Aaryan Golatkar…...

软件工程第二次作业-个人项目

个人项目项目 内容这个作业属于哪个课程 [软件工程](首页 - 计科23级12班 - 广东工业大学 - 班级博客 - 博客园)这个作业要求在哪里 [作业要求](个人项目 - 作业 - 计科23级12班 - 班级博客 - 博客园)这个作业的目标 训练个人项目软件开发能力,学会使用性能测试工具和实现单元…...

用 Go 打造一个服务器资源指标采集器:结合 Prometheus Exporter 实战

在生产环境中,运维和开发同学都离不开 系统资源监控:什么时候 CPU 快跑满了? 内存是不是泄漏了? 磁盘剩余空间还能撑多久?要做到这一点,最常见的方案是: 👉 采集系统资源指标 → 暴露给 Prometheus → 在 Grafana 里可视化。 今天我们就用 Go + go-commons/systemutil…...

2025年API安全建设方案最佳实践:七步五方法

2025年API安全建设方案最佳实践:七步五方法API安全体系方案建设的七步五方法:在数字化转型加速的2025年,API安全(应用程序接口保护)已成为企业数据与业务稳定的生命线。本文结合国内最佳实践,梳理API安全方案的七个关键步骤和5个核心方法,并通过金融、云原生等典型行业案…...

Git 分支

查看本地所有分支:git branch,会列出当前仓库的所有本地分支,当前所在的分支会用星号(*)标记。 查看远程所有分支:git branch -r,会列出所有本地分支和远程分支,远程分支通常以 remotes 开头。 查看本地和远程的所有分支:git branch -a,会只列出远程分支。 如果远程分…...

【数学】拉格朗日乘数法

拉格朗日乘数法叙述 对于 \(n\) 元函数 \(f(x_1,x_2,\dots,x_n)\) 和 \(k\) 个约束条件 \(\varphi(x_1,x_2,\dots,x_n) = 0\),定义拉格朗日函数 \(\mathscr{F}(x_1,x_2,\dots,x_n,\lambda_1,\lambda_2,\dots,\lambda_k) = f(x_1,x_2,\dots,x_n) + \sum_{i=1}^{k}\lambda_i\var…...

华为芯片之父,33年默默开拓,铸就“中国芯”,功成身退时却鲜有人知!

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 他被称为华为芯片之父,却在退休之际鲜有人知。2023年,华为公司宣布徐文伟正式退休。这位在华为默默耕耘了33年的创始人之一…...

Redis为什么适合做分布式锁? - 浪矢

Redis为什么适合做分布式锁? 性能高 Redis是内存数据库,所有的操作均在内存中完成,所以读写速度非常快。在需要频繁加锁和解锁的高并发场景下,Redis性能优势明显。 实现简单 Redis 提供了像 SETNX、EXPIRE 这样的原子性命令,这些命令可以很方便地组合起来实现分布式锁。 e…...

百度昆仑芯高调出圈:对标寒武纪,估值或达千亿港元?

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 一向低调的昆仑芯,估值正被重新讨论。中银国际在最新研报中提出,寒武纪(688256.SH)A股市值达800亿美元,其他部分国内GPU…...