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

SpringBoot自动化配置原理

SpringBoot自动化配置原理

01-SpringBoot2高级-starter依赖管理机制

目的:通过依赖能了解SpringBoot管理了哪些starter

讲解:

  1. 通过依赖 spring-boot-dependencies 搜索 starter- 发现非常多的官方starter,并且已经帮助我们管理好了版本。

  2. 项目中使用直接引入对应的 starter 即可,这个场景下需要的依赖就会自动导入到项目中,简化了繁琐的依赖。

    如果需要修改版本可以有两种方式:

    • 重写maven属性
    • 使用Maven依赖管理的就近原则
  3. 引入 starter 不仅仅是帮助我们管理了依赖,还帮我做了很多的默认的配置信息,简化了大量的配置,使用更加的简单。

  4. 所有的场景启动器的底层都依赖 spring-boot-starter

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.3.10.RELEASE</version><scope>compile</scope>
    </dependency>
    

小结:

  • 引入官方starter依赖默认都可以不写版本
  • 如果配置满足您当前开发需要,则默认配置即可
02-SpringBoot2高级-自动化配置初体验

目的:以web MVC自动化配置原理为例讲解,能够理解web MVC自动化配置加入了哪些依赖,做了哪些默认配置。

讲解:

回忆一下:SpringMVC学习时候,我们在 SSM整合时;

添加spring及spring web mvc相关依赖

springmvc配置类:

​ 1、扫描controller层

​ 2、静态资源控制

​ 3、…

servlet容器配置类:

​ 1、扫描springmvc配置类

​ 2、扫描spring配置类

​ 3、设置哪些请求交给springmvc处理

​ 4、POST请求乱码过滤器

部署还需要单独的tomcat

也就是说:我们现在需要在开发业务代码前,就必须要准备好这些环境,否则无法完成业务代码,这就是我们现在的问题。

让这些问题成为过去,现在我们就探索一下SpringBoot是如何帮助我们完成强大而又简单自动化配置的。

引入 web 开发场景启动器依赖:

<!--web开发的起步依赖   场景启动器依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

帮助我们做了以下自动化配置:

  1. 依赖版本和依赖什么jar都不需要开发者关注
  2. 自动化配置
    • 自动配好SpringMVC
      • 引入SpringMVC全套组件
      • 自动配好SpringMVC常用组件(三大组件,文件上传等)
    • 自动配好Web常见功能,如:字符编码问题,静态资源管理
  3. 自动配好Tomcat

小结:

  • 有了SpringBoot以后,让开发人员重点关注业务本身,而不是环境上,提升了开发效率。
03-SpringBoot2高级-底层原理-@Configuration配置注解

目的:掌握@Configuration注解的作用及新特性

讲解:

1、@Configuration注解的作用是替代原始 spring配置文件 功能

演示:

1)编写配置类

package com.itheima.sh.config;import com.itheima.sh.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 1、@Configuration 替代 spring配置文件(配置bean)* 2、组件源码中包含 @Component 注解,当前类也会注册到 IOC 容器,默认类名小写* 3、默认都是单例的*/
@Configuration
public class MyConfig {@Bean   // 默认方法名称作为容器中的namepublic User getUser() {return new User();}
}

2)在引导类编写代码测试:

@SpringBootApplication
@MapperScan(basePackages = "com.itheima.sh.mapper")
public class DataApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(DataApplication.class, args);// 根据name获取容器中的beanUser user1 = applicationContext.getBean("getUser", User.class);User user2 = applicationContext.getBean("getUser", User.class);System.out.println(user1 == user2);MyConfig myConfig1 = applicationContext.getBean("myConfig", MyConfig.class);MyConfig myConfig2 = applicationContext.getBean("myConfig", MyConfig.class);System.out.println(myConfig1 == myConfig2);// 注意:如果 MYConfig配置类没有按照规范编写,则容器中bean 的name为 类名}
}

SpringBoot 提供一个注解和当前注解功能一样:@SpringBootConfiguration

2、proxyBeanMethods:代理bean的方法属性(since spring 5.2以后)

功能:

  • proxyBeanMethods = true:Full模式,保证每个@Bean方法被调用多少次返回的组件都是单实例的
  • proxyBeanMethods = false:Lite模式,每个@Bean方法被调用多少次返回的组件都是新创建的

演示:

  1. 默认 proxyBeanMethods=true,springBoot会检查这个组件是否在容器中有,有则直接引用
// 默认 proxyBeanMethods=true springBoot会检查这个组件是否在容器中有,有则直接引用
User user3 = myConfig1.getUser();
System.out.println(user1 == user3);  // true
  1. 修改 proxyBeanMethods=false,则每调用一次Spring就会创建一个新的Bean对象

在执行结果则为 false, 证明两次获取的bean不是同一个bean。

小结:

  • 组件依赖必须使用Full模式默认。
  • Full模式每次都会检查bean,效率较Lite模式慢
04-SpringBoot2高级-底层原理-@Import注解使用1

目的:能够理解@Import注解作用及4种使用方式

讲解:

作用:使用@Import导入的类会被Spring加载到IOC容器中

@Import提供4种用法:

  1. 导入Bean
  2. 导入配置类
  3. 导入 ImportSelector 实现类。一般用于加载配置文件中的类
  4. 导入 ImportBeanDefinitionRegistrar 实现类

实现:

1、导入Bean

package com.itheima.sh;import com.itheima.sh.pojo.User;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;import java.util.Map;@SpringBootApplication
@Import(User.class)  
//会自动执行当前类的构造方法创建对象,存到IOC容器, bean名称为:类的全路径public class DataApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(DataApplication.class, args);Map<String, User> map = applicationContext.getBeansOfType(User.class);System.out.println(map);User user1 = applicationContext.getBean("com.itheima.sh.pojo.User", User.class);System.out.println(user1);}
}

2、导入配置类

package com.itheima.sh;import com.itheima.sh.config.MyConfig;
import com.itheima.sh.pojo.User;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;import java.util.Map;@SpringBootApplication
@MapperScan(basePackages = "com.itheima.sh.mapper")
//@Import(User.class)
//1、会自动执行当前类的构造方法创建对象,存到IOC容器, bean名称为:类的全路径@Import(MyConfig.class)
//2、创建MyConfig bean,并且类中有 带有@Bean注解方法,创建对象存到IOC容器,bean名称为:默认方法名称
public class DataApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(DataApplication.class, args);//{getUser=com.itheima.sh.pojo.User@1b4a3a1}Map<String, User> map = applicationContext.getBeansOfType(User.class);System.out.println(map);User user1 = applicationContext.getBean("getUser", User.class);System.out.println(user1);Map<String, MyConfig> config = applicationContext.getBeansOfType(MyConfig.class);//{com.itheima.sh.config.MyConfig=com.itheima.sh.config.MyConfig@7e848aea}System.out.println(config);}
}
05-SpringBoot2高级-底层原理-@Import注解使用2

目的:讲解@Import注解使用另外两种使用方式

步骤:

  1. 导入 ImportSelector 实现类。一般用于加载配置文件中的类
  2. 导入 ImportBeanDefinitionRegistrar 实现类

实现:

导入 ImportSelector 实现类。一般用于加载配置文件中的类

1、编写 ImportSelector 实现类,MyImportSelector

2、引导类导入

package com.itheima.sh;import com.itheima.sh.config.MyImportSelector;
import com.itheima.sh.pojo.User;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;import java.util.Map;@SpringBootApplication
@MapperScan(basePackages = "com.itheima.sh.mapper")
//@Import(User.class)
//1、会自动执行当前类的构造方法创建对象,存到IOC容器, bean名称为:类的全路径//@Import(MyConfig.class)
//2、创建MyConfig bean,并且类中有 带有@Bean注解方法,创建对象存到IOC容器,bean名称为:默认方法名称@Import(MyImportSelector.class)
//3、创建MyConfig bean 名称为:类名全路径,创建带有@Bean注解方法实例,名称为:方法名称
public class DataApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(DataApplication.class, args);Map<String, MyConfig> map = applicationContext.getBeansOfType(MyConfig.class);//{com.itheima.sh.config.MyConfig=com.itheima.sh.config.MyConfig@44384b4a}System.out.println(map);Map<String, User> userMap = applicationContext.getBeansOfType(User.class);//{getUser=com.itheima.sh.pojo.User@5cc3e49b}System.out.println(userMap);}
}

导入 ImportBeanDefinitionRegistrar 实现类

1、编写 ImportBeanDefinitionRegistrar 实现类,MyImportBeanDefinitionRegistrar

package com.itheima.sh.config;import com.itheima.sh.pojo.User;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {/*** @param importingClassMetadata 导入类的元注解信息* @param registry Bean注册表*/@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();registry.registerBeanDefinition("user", beanDefinition);}
}

2、引导类测试

package com.itheima.sh;import com.itheima.sh.config.MyImportBeanDefinitionRegistrar;
import com.itheima.sh.pojo.User;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;import java.util.Map;@SpringBootApplication
@MapperScan(basePackages = "com.itheima.sh.mapper")//@Import(User.class)
//1、会自动执行当前类的构造方法创建对象,存到IOC容器, bean名称为:类的全路径//@Import(MyConfig.class)
//2、创建MyConfig bean,并且类中有 带有@Bean注解方法,创建对象存到IOC容器,bean名称为:默认方法名称//@Import(MyImportSelector.class)
//3、创建MyConfig bean 名称为:类名全路径,创建带有@Bean注解方法实例,名称为:方法名称@Import(MyImportBeanDefinitionRegistrar.class)
//4、创建Bean,名称:在registerBeanDefinition中定义
public class DataApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(DataApplication.class, args);Map<String, User> userMap = applicationContext.getBeansOfType(User.class);//{user=com.itheima.sh.pojo.User@23c7cb18}System.out.println(userMap);}
}

小结:

  • 讲解当前小节的目的主要是为源码准备
  • 还有我们也可以知道创建Bean对象,还可以使用@Import四种方式
06-SpringBoot2高级-底层原理-@Conditional衍生条件装配

目的:理解@Conditional衍生条件装配的作用

讲解:

作用:条件装配,满足Conditional指定的条件,则进行组件注入,初始化Bean对象到IOC容器

image-20210503232237027

演示:

在RedisConfig类中添加注释:

方法中定义:

类上定义:

注意:也可以添加到 类上, 满足条件则类及类中的对象生效。

小结:

  • @ConditionalOnXXX 注解存在的意义是:满足条件当前类或者Bean才有效,按需导入。
07-SpringBoot2高级-底层原理-@ConfigurationProperties配置绑定

目的:

回顾 @ConfigurationProperties配置绑定 存在的目的是:获取配置属性或者是配置文件指定前缀的属性信息,并且初始化Bean对象到 IOC 容器。

由此我们可以想:将来的配置我们可以放在配置文件中,通过这个注解来读取并封装成对象

08-SpringBoot2高级-自动化配置原理-@SpringBootApplication入口分析

目的:能够理解SpringBoot自动化配置流程中@SpringBootApplication是一个组合注解,及每一个注解的作用能够知道作用。

讲解:

1、SpringBoot是一个组合注解

2、@SpringBootConfiguration注解作用

  • @SpringBootConfiguration是对@Configuration注解的包装,proxyBeanMethods 默认配置 true, full模式(单例Bean)
  • 标识是一个配置类,所以 引导类也是配置类

3、@ComponentScan注解作用

  • 组件扫描,默认扫描的规则 引导类所在的包及其子包所有带注解的类

问题:

  1. 在引导类中配置 @Bean 注解可以吗?
  2. 为什么Controller、service类添加完注解后,不需要添加扫描包?
09-SpringBoot2高级-自动化配置原理-@EnableAutoConfiguration自动配置注解

目的:理解@EnableAutoConfiguration自动化配置核心实现注解

讲解:

1、@EnableAutoConfiguration是一个组合注解

2、@AutoConfigurationPackage注解作用

作用:利用Registrar给容器中导入一系列组件

点击 Registrar 进入到源码的 register 方法,添加 断点,测试

通过 debug 程序发现,默认情况下 将引导类的所有包及其子包的组件导入进来

3、@Import(AutoConfigurationImportSelector.class)注解作用

作用:是利用selectImports方法中的 getAutoConfigurationEntry 方法给容器中批量导入相关组件

调用流程分析:

  1. 调用AutoConfigurationImportSelector类中的selectImports方法

  2. 调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类

  3. 利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader)得到所有的组件

  4. 从META-INF/spring.factories位置来加载一个文件。

    默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件

    spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories

通过这个配置文件加载的自动配置:当前版本(2.3.10)是有127个默认的自动化配置

小结:

  • 自动化配置默认加载的配置文件在哪?
10-SpringBoot2高级-自动化配置原理-按条件开启自动配置类和配置项

目的:

  • 能够理解所有的自动化配置虽然会全部加载,底层有大量的@ConditionalOnXXX,有很多自动配置类并不能完全开启。
  • 如果配置生效了,则会加载默认的属性配置类,实现默认的对应场景的自动化配置

讲解:

1、以上通过 META-INF/spring.factories 配置文件找到所有的自动化配置类,但 是不是全部的生效的呢?很显然是不可能全部都生效的。

2、以 JdbcTemplateAutoConfiguration 为例讲解, 进入到 JdbcTemplateAutoConfiguration 自动化配置类。

//配置类,Lite模式
@Configuration(proxyBeanMethods = false)
//存在 DataSource、JdbcTemplate 类时再加载当前类
@ConditionalOnClass({DataSource.class, JdbcTemplate.class })//容器中只有一个指定的Bean,或者这个Bean是首选Bean 加载当前类
@ConditionalOnSingleCandidate(DataSource.class)//在配置类 DataSourceAutoConfiguration 之后执行
@AutoConfigureAfter(DataSourceAutoConfiguration.class)//如果条件满足:开始加载自动化配置的属性值 JdbcProperties
@EnableConfigurationProperties(JdbcProperties.class)@Import({JdbcTemplateConfiguration.class, NamedParameterJdbcTemplateConfiguration.class })
public class JdbcTemplateAutoConfiguration {}

3、JdbcProperties,用于加载默认的配置,如果配置文件配置了该属性,则配置文件就生效。

4、通过@Import导入JdbcTemplateConfiguration

//配置类,Lite模式
@Configuration(proxyBeanMethods = false)
//没有JdbcOperations类型的bean时加载当前类,而 JdbcTemplate 是 JdbcOperations 接口实现类
@ConditionalOnMissingBean(JdbcOperations.class)
class JdbcTemplateConfiguration {@Bean@PrimaryJdbcTemplate jdbcTemplate(DataSource dataSource, JdbcProperties properties) {JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);JdbcProperties.Template template = properties.getTemplate();jdbcTemplate.setFetchSize(template.getFetchSize());jdbcTemplate.setMaxRows(template.getMaxRows());if (template.getQueryTimeout() != null) {jdbcTemplate.setQueryTimeout((int) template.getQueryTimeout().getSeconds());}return jdbcTemplate;}}

验证:我们可以在我们自己的项目里面创建一个 JdbcTemplate Bean,看容器创建的Bean执行的是哪一个方法。

@Configuration
public class MyConfig {@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource){JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);System.out.println("自定义 JdbcTemplate");return jdbcTemplate;}
}

结果:保证容器中只有一个 Bean 实例

问题:

  • 这些不用的 starter 的依赖,能不能导入到我们工程里面? 为什么?
11-SpringBoot2高级-自动化配置原理-debug全流程

目的:能够理解整个SpringBoot启动的完成自动化配置及属性加载的全过程

12-SpringBoot2高级-自动化配置原理-总结

SpringBoot自动化配置流程总结:

  • 程序启动找到自动化配置包下 META-INF/spring.factoriesEnableAutoConfiguration
  • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
  • 每个自动配置类按照条件进行生效。
  • 生效的配置类就会给容器中装配很多组件
  • 只要容器中有这些组件,相当于这些功能就有了
  • 定制化配置
    • 用户直接自己@Bean替换底层的组件
    • 用户去看这个组件是获取的配置文件什么值就去修改。
xxxxAutoConfiguration
Bean组件
xxxxProperties里面取值
application.properties

开发人员使用步骤总结:

  • 引入场景依赖
  • 查看自动配置了哪些(选做)
    • 自己分析,引入场景对应的自动配置一般都生效了
    • 配置文件中debug=true开启自动配置报告。Negative(不生效)\Positive(生效)
  • 自己分析是否需要修改
  • 参照文档修改配置项,xxxxProperties绑定了配置文件的哪些。
    • 自定义加入或者替换组件,@Bean、@Component等

相关文章:

SpringBoot自动化配置原理

SpringBoot自动化配置原理 01-SpringBoot2高级-starter依赖管理机制 目的&#xff1a;通过依赖能了解SpringBoot管理了哪些starter 讲解&#xff1a; 通过依赖 spring-boot-dependencies 搜索 starter- 发现非常多的官方starter&#xff0c;并且已经帮助我们管理好了版本。 …...

2024级新生数组字符串专题题解

一、题解&#xff1a; 1.A-[NOIP2005]校门外的树_24级新生数组字符串训练题 (nowcoder.com) 这题常见的解法有两种&#xff1a; 第一种是这道题我们可以直接按照题目意思枚举 #include<bits/stdc.h> #define int long long using namespace std;int road[10010];sig…...

C++学习 虚函数,容器

一、虚函数 虚函数是C中的一种函数&#xff0c;允许子类重写父类中的函数&#xff0c;以便在运行时通过基类指针或引用调用子类的函数实现。虚函数的主要作用是实现多态性&#xff0c;这使得基类指针或引用可以根据实际指向的对象类型调用不同的函数实现。具体用法 虚函数的声…...

MacTalk 测评通义灵码,如何实现“微信表情”小功能?

作者&#xff1a;池建强&#xff0c;墨问西东创始人 前段时间&#xff0c;我写了篇墨问研发团队放弃 GitHub Copilot 的文章&#xff0c;没想到留言区一些读者推荐我们试试通义灵码&#xff0c;说它效果很不错。我呢&#xff0c;一直没腾出时间折腾。 直到月中时&#xff0c;…...

Canvas Confetti - 免费开源的五彩纸屑飞舞特效的 JS 库,多用于在网页上实现欢乐庆祝的场景

今天看科技周刊看到的一个酷炫的动效库&#xff0c;使用简单&#xff0c;视觉效果很好&#xff0c;推荐给大家。 Canvas Confetti 是一个基于 JavaScript 的特效动画库&#xff0c;可以在网页界面上轻松地实现五彩纸屑飞舞的庆祝场景特效。这个特效库封装了几种酷炫的特效&…...

[数据集][目标检测]智慧牧场猪只检测数据集VOC+YOLO格式16245张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;16245 标注数量(xml文件个数)&#xff1a;16245 标注数量(txt文件个数)&#xff1a;16245 标…...

GS-SLAM论文阅读笔记--LoopSplat

介绍 这篇文章看标题是解决GS-SLAM回环检测的&#xff0c;GS-SLAM回环检测之前文章很少&#xff0c;但他对于SLAM又很重要&#xff0c;确实值得阅读一番。而且这些作者的学校又是很厉害的。 文章目录 介绍1.背景介绍2.关键内容2.1 Gaussian Splatting SLAM2.2 Gaussian Splat…...

Mysql数据库表结构迁移PostgreSQL

1、背景&#xff1a; 公司本来用的数据库都是mysql&#xff0c;为了国产化适配兼容pg和dm。dm提供了数据迁移工具&#xff0c;可以直接做数据迁移&#xff0c;生成脚本之后在其他环境执行。但是pg貌似没有工具能直接用。navicat由于版权问题公司也用不了。pgloader使用总是有问…...

店匠科技携手Stripe共谋电商支付新篇章

在全球电商行业蓬勃发展的背景下,支付环节作为交易闭环的核心,其重要性日益凸显。随着消费者对支付体验要求的不断提高,以及跨境电商的迅猛发展,支付市场正经历着前所未有的变革与挑战。在这一充满机遇与竞争的领域,店匠科技(Shoplazza)凭借其创新的嵌入式支付解决方案—— Sho…...

大众(奥迪)汽车继电器编号对照表

数字功能放大器零件编号1化油器进气歧管加热器40a1719063832燃油泵(CE1 MK1 Golf 和 Early Rocco/cabrio K-Jet,无转速限制器)-443906059A 321906059D/E3燃油泵(CE1 MK1 Golf 和 Early Rocco/cabrio K-Jet,无转速限制器)-4439060594安全带警告继电器5早期 MFA 时钟的换档…...

《佛脚闪卡watch》——Apple Watch上的高效学习助手

在快节奏的生活环境中&#xff0c;时间管理成为了学习成功的关键因素之一。**《佛脚闪卡watch》**是一款专为Apple Watch设计的应用程序&#xff0c;旨在帮助学生和自学者更高效地利用碎片时间进行学习。无论是等待公交、散步还是短暂休息&#xff0c;您都可以随时随地进行复习…...

六、桥接模式

桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在将抽象与实现分离&#xff0c;使得两者可以独立变化。通过使用桥接模式&#xff0c;可以避免在多个维度上进行继承&#xff0c;降低代码的复杂度&#xff0c;从而提高系统的可扩展性。 组成…...

Vue eslint 语法检测问题

1. 修改 prettier 配置文件 确保你的项目中有 .prettierrc 配置文件&#xff0c;并在其中添加或修改 endOfLine 设置为 lf&#xff0c;确保统一使用 LF 换行符。 在 .prettierrc 文件中添加&#xff1a; {"endOfLine": "lf" }2. 修改 .editorconfig 文件…...

QT Creater实现国庆节主题项目【0基础完成版】

本文适用对象 想要学习qt creater的小白;想要学习c++制作软件的编程爱好者。可以先下载这篇博客绑定的资源,然后一边操作,一边学习,会更高效~0. 创建初始项目 一步步来操作吧,首先下载qt creter,之前发布过相关资源,大家直接查找下载,或者自行下载。 1. 初始代码 mai…...

Qt 加载 WPS 时提示要登录

项目中Qt加载word时 默认用wps打开word文档 程序一运行老是提示要立即登录 看着很烦 可以按下面的方法去掉这个烦人的东西 在下面的项目中新建字符串enableforceloginforfirstinstalldevice&#xff0c;值为false即可。...

vue3的el-tree的default-checked-keys无法勾选的问题解决

前言:有些树形控件是需要默认勾选的 但是请求后渲染不显示 刷新外部的key值也没有用 看了一下文档 我们使用自带的方法来解决 <el-treenode-key"id":data"state.parentMenuList":default-checked-keys"state.checkIdList":check-on-click-n…...

class 5: vue.js 3 v-model和表单输入

v-model是Vue.js 3中用于实现双向绑定的重要指令&#xff0c;双向绑定就是对于数据的修改会映射回UI组件上&#xff0c;同时对于UI组件上数据的变更也会映射回底层数据当中&#xff0c;v-model会根据控件的类型自动选取正确的方法来更新元素v-model底层实现的原理实际上是v-bin…...

了解一下HTTP 与 HTTPS 的区别

介绍&#xff1a; HTTP是超文本传输协议。规定了客户端&#xff08;通常是浏览器&#xff09;和服务器之间如何传输超文本&#xff0c;也就是包含链接的文本。通常使用TCP【1】/IP协议来传输数据&#xff0c;默认端口为80。 HTTPS是超文本传输安全协议&#xff0c;具有CA证书。…...

Opencv中的直方图(1)计算反向投影直方图函数calcBackProject()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算直方图的反向投影。 cv::calcBackProject 函数计算直方图的反向投影。也就是说&#xff0c;类似于 calcHist&#xff0c;在每个位置 (x, y)…...

VUE3项目的几种创建方式

文章目录 1.使用 Vue CLI (Vue Command Line Interface):2.使用 Create Vue App:3.使用 Vite:4.使用图形用户界面 (GUI):5.纯手工搭建6.基于模板创建: 1.使用 Vue CLI (Vue Command Line Interface): Vue CLI 是官方推荐的方式来快速搭建 Vue 项目的基础结构。命令&#xff1a…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...