一文掌握SpringBoot注解之@Configuration知识文集(5)

news2024/11/18 17:47:59

在这里插入图片描述

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。
🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。
🎉欢迎 👍点赞✍评论⭐收藏

🔎 SpringBoot 领域知识 🔎

链接专栏
SpringBoot 注解专业知识学习一SpringBoot 注解专栏
SpringBoot 注解专业知识学习二SpringBoot 注解专栏
SpringBoot 注解专业知识学习三SpringBoot 注解专栏
SpringBoot 注解专业知识学习四SpringBoot 注解专栏
SpringBoot 注解专业知识学习五SpringBoot 注解专栏
SpringBoot 注解专业知识学习六SpringBoot 注解专栏

文章目录

    • 🔎 SpringBoot 注解 @Configuration 学习(5)
      • 🍁 41. 如何在配置类中配置负载均衡(Load Balancing)?
      • 🍁 42. 如何在配置类中配置断路器(Circuit Breaker)?
      • 🍁 43. 如何在配置类中配置降级处理(Fallback)?
      • 🍁 44. 如何在配置类中配置消息驱动(Message Driven)?
      • 🍁 45. 如何在配置类中配置任务调度(Job Scheduling)?
      • 🍁 46. 如何在配置类中配置分布式缓存(Distributed Caching)?
      • 🍁 47. 如何在配置类中配置分布式锁(Distributed Locking)?
      • 🍁 48. 是否可以在配置类中使用@Component注解?
      • 🍁 49. 如何在配置类中使用条件化注解(例如@ConditionalOnProperty)?
      • 🍁 50. 如何在配置类中使用外部配置文件(例如application.properties)?


🔎 SpringBoot 注解 @Configuration 学习(5)

在这里插入图片描述


🍁 41. 如何在配置类中配置负载均衡(Load Balancing)?

在Spring Cloud中,你可以使用Spring Cloud Netflix Ribbon来实现负载均衡。下面是一个在配置类中配置负载均衡的示例代码:

首先,确保在你的项目中引入了Spring Cloud Netflix Ribbon的依赖。你可以在你的构建工具(如Maven或Gradle)中添加以下依赖:

Maven:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

Gradle:

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-ribbon'

接下来,在你的配置文件中配置负载均衡的属性。你可以在application.properties或application.yml中添加以下配置:

application.properties:

my-service.ribbon.listOfServers=server1:8080,server2:8080

application.yml:

my-service:
  ribbon:
    listOfServers: server1:8080,server2:8080

上述示例中,我们使用my-service.ribbon.listOfServers属性指定了要负载均衡的服务器列表。每个服务器由主机名和端口组成,使用逗号分隔。

此外,你还可以创建一个配置类,并使用@RibbonClient注解来配置Ribbon的客户端。以下是一个示例:

import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Configuration;

@Configuration
@RibbonClient(name = "my-service", configuration = MyServiceRibbonConfig.class)
public class RibbonConfig {
    // 在此配置属性和bean定义
}

在上面的示例中,我们创建了一个名为RibbonConfig的配置类,并使用@RibbonClient注解来配置名为my-service的Ribbon客户端,同时引用了一个名为MyServiceRibbonConfig的自定义配置类。

在自定义配置类中,你可以使用@Bean注解定义一个负载均衡策略,例如:

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;

public class MyServiceRibbonConfig {
    @Bean
    public IRule ribbonRule() {
        return new RandomRule(); // 使用随机负载均衡策略
    }
}

在上述示例中,我们使用@Bean注解定义了一个名为ribbonRule的Bean,并返回了RandomRule作为负载均衡策略。

通过以上配置,你就完成了在配置类中配置负载均衡的过程。当你通过Ribbon来调用服务时,它将根据负载均衡策略选择相应的服务器进行请求。


🍁 42. 如何在配置类中配置断路器(Circuit Breaker)?

在Spring Cloud中,你可以使用Spring Cloud Circuit Breaker来实现断路器。下面是一个在配置类中配置断路器的示例代码:

首先,确保在你的项目中引入了Spring Cloud Circuit Breaker的依赖。你可以在你的构建工具(如Maven或Gradle)中添加以下依赖:

Maven:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-circuitbreaker</artifactId>
</dependency>

Gradle:

implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker'

接下来,在你的配置类中使用@EnableCircuitBreaker注解来启用断路器。以下是一个示例:

import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCircuitBreaker
public class CircuitBreakerConfig {
    // 在此配置属性和bean定义
}

在上述示例中,我们创建了一个名为CircuitBreakerConfig的配置类,并使用@EnableCircuitBreaker注解来启用断路器。

接下来,你可以在需要使用断路器的方法上使用@CircuitBreaker注解来标记。以下是一个示例:

import org.springframework.cloud.circuitbreaker.annotation.CircuitBreaker;

@CircuitBreaker(name = "myCircuitBreaker", fallbackMethod = "fallbackMethod")
public String myMethod() {
    // 调用可能触发断路器的代码
}

public String fallbackMethod(Throwable t) {
    // 处理断路器触发后的回退逻辑
}

在上述示例中,我们使用@CircuitBreaker注解来标记myMethod()方法,指定了断路器的名称为myCircuitBreaker,并指定了一个回退方法fallbackMethod()来处理断路器触发后的回退逻辑。

通过以上配置,你就完成了在配置类中配置断路器的过程。当调用被@CircuitBreaker注解标记的方法时,断路器将对调用进行监控,当调用达到一定的错误阈值时,断路器将触发,并执行回退逻辑。


🍁 43. 如何在配置类中配置降级处理(Fallback)?

在Spring Cloud中,你可以使用Hystrix来实现降级处理(Fallback)。下面是一个在配置类中配置降级处理的示例代码:

首先,确保在你的项目中引入了Spring Cloud Hystrix的依赖。你可以在你的构建工具(如Maven或Gradle)中添加以下依赖:

Maven:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

Gradle:

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix'

接下来,在你的配置类中使用@EnableCircuitBreaker注解来启用断路器和降级处理。以下是一个示例:

import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCircuitBreaker
public class HystrixConfig {
    // 在此配置属性和bean定义
}

在上述示例中,我们创建了一个名为HystrixConfig的配置类,并使用@EnableCircuitBreaker注解来启用断路器和降级处理。

接下来,你可以在需要使用降级处理的方法上添加@HystrixCommand注解,并指定一个降级方法来处理调用失败时的回退逻辑。以下是一个示例:

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

@HystrixCommand(fallbackMethod = "fallbackMethod")
public String myMethod() {
    // 调用可能失败的代码
}

public String fallbackMethod() {
    // 处理降级逻辑的方法
    // 返回默认的回退结果
}

在上述示例中,我们使用@HystrixCommand注解来标记myMethod()方法,并指定了一个降级方法fallbackMethod()用于处理调用失败时的回退逻辑。

通过以上配置,当调用被@HystrixCommand注解标记的方法时,如果发生失败或超时等问题,Hystrix将触发降级逻辑,调用并执行降级方法。


🍁 44. 如何在配置类中配置消息驱动(Message Driven)?

在Spring应用程序中,你可以使用Spring Integration来实现消息驱动(Message Driven)的配置。下面是一个在配置类中配置消息驱动的示例代码:

首先,确保在你的项目中引入了Spring Integration的依赖。你可以在你的构建工具(如Maven或Gradle)中添加以下依赖:

Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-integration</artifactId>
</dependency>

Gradle:

implementation 'org.springframework.boot:spring-boot-starter-integration'

接下来,你可以在你的配置类中使用@EnableIntegration@IntegrationComponentScan注解来启用Spring Integration和扫描你的消息驱动组件。以下是一个示例:

import org.springframework.context.annotation.Configuration;
import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.config.EnableIntegrationManagement;
import org.springframework.integration.annotation.IntegrationComponentScan;

@Configuration
@EnableIntegration
@EnableIntegrationManagement
@IntegrationComponentScan
public class MessageDrivenConfig {
    // 在此配置消息驱动的组件
}

在上述示例中,我们创建了一个名为MessageDrivenConfig的配置类,并使用@EnableIntegration@EnableIntegrationManagement@IntegrationComponentScan注解来启用Spring Integration和扫描你的消息驱动组件。

接下来,你可以使用@MessagingGateway注解在接口上定义一个消息驱动的网关。以下是一个示例:

import org.springframework.integration.annotation.MessagingGateway;

@MessagingGateway
public interface MyGateway {
    void sendMessage(String message);
}

在上述示例中,我们定义了一个MyGateway接口并用@MessagingGateway注解标记,使其成为一个消息驱动的网关。

通过以上配置,你可以在应用程序中使用MyGateway接口来发送消息,Spring Integration将负责处理和路由这些消息。


🍁 45. 如何在配置类中配置任务调度(Job Scheduling)?

在Spring应用程序中,你可以使用Spring的任务调度(Job Scheduling)功能来配置定时任务。下面是一个在配置类中配置任务调度的示例代码:

首先,确保在你的项目中引入了Spring的任务调度依赖。你可以在你的构建工具(如Maven或Gradle)中添加以下依赖:

Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

Gradle:

implementation 'org.springframework.boot:spring-boot-starter-quartz'

接下来,你可以在你的配置类中使用@EnableScheduling注解来启用任务调度。以下是一个示例:

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@EnableScheduling
public class JobSchedulingConfig {
    // 在此配置任务调度的任务
}

在上述示例中,我们创建了一个名为JobSchedulingConfig的配置类,并使用@EnableScheduling注解来启用任务调度。

接下来,你可以在你的配置类中使用@Scheduled注解来定义定时任务方法和调度策略。以下是一个示例:

import org.springframework.scheduling.annotation.Scheduled;

@Configuration
@EnableScheduling
public class JobSchedulingConfig {

    @Scheduled(fixedDelay = 1000) // 每隔1秒执行一次
    public void myScheduledTask() {
        // 你的任务逻辑
    }
}

在上述示例中,我们定义了一个名为myScheduledTask的定时任务方法,并使用@Scheduled注解来指定任务的调度策略。在这个例子中,我们使用fixedDelay属性来指定任务的调度间隔时间为1秒。

通过以上配置,你可以在应用程序中使用任务调度来实现定时任务的执行。


🍁 46. 如何在配置类中配置分布式缓存(Distributed Caching)?

在Spring应用程序中,你可以使用Spring提供的缓存抽象来配置分布式缓存。下面是一个在配置类中配置分布式缓存的示例代码:

首先,确保在你的项目中引入了Spring的缓存依赖。你可以在你的构建工具(如Maven或Gradle)中添加以下依赖:

Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

Gradle:

implementation 'org.springframework.boot:spring-boot-starter-cache'

接下来,在你的配置类中使用@EnableCaching注解来启用缓存。以下是一个示例:

import org.springframework.context.annotation.Configuration;
import org.springframework.cache.annotation.EnableCaching;

@Configuration
@EnableCaching
public class DistributedCachingConfig {
    // 在此配置分布式缓存相关的配置
}

在上述示例中,我们创建了一个名为DistributedCachingConfig的配置类,并使用@EnableCaching注解来启用缓存。

接下来,你可以在你的配置类中配置你所选择的分布式缓存提供者。一种常见的选择是使用Redis作为分布式缓存提供者。以下是一个示例:

import org.springframework.context.annotation.Configuration;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@EnableCaching
public class DistributedCachingConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }
}

在上述示例中,我们配置了一个Redis连接工厂(LettuceConnectionFactory),以及一个Redis模板(RedisTemplate)来处理缓存操作。我们使用了StringRedisSerializer来序列化缓存的键,而使用GenericJackson2JsonRedisSerializer来序列化缓存的值。你可以根据自己的需求选择相应的序列化器。这些Bean是为了支持Spring的缓存抽象而创建的。


🍁 47. 如何在配置类中配置分布式锁(Distributed Locking)?

在Spring应用程序中配置分布式锁可以使用不同的分布式锁实现库。以下是配置Spring应用程序中使用Redis作为分布式锁的示例代码:

首先,确保在你的项目中引入了Spring的缓存和Redis依赖。你可以在你的构建工具(如Maven或Gradle)中添加以下依赖:

Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Gradle:

implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

接下来,在你的配置类中配置Redis作为分布式锁提供者。以下是一个示例:

import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class DistributedLockingConfig {

    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(connectionFactory);
        return stringRedisTemplate;
    }
}

在上述示例中,我们配置了一个Redis连接工厂(RedisConnectionFactory),以及一个Redis模板(RedisTemplate)来处理缓存操作。我们使用了StringRedisSerializer来序列化缓存的键,而使用GenericJackson2JsonRedisSerializer来序列化缓存的值。同时,我们也配置了一个StringRedisTemplate来处理字符串类型的缓存操作。你可以根据自己的需求选择相应的序列化器。这些Bean是为了支持Spring的缓存抽象和分布式锁抽象而创建的。

在此配置后,你可以在你的应用程序中使用Redis实现的分布式锁,例如:

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.SessionCallback;

public class DistributedLockingService {

    private RedisTemplate<String, Object> redisTemplate;

    public DistributedLockingService(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void performLockedOperation(String lockKey) {
        redisTemplate.execute(new SessionCallback<Object>() {
            @Override
            public Object execute(RedisOperations operations) throws DataAccessException {
                String lock = acquireLock(lockKey);
                if (lock != null) {
                    try {
                        // 在此执行需要加锁的操作
                    } finally {
                        releaseLock(lockKey, lock);
                    }
                } else {
                    // 无法获取锁,执行相应的逻辑(例如抛出错误)
                }
                return null;
            }

            private String acquireLock(String lockKey) {
                // 使用Redis操作获取分布式锁,例如通过SET命令实现
            }

            private void releaseLock(String lockKey, String lockValue) {
                // 使用Redis操作释放分布式锁,例如通过DEL命令实现
            }
        });
    }
}

在上述示例中,我们使用RedisTemplate来执行带有锁的操作。在performLockedOperation方法中,我们使用redisTemplate.execute方法在一个Redis事务内执行操作。在事务中,我们首先尝试获取锁。如果成功获取到锁,我们执行所需的操作,然后释放锁。如果无法获取到锁,则执行相应的逻辑(例如抛出错误)。


🍁 48. 是否可以在配置类中使用@Component注解?

可以在配置类中使用@Component注解。在Spring中,@Component注解是用来标识一个类为Spring的组件,并且会被Spring框架自动扫描到并管理。

配置类是用于配置和定义Spring应用程序的类,通常用于声明和管理其他bean的创建和组装。可以通过在配置类上使用@Component注解,将该类纳入Spring的组件扫描范围内,使其成为一个被Spring管理的组件。

除了@Component注解外,还有其他一些类似的注解可以在配置类中使用,例如@Service、@Repository和@Controller等。它们都是@Component注解的派生注解,用于表示不同角色的组件。根据具体的应用场景和语义,选择合适的注解来标识配置类是很常见的操作。


🍁 49. 如何在配置类中使用条件化注解(例如@ConditionalOnProperty)?

要在配置类中使用条件化注解,例如@ConditionalOnProperty,可以按照以下步骤进行操作:

  1. 导入必要的依赖:确保项目中有spring-boot-starter或spring-boot-autoconfigure等相关依赖。

  2. 添加@Component或@Configuration注解:将配置类标记为一个Spring组件或配置类。

  3. 在配置类的方法上添加@ConditionalOnProperty注解:例如,在希望根据某个配置属性进行条件判断的方法上添加@ConditionalOnProperty注解。该注解接受一组参数来定义条件。例如,你可以使用@ConditionalOnProperty(name = "my.property", havingValue = "true")来表示当名为"my.property"的配置属性值为"true"时,才会创建和初始化该方法所负责的bean。

  4. 配置属性文件:在应用的配置属性文件(例如application.properties或application.yml)中定义所需的配置属性。使用my.property=true来设置"my.property"属性的值为"true"。

通过以上步骤,配置类中的方法将会根据指定的条件进行条件化的创建和初始化。在上述示例中,当配置属性"my.property"的值为"true"时,才会创建和初始化带有@ConditionalOnProperty注解的方法所负责的bean。

🍁 50. 如何在配置类中使用外部配置文件(例如application.properties)?

要在配置类中使用外部配置文件,你可以按照以下步骤进行操作:

  1. 确保你的项目中有适当的依赖:确保项目中有spring-boot-starter或spring-boot-autoconfigure等相关依赖,这些依赖通常会包含对外部配置文件的支持。

  2. 创建一个配置类:使用@Configuration注解标记一个类,表示它是一个配置类。

  3. 添加@ConfigurationProperties注解:在配置类上添加@ConfigurationProperties注解,并指定要绑定的配置文件前缀。例如,如果你希望绑定application.properties文件中以"myapp"为前缀的配置属性,可以在配置类上添加@ConfigurationProperties注解,并将prefix属性设置为"myapp"。

  4. 创建配置属性类:创建一个类,用于存储要绑定的配置属性。在这个类中,你可以使用相应的注解(如@JsonProperty)将属性与配置文件中的属性进行绑定。

  5. 在配置类中注入配置属性类:在配置类中使用@Autowired注解将配置属性类注入到需要配置属性的地方。

  6. 在外部配置文件中设置属性:在配置文件(例如application.properties)中设置要使用的属性及其值。使用"myapp.xxx=yyy"的格式,其中"myapp"为配置文件前缀,"xxx"为配置属性名,"yyy"为属性值。

完成以上步骤后,配置类中的属性将会从外部配置文件中读取对应的属性值,并将其注入到使用@Autowired注解的位置。这样,你就可以在配置类中使用外部配置文件中的属性了。请确保外部配置文件的位置和命名正确,以便Spring能够正确地加载和解析它们。

在这里插入图片描述

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

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

相关文章

C++后端开发之Sylar学习三:VSCode连接Ubuntu配置Gitee

C后端开发之Sylar学习三&#xff1a;VSCode连接Ubuntu配置Gitee 为了记录学习的过程&#xff0c;学习Sylar时写的代码统一提交到Gitee仓库中。 Ubuntu配置Gitee 安装git sudo apt-get install -y git配置用户名和邮箱 git config --global user.name 用户名 …

计算机项目SpringBoot项目 办公小程序开发

从零构建后端项目、利用UNI-APP创建移动端项目 实现注册与登陆、人脸考勤签到、实现系统通知模块 实现会议管理功能、完成在线视频会议功能、 发布Emos在线办公系统 项目分享&#xff1a; SpringBoot项目 办公小程序开发https://pan.baidu.com/s/1sYPLOAMtaopJCFHAWDa2xQ?…

第四讲 混合背包问题

【题意分析】 这道题转换一下即可&#xff0c;将题中出现的0/1背包问题和完全背包问题转换为多重背包问题即可&#xff1a; if(s -1) s 1; else if(!s) s V/v;【参考文献】 第三讲 多重背包问题②——二进制优化 完成这个转换之后&#xff0c;再使用二进制优化即可完成&a…

Java 学习和实践笔记(1)

2024年&#xff0c;决定好好学习计算机语言Java. B站上选了这个课程&#xff1a;【整整300集】浙大大佬160小时讲完的Java教程&#xff08;学习路线Java笔记&#xff09;零基础&#xff0c;就从今天开始学吧。 在这些语言中&#xff0c;C语言是最基础的语言&#xff0c;绝大多…

PYthon进阶--网页采集器(基于百度搜索的Python3爬虫程序)

简介&#xff1a;基于百度搜索引擎的PYthon3爬虫程序的网页采集器&#xff0c;小白和爬虫学习者都可以学会。运行爬虫程序&#xff0c;输入关键词&#xff0c;即可将所搜出来的网页内容保存在本地。 知识点&#xff1a;requests模块的get方法 一、此处需要安装第三方库reques…

华为OD机试真题C卷-篇3

文章目录 查找一个有向网络的头节点和尾节点幼儿园篮球游戏 查找一个有向网络的头节点和尾节点 在一个有向图中&#xff0c;有向边用两个整数表示&#xff0c;第一个整数表示起始节点&#xff0c;第二个整数表示终止节点&#xff1b;图中只有一个头节点&#xff0c;一个或者多…

K8S之标签的介绍和使用

标签 标签定义标签实操1、对Node节点打标签2、对Pod资源打标签查看资源标签删除资源标签 标签定义 标签就是一对 key/value &#xff0c;被关联到对象上。 标签的使用让我们能够表示出对象的特点&#xff0c;比如使用在Pod上&#xff0c;能一眼看出这个Pod是干什么的。也可以用…

Flink cdc3.0动态变更表结构——源码解析

文章目录 前言源码解析1. 接收schema变更事件2. 发起schema变更请求3. schema变更请求具体处理4. 广播刷新事件并阻塞5. 处理FlushEvent6. 修改sink端schema 结尾 前言 上一篇Flink cdc3.0同步实例 介绍了最新的一些功能和问题&#xff0c;本篇来看下新功能之一的动态变更表结…

【华为】GRE Over IPsec 实验配置

【华为】GRE Over IPsec 实验配置 前言报文格式 实验需求配置拓扑GRE配置步骤IPsec 配置步骤R1基础配置GRE 配置IPsec 配置 ISP_R2基础配置 R3基础配置GRE 配置IPsec 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立IPsec 隧道建立Ping 配置文档 前言 GRE over IPSec可利用GRE和IP…

什么是MVVM模型

MVVM&#xff08;Model-View-ViewModel&#xff09;是一种用于构建 Web 前端应用程序的架构模式。它是从传统的 MVC&#xff08;Model-View-Controller&#xff09;模型演变而来&#xff0c;旨在解决界面逻辑与业务逻辑之间的耦合问题。 在传统的 MVC 架构中&#xff0c;View …

SQL 表信息 | 统计 | 脚本

介绍 统计多个 SQL Server 实例上多个数据库的表大小、最后修改时间和行数&#xff0c;可以使用以下的 SQL 查询来获取这些信息。 脚本 示例脚本&#xff1a; DECLARE Query NVARCHAR(MAX)-- 创建一个临时表用于存储结果 CREATE TABLE #TableSizes (DatabaseName NVARCHAR…

小白水平理解面试经典题目LeetCode 20. Valid Parentheses【栈】

20.有效括号 小白渣翻译 给定一个仅包含字符 ‘(’ 、 ‘)’ 、 ‘{’ 、 ‘}’ 、 ‘[’ 和 ‘]’ &#xff0c;判断输入字符串是否有效。 输入字符串在以下情况下有效&#xff1a; 左括号必须由相同类型的括号封闭。 左括号必须按正确的顺序关闭。 每个右括号都有一个对…

error getting ip from ipam: operation get is not supported on blockkey

无论是否通过注释指定ip&#xff0c;都不支持cni Claim操作。 查了好久。发现是版本问题&#xff0c;我的calico版本太老了。是3.5的calico &#xff0c;使用 kubernetes 数据存储时&#xff0c;不支持 Calico IPAM。 需要更新calico到3.6以上&#xff0c;支持 kubernetes 数…

【QT】opcuaServer 的构建

【QT】opcuaServer 的构建 前言opcuaServer实现测试 前言 在博文【opcua】从编译文件到客户端的收发、断连、节点查询等实现 中&#xff0c;我们已经介绍了如何在QT 中创建opucaClient 。在本期的博文中&#xff0c;我们基于之前的部署环境&#xff0c;介绍一下如何构建opcuaS…

【DDD】学习笔记-数据实现模型

SQL 与存储过程 倘若选择关系型数据库&#xff0c;组成数据实现模型的主力军是 SQL 语句&#xff0c;这是我们不得不面对的现实。毕竟&#xff0c;针对数据建模的实现者大多数担任 DBA 角色&#xff0c;他&#xff08;她&#xff09;们掌握的操作数据的利器就是 SQL。正如前面…

【算法与数据结构】583、72、LeetCode两个字符串的删除操作+编辑距离

文章目录 一、583、两个字符串的删除操作二、72、编辑距离三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、583、两个字符串的删除操作 思路分析&#xff1a;本题的思路和115、不同的子序列差不多&#xff0c;只是变成…

【RT-DETR有效改进】可视化热力图 | 支持自定义模型、置信度选择等功能(论文必备)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的机制是的是RT-DETR可视化热力图功能,热力图作为我们论文当中的必备一环,可以展示出我们呈现机制的有效性,同时支持视频讲解,本文的内容是根据检测头的输出内容,然后来绘图。 在开始之前…

本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目

本地部署TeamCity 本地部署TeamCity打包发布GitLab管理的.NET Framework 4.5.2的web项目部署环境配置 TeamCity 服务器 URLTeamCity 上 GitLab 的相关配置GitLab 链接配置SSH 配置项目构建配置创建项目配置构建步骤构建触发器结语本地部署TeamCity打包发布GitLab管理的.NET Fra…

【BIAI】Lecture 13 - Language processing

Language processing 专业术语 Aphasia 失语症 fMRI 功能性磁共振成像 auditory cortex 听觉皮层 motor cortex 运动皮层 primary visual cortex 初级视觉皮层 permotor cortex 前运动皮层 课程概要 What is language 语言是一种用词汇按照语法规则组合来表示和交流信息的系统…

【教学类-46-05】吉祥字门贴5.0(华光彩云_CNKI 文本框 空心字涂色 ,繁简都可以,建议简体)

作品展示 背景需求&#xff1a; 1、制作了空心字的第1款 华光通心圆_CNKI &#xff0c;发现它不能识别某些简体字&#xff0c;但可以识别他们的繁体字&#xff08;繁体为准&#xff09; 【教学类-46-01】吉祥字门贴1.0&#xff08;华光通心圆_CNKI 文本框 空心字涂色&#xf…