SpringBean模块(二)bean初始化(2)和容器初始化顺序的比较--引入ApplicationContextInitializer

news2025/4/3 4:50:23

前面介绍了获取容器可以让spring bean实现ApplicationContextAware,实际也是初始化执行了setApplicationContext接口,

初始化接口还可以借助一些注解或者spring bean的初始化方法,那么他们的执行顺序是什么样的呢?

一、验证(没有依赖关系时)是无序的

1、demo
下面新建三个class文件

分别使用ApplicationContextAware、@PostConstruct和InitializingBean

package com.bit.demo.test.bean;

import com.bit.demo.dto.UserDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class InitUserInitUtil implements ApplicationContextAware {

    private static UserDTO userDTO;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        log.info("初始化方法,ApplicationContextInitializer");
        UserDTO user = new UserDTO();
        user.setUserName("zs");
        user.setPassword("123456");
        this.userDTO = user;
    }

    public static UserDTO getUserDTO() {
        return userDTO;
    }
}
package com.bit.demo.test.bean;

import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class TestClass1 {

    @PostConstruct
    public void init(){
        //项目启动执行方法
        log.info("初始化方法, 使用PostConstruct");
    }
}
package com.bit.demo.test.bean;

import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class TestClass2 implements InitializingBean {

    @PostConstruct
    public void initAgain() {
        log.info("初始化方法, 同时使用PostConstruct和InitializingBean");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("初始化方法, 使用InitializingBean");
    }
}
  启动项目输出
 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.4)

2025-03-28T10:56:01.574+08:00  INFO 13716 --- [           main] com.bit.demo.BitApplication              : Starting BitApplication using Java 17.0.11 with PID 13716 (C:\mydemo\bit-demo\target\classes started by Tina.Zhang in C:\code\cci-voice)
2025-03-28T10:56:01.576+08:00  INFO 13716 --- [           main] com.bit.demo.BitApplication              : No active profile set, falling back to 1 default profile: "default"
2025-03-28T10:56:02.209+08:00  INFO 13716 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 7777 (http)
2025-03-28T10:56:02.216+08:00  INFO 13716 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-03-28T10:56:02.217+08:00  INFO 13716 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.19]
2025-03-28T10:56:02.258+08:00  INFO 13716 --- [           main] o.a.c.c.C.[.[localhost].[/bitDemo]       : Initializing Spring embedded WebApplicationContext
2025-03-28T10:56:02.258+08:00  INFO 13716 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 648 ms
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
Initialization Sequence datacenterId:6 workerId:4
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.5.5 
2025-03-28T10:56:02.495+08:00  INFO 13716 --- [           main] c.bit.demo.test.bean.InitUserInitUtil    : 初始化方法,ApplicationContextInitializer
2025-03-28T10:56:02.496+08:00  INFO 13716 --- [           main] com.bit.demo.test.bean.TestClass1        : 初始化方法, 使用PostConstruct
2025-03-28T10:56:02.497+08:00  INFO 13716 --- [           main] com.bit.demo.test.bean.TestClass2        : 初始化方法, 同时使用PostConstruct和InitializingBean
2025-03-28T10:56:02.497+08:00  INFO 13716 --- [           main] com.bit.demo.test.bean.TestClass2        : 初始化方法, 使用InitializingBean
2025-03-28T10:56:02.718+08:00  INFO 13716 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 7777 (http) with context path '/bitDemo'
2025-03-28T10:56:02.723+08:00  INFO 13716 --- [           main] com.bit.demo.BitApplication              : Started BitApplication in 1.385 seconds (process running for 1.765)
2、考虑到路径影响类的加载

前面的输出顺序是InitUserInitUtil > TestClass1 > TestClass2,正好和类路径顺序一致,考虑到类的路径影响类的加载,现在TestClass1、TestClass2各copy出来一个,加个前缀Aa,排在InitUserInitUtil 的前面。

新增文件

再次启动

可以看到Aa开头的类日志先输出了。

3、结论

ApplicationContextAware的setApplicationContext、@PostConstruct、

InitializingBean的afterPropertiesSet 他们的执行顺序是随机的。

4、错误引用

基于上面,AaTestClass1 > AaTestClass2 > InitUserInitUtil > TestClass1 > TestClass2

现在如果在AaTestClass2中利用InitUserInitUtil 获取UserDTO:

package com.bit.demo.test.bean;

import com.bit.demo.dto.UserDTO;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class AaTestClass2 implements InitializingBean {

    @PostConstruct
    public void initAgain() {
        log.info("初始化方法, 同时使用PostConstruct和InitializingBean");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("初始化方法, 使用InitializingBean");
        UserDTO innitUser = InitUserInitUtil.getUserDTO();
        if(innitUser != null) {
            log.info("获取user成功",innitUser);
        }else{
            log.info("获取user失败",innitUser);
        }
        
    }
}

因为此时InitUserInitUtil 还没有初始化,获取到的是null:

注意:

这也间接说明了,不要滥用ApplicationContextAware来获取Bean,能自动获取Bean的都通过Autowired等注解获取,因为使用了注解spring自身会优化加载顺序,让被依赖的Bean先执行。在必须手动获取如非spring bean中使用则不用考虑加载问题(非spring bean根本不会自动加载)。

5、使用自动装配引入依赖关系来解决引用问题 

我们知道,使用@Autowired等自动装配,可以让被依赖的bean先执行。针对上面的问题,改写下:

package com.bit.demo.test.bean;

import com.bit.demo.dto.UserDTO;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class AaTestClass2 implements InitializingBean {

    @Autowired
    private InitUserInitUtil initUserInitUtil;

    @PostConstruct
    public void initAgain() {
        log.info("初始化方法, 同时使用PostConstruct和InitializingBean");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("初始化方法, 使用InitializingBean");
        UserDTO innitUser = InitUserInitUtil.getUserDTO();
        if(innitUser != null) {
            log.info("获取user成功",innitUser.toString());
        }else{
            log.info("获取user失败",innitUser);
        }

    }
}

这时启动打印:AaTestClass1  > InitUserInitUtil > AaTestClass2  > TestClass1 > TestClass2,

对比上面的AaTestClass1 > AaTestClass2 > InitUserInitUtil > TestClass1 > TestClass2,可见InitUserInitUtil 提前加载了 

6、引入ApplicationContextInitializer

上面增加依赖关系可以解决bean的引用问题。

那如果就希望InitUserInitUtil做为一个最底层的bean,能够在其他业务bean之前加载,还可以使用

ApplicationContextInitializer。
package com.bit.demo.test.bean;

import com.bit.demo.dto.UserDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class InitUserInitUtil implements ApplicationContextInitializer {

    private static UserDTO userDTO;

    public static UserDTO getUserDTO() {
        return userDTO;
    }

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        log.info("初始化方法,ApplicationContextInitializer");
        UserDTO user = new UserDTO();
        user.setUserName("zs");
        user.setPassword("123456");
        this.userDTO = user;
    }
}

注册:

@SpringBootApplication
public class BitApplication {

    public static void main(String[] args) {
        //SpringApplication.run(BitApplication.class, args);
        SpringApplication application = new SpringApplication(BitApplication.class);
        application.addInitializers(new InitUserInitUtil()); // 注册自定义 ApplicationContextInitializer
        application.run(args);
    }
}
package com.bit.demo.test.bean;

import com.bit.demo.dto.UserDTO;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class AaTestClass2 implements InitializingBean {

    @PostConstruct
    public void initAgain() {
        log.info("初始化方法, 同时使用PostConstruct和InitializingBean");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("初始化方法, 使用InitializingBean");
        UserDTO innitUser = InitUserInitUtil.getUserDTO();
        if(innitUser != null) {
            log.info("获取user成功",innitUser);
        }else{
            log.info("获取user失败",innitUser);
        }
        
    }
}
   
再次启动输出
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.4)

2025-03-28T11:18:53.520+08:00  INFO 15408 --- [           main] c.bit.demo.test.bean.InitUserInitUtil    : 初始化方法,ApplicationContextInitializer
2025-03-28T11:18:53.525+08:00  INFO 15408 --- [           main] com.bit.demo.BitApplication              : Starting BitApplication using Java 17.0.11 with PID 15408 (C:\mydemo\bit-demo\target\classes started by Tina.Zhang in C:\code\cci-voice)
2025-03-28T11:18:53.526+08:00  INFO 15408 --- [           main] com.bit.demo.BitApplication              : No active profile set, falling back to 1 default profile: "default"
2025-03-28T11:18:54.182+08:00  INFO 15408 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 7777 (http)
2025-03-28T11:18:54.190+08:00  INFO 15408 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-03-28T11:18:54.190+08:00  INFO 15408 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.19]
2025-03-28T11:18:54.233+08:00  INFO 15408 --- [           main] o.a.c.c.C.[.[localhost].[/bitDemo]       : Initializing Spring embedded WebApplicationContext
2025-03-28T11:18:54.233+08:00  INFO 15408 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 672 ms
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
Initialization Sequence datacenterId:6 workerId:2
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.5.5 
2025-03-28T11:18:54.467+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.AaTestClass1      : 初始化方法, 使用PostConstruct
2025-03-28T11:18:54.467+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.AaTestClass2      : 初始化方法, 同时使用PostConstruct和InitializingBean
2025-03-28T11:18:54.468+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.AaTestClass2      : 初始化方法, 使用InitializingBean
2025-03-28T11:18:54.468+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.AaTestClass2      : 获取user成功
2025-03-28T11:18:54.469+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.TestClass1        : 初始化方法, 使用PostConstruct
2025-03-28T11:18:54.469+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.TestClass2        : 初始化方法, 同时使用PostConstruct和InitializingBean
2025-03-28T11:18:54.469+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.TestClass2        : 初始化方法, 使用InitializingBean
2025-03-28T11:18:54.688+08:00  INFO 15408 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 7777 (http) with context path '/bitDemo'
2025-03-28T11:18:54.694+08:00  INFO 15408 --- [           main] com.bit.demo.BitApplication              : Started BitApplication in 1.376 seconds (process running for 1.72)

二、ApplicationContextInitializer

1、介绍

ApplicationContextInitializer 是 Spring 框架中的一个接口,主要用于在 Spring 容器刷新(refresh())之前ApplicationContext 进行自定义的初始化操作。它允许在 ApplicationContext 完全初始化之前进行配置,例如:添加属性、激活配置文件(Profiles)等。

这种机制让开发者能够在 Spring 启动过程中更早地进行干预,适用于有高级配置需求的应用程序。

该接口位于 org.springframework.context 包下:

public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {
    void initialize(C applicationContext);
}
2、方法说明

initialize(C applicationContext):

  • 该方法在 ApplicationContext 刷新(refresh())之前调用,可以对 applicationContext 进行初始化。

  • CConfigurableApplicationContext 的子类,如 AnnotationConfigApplicationContextGenericApplicationContext

3、典型使用场景
(1)动态修改 Environment 变量

initialize() 方法中修改 Environment,实现动态配置:

@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
    ConfigurableEnvironment environment = applicationContext.getEnvironment();
    environment.getSystemProperties().put("my.custom.property", "CustomValue");
    System.out.println("✅ 设置环境变量 my.custom.property = " + environment.getProperty("my.custom.property"));
}
(2)激活特定的 Spring Profile
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
    ConfigurableEnvironment environment = applicationContext.getEnvironment();
    environment.setActiveProfiles("dev"); // 激活 dev Profile
    System.out.println("✅ 激活 Profile: " + String.join(", ", environment.getActiveProfiles()));
}
(3)在 Spring 容器启动前添加 PropertySource

如果需要在 Spring 启动前添加额外的配置源(如数据库、远程配置中心等),可以这样做:

import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertiesPropertySource;
import java.util.Properties;

@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
    MutablePropertySources propertySources = applicationContext.getEnvironment().getPropertySources();
    Properties properties = new Properties();
    properties.put("extra.config", "Loaded from ApplicationContextInitializer");
    propertySources.addFirst(new PropertiesPropertySource("extraProperties", properties));

    System.out.println("✅ 额外配置: " + applicationContext.getEnvironment().getProperty("extra.config"));
}

4、与其他 Spring 组件的对比
组件作用范围作用时间点主要用途
ApplicationContextInitializerSpring 容器ApplicationContext.refresh() 之前初始化 ApplicationContext,添加 PropertySource、修改配置等
BeanFactoryPostProcessorBeanFactoryApplicationContext.refresh() 期间修改 Bean 定义(如动态修改 @Bean 配置)
BeanPostProcessor单个 BeanBean 初始化前后处理 Bean 实例,如 AOP、代理等
ApplicationRunner / CommandLineRunner应用启动完成后ApplicationContext 初始化后运行启动任务(如初始化数据、执行业务逻辑)
5、执行时期和注意事项

ApplicationContextInitializer 的执行时机 早于 Spring 容器刷新(refresh()),如下所示:

(1)创建 SpringApplication

(2)调用 ApplicationContextInitializer.initialize()

(3)加载 Environment

(4)创建 ApplicationContext 并调用 refresh()

(5)扫描 BeanFactory 并注册 Bean

(5)调用 BeanFactoryPostProcessor

(6)调用 InitializingBean@PostConstruct

(7)启动 Spring 容器

注意:由于 ApplicationContextInitializerrefresh() 之前执行,此时 Bean 还未初始化,不能调用 applicationContext.getBean()

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("✅ 获取 ApplicationContext:" + applicationContext);
        System.out.println("✅ 获取 Environment:" + applicationContext.getEnvironment());

        // ❌ 不能使用 getBean(),因为此时 Bean 还未初始化
        try {
            Object myBean = applicationContext.getBean("myBean");
            System.out.println("获取 Bean: " + myBean);
        } catch (Exception e) {
            System.out.println("⚠️ 此时无法获取 Bean,因为 ApplicationContext 还未刷新!");
        }
    }
}
6、使用方法
(1)实现ApplicationContextInitializer
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("🚀 ApplicationContextInitializer 执行...");

        // 获取 Environment
        ConfigurableEnvironment environment = applicationContext.getEnvironment();

        // 设置自定义属性
        environment.getSystemProperties().put("custom.property", "Hello Spring!");

        // 打印 Environment 变量
        System.out.println("✅ Environment 自定义属性:" + environment.getProperty("custom.property"));
    }
}
(2)注册ApplicationContextInitializer

Spring 提供了 3 种方式 来注册 ApplicationContextInitializer

①  在 SpringApplication 中添加 addInitializers

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(MyApplication.class);
        application.addInitializers(new MyApplicationContextInitializer()); // 注册自定义 ApplicationContextInitializer
        application.run(args);
    }
}

② 在 spring.factories 中自动加载

创建 META-INF/spring.factories 文件:

org.springframework.context.ApplicationContextInitializer=com.example.MyApplicationContextInitializer

③ 在测试中使用 @ContextConfiguration

如果只想在测试环境中使用 ApplicationContextInitializer,可以使用 @ContextConfiguration

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;

@SpringBootTest
@ContextConfiguration(initializers = MyApplicationContextInitializer.class)
public class MyApplicationTests {

    @Test
    void contextLoads() {
        System.out.println("🔍 运行测试...");
    }
}

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

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

相关文章

【分享】内外网文件摆渡系统:让数据传输更安全更可靠

【分享】Ftrans内外网文件摆渡系统&#xff1a;让数据传输更安全更可靠&#xff01; 随着大数据时代的到来&#xff0c;数据的重要性日渐得到重视&#xff0c;数据作为数字经济时代下的基础性资源和战略性资源&#xff0c;是决定国家经济发展水平和竞争力的核心驱动力。以行业…

2025年江苏省职业院校技能大赛 (高职组)大数据应用开发赛项任务书 (样题)

2025年江苏省职业院校技能大赛 &#xff08;高职组&#xff09;大数据应用开发赛项任务书 &#xff08;样题&#xff09; 背景描述&#xff1a;任务A&#xff1a;离线数据处理&#xff08;35分&#xff09;子任务一&#xff1a;数据抽取子任务三&#xff1a;指标计算 任务B&…

手机显示5GA图标的条件

最近有星友问在什么情况下才能显示5G-A&#xff1f;虽然这个我也不知道&#xff0c;但是我有几个运营商的5G终端白皮书&#xff0c;从上面就可以找到答案。 如上是几个运营商显示5G-A的条件&#xff0c;基本上考虑的都是3CC的情况&#xff0c;联通还有考虑200M CA 2CC的场景&am…

Spring Boot 实现文件秒传功能

前言 在开发Web应用时&#xff0c;文件上传是一个常见需求。然而&#xff0c;当用户需要上传大文件或相同文件多次时&#xff0c;会造成带宽浪费和服务器存储冗余。此时可以使用文件秒传技术通过识别重复文件&#xff0c;实现瞬间完成上传的效果&#xff0c;大大提升了用户体验…

使用AOP技术实现Java通用接口验签工具

一、背景 在给第三方提供接口时,我们需要对接口进行验签。具体来说,当外部系统调用我们的接口时,请求中需要携带一个签名,我们接收到请求后,会解析数据并校验签名是否正确,以确保请求的合法性和安全性。 为了在不同项目中方便地使用这一功能,我们将签名校验规则封装成一…

aarch64-none-elf-gcc与aarch64-linux-gnu-gcc

1. 场景描述 在Ubuntu 24.04.1 LTS x86_64架构下交叉编译能跑在aarch64架构下裸机程序&#xff0c;遇到缺aarch64-none-elf-gcc的情况&#xff0c;做此记录。 2. aarch64-none-elf-gcc与aarch64-linux-gnu-gcc 运行环境 aarch64-none-elf-gcc 生成的代码是 裸机程序&#xf…

【清华大学】DeepSeek政务应用场景与解决方案

目录 一、政务数字化转型三阶段演进二、人工智能政务应用场景四大方向 三、技术方案核心技术 四、解决方案案例1. 公文写作2. 合同协议智能审查3. 行政执法4. 就业指导 五、风险及对策六、落地大四步法七、未来发展展望AI职业替代逻辑空间智能与具身智能人机共生 一、政务数字化…

4.2 单相机引导机器人放料-仅考虑角度变化

【案例说明】 本案例产品在托盘中,角度变化不大(<15度);抓取没有问题,只是放的穴位只能容许3度的角度偏差,因此需要测量产品的角度。 思路是:机器人抓料后、去固定拍照位拍照(找到与标准照片的角度偏差),机器人在放料的位置上多旋转这个角度偏差,把产品放进去。 …

论文阅读笔记:Denoising Diffusion Implicit Models (3)

0、快速访问 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08;1&#xff09; 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08;2&#xff09; 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08…

Git(八)如何在同一台电脑登录两个Git

目录 一、理解 SSH 密钥机制二、具体实现步骤1.删除GIT全局配置2.生成多个 SSH 密钥3.添加公钥到 Git 账户4.配置 SSH config 文件5.测试SSH key是否生效6.下载代码 三、Git仓库级别配置四、HTTPS方式的多账号管理 引言&#xff1a; 在日常开发中&#xff0c;我们经常会遇到需要…

如何改电脑网络ip地址:一步步指导

有时我们需要更改电脑的网络IP地址以满足特定的网络需求。本文将为您提供一份详细的步骤指南&#xff0c;帮助您轻松完成电脑网络IP地址的更改。以下是更改计算机IP地址的分步指南&#xff0c;适用于常见的操作系统&#xff1a; 一、更换内网ip Windows 系统&#xff08;Win10…

PyTorch 分布式训练(Distributed Data Parallel, DDP)简介

PyTorch 分布式训练&#xff08;Distributed Data Parallel, DDP&#xff09; 一、DDP 核心概念 torch.nn.parallel.DistributedDataParallel 1. DDP 是什么&#xff1f; Distributed Data Parallel (DDP) 是 PyTorch 提供的分布式训练接口&#xff0c;DistributedDataPara…

【Unity】记录TMPro使用过程踩的一些坑

1、打包到webgl无法输入中文&#xff0c;编辑器模式可以&#xff0c;但是webgl不行&#xff0c;试过网上的脚本&#xff0c;还是不行 解决方法&#xff1a;暂时没找到 2、针对字体asset是中文时&#xff0c;overflow的效果模式处理奇怪&#xff0c;它会出现除了overflow模式以…

计算机视觉初步(环境搭建)

1.anaconda 建议安装在D盘&#xff0c;官网正常安装即可&#xff0c;一般可以安装windows版本 安装成功后&#xff0c;可以在电脑应用里找到&#xff1a; 2.创建虚拟环境 打开anaconda prompt&#xff0c; 可以用conda env list 查看现有的环境&#xff0c;一般打开默认bas…

基于聚类与引力斥力优化的选址算法

在众多实际场景中&#xff0c;诸如消防设施选址、基站布局规划以及充电桩站点部署等&#xff0c;都面临着如何利用最少的资源&#xff0c;实现对所有目标对象全面覆盖的难题。为有效解决这类问题&#xff0c;本文提出一种全新的组合算法模型 —— 基于聚类与引力斥力优化的选址…

Mac 电脑移动硬盘无法识别的解决方法

在使用 Mac 电脑的过程中&#xff0c;不少用户都遇到过移动硬盘没有正常推出&#xff0c;导致无法识别的问题。这不仅影响了数据的传输&#xff0c;还可能让人担心硬盘内数据的安全。今天&#xff0c;我们就来详细探讨一下针对这一问题的解决方法。 当发现移动硬盘无法识别时&…

LeetCode Hot100 刷题笔记(4)—— 二叉树、图论

目录 一、二叉树 1. 二叉树的深度遍历&#xff08;DFS&#xff1a;前序、中序、后序遍历&#xff09; 2. 二叉树的最大深度 3. 翻转二叉树 4. 对称二叉树 5. 二叉树的直径 6. 二叉树的层序遍历 7. 将有序数组转换为二叉搜索树 8. 验证二叉搜索树 9. 二叉搜索树中第 K 小的元素 …

【计算机视觉】YOLO语义分割

一、语义分割简介 1. 定义 语义分割&#xff08;Semantic Segmentation&#xff09;是计算机视觉中的一项任务&#xff0c;其目标是对图像中的每一个像素赋予一个类别标签。与目标检测只给出目标的边界框不同&#xff0c;语义分割能够在像素级别上区分不同类别&#xff0c;从…

【SpringBoot + MyBatis + MySQL + Thymeleaf 的使用】

目录&#xff1a; 一&#xff1a;创建项目二&#xff1a;修改目录三&#xff1a;添加配置四&#xff1a;创建数据表五&#xff1a;创建实体类六&#xff1a;创建数据接口七&#xff1a;编写xml文件八&#xff1a;单元测试九&#xff1a;编写服务层十&#xff1a;编写控制层十一…

在ensp进行OSPF+RIP+静态网络架构配置

一、实验目的 1.Ospf与RIP的双向引入路由消息 2.Ospf引入静态路由信息 二、实验要求 需求&#xff1a; 路由器可以互相ping通 实验设备&#xff1a; 路由器router7台 使用ensp搭建实验坏境&#xff0c;结构如图所示 三、实验内容 1.配置R1、R2、R3路由器使用Ospf动态路由…