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

Chapter2 : SpringBoot配置

尚硅谷SpringBoot顶尖教程

1. 全局配置文件

SpringBoot使用一个全局的配置文件 application.properties 或者 application.yml ,该配置文件放在src/main/resources目录或者类路径/config目录下面, 可以用来修改SpringBoot自动配置的默认值。

yml是YAML(YAML Ain’t Markup Language)语言的文件,参考规范http://www.yaml.org/

以前的配置文件, 大多都是使用xml文件, 比较繁重; yml则以数据为中心, 比json,xml更适合做配置文件。

2. yaml语法

2.1 基本语法

key: (空格) value 表示一对键值对儿(空格必须有)

以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级。属性和值是大小写敏感的。

server:port: 8084

2.2 值的写法

字面量: 普通的值(数字,布尔值,字符串)。字符串不用加单引号或者双引号。

双引号:不会转义字符串里面的特殊字符,特殊字符会作为本身意义表示。

name: "zhangsan \n lisi"
输出: 
zhangsan
lisi

单引号:会转义特殊字符,特殊字符最终只是一个普通的字符串数据。

name: 'zhangsan \n lisi'
输出: 
zhangsan \n lisi

对象、Map(属性和值)

对象还是key: value的形式。在下一行来写对象的属性和值,注意缩进。例如对象friends:

friends:lastName: zhangsanage: 20

对象还有行内写法:

friends: {lastName: zhangsan, age: 18}

数组(List、Set)

-值表示数组中的一个元素

animals:- cat- dog- pig

数组也有行内写法:

animals: [cat,dog,pig]

3. 配置文件值注入

3.1 @ ConfigurationProperties注入

配置文件配置内容如下:

person:age: 18boss: falsebirth: 2017/12/12maps: {k1: v1,k2: v2}lists:- lisi- wanwudog:name: 旺财age: 2last-name: zhangsan

JavaBean, 注意Person类要写setXXX()方法才会注入成功。

@Component
@ConfigurationProperties(prefix = "person")  // 优先级高于@value
public class Person implements Serializable {private String lastName;private Integer age;private Boolean boss;private Date birth;private Map<String, Object> maps;private List<Object> lists;private Dog dog;// getXXX setXXX
}

我们可以导入配置文件处理器,以后编写配置就有提示。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

yml书写效果:
在这里插入图片描述
properties文件书写效果:
在这里插入图片描述

测试结果:

Person{lastName='zhangsan', age=18, boss=false, birth=Tue Dec 12 00:00:00 CST 2017, maps={k1=v1, k2=v2}, lists=[lisi, wanwu, cat]], dog=Dog{name='旺财', age=2}}

3.2 中文乱码问题

yml或properties配置文件的参数配置为中文值,注入出现乱码问题。
在这里插入图片描述
修改系统默认配置文件的编码
在这里插入图片描述

3.3 @Value注入

JavaBean

@Component
public class Person implements Serializable {@Value("${person.last-name}")private String lastName;@Value("#{10*2}")private Integer age;@Value("true")private Boolean boss;private Date birth;// @Value不支持复杂类型
//    @Value("${person.maps}")private Map<String, Object> maps;private List<Object> lists;private Dog dog;// getXXX setXXX
}

测试结果:

Person{lastName='zhangsan', age=20, boss=true, birth=null, maps=null, lists=null, dog=null}

@ ConfigurationProperties优先级高于@Value

3.4 @ ConfigurationProperties结合@PropertySource

如果不想将person属性配置在全局配置文件(properties或yaml)中, 可以放到自定义的properties文件中。

自定义person.properties文件

person.last-name=张胜男${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=v2
person.lists=[pig,dog,cat]
person.dog.name=旺财-${person.last-name}-${person.hello:hello}
person.dog.age=2

在JavaBean类上使用@PropertySource引入自定义的properties文件。

@Component
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")  // 优先级高于@value
public class Person implements Serializable {private String lastName;private Integer age;private Boolean boss;private Date birth;private Map<String, Object> maps;private List<Object> lists;private Dog dog;// getXXX setXXX
}

测试结果:

Person{lastName='张胜男6eea5415-7d81-41a1-95be-bf72dba5b839', age=-298203675, boss=false, birth=Fri Dec 15 00:00:00 CST 2017, maps={k1=v1, k2=v2}, lists=[[pig, dog, cat]], dog=Dog{name='旺财-张胜男c650e5a0-791f-4f39-9d4f-1bea2d7527bf-hello', age=2}}

3.5 @ ConfigurationProperties结合@Bean

@ ConfigurationProperties结合@Bean可以为属性赋值 。

JavaBean

public class Dog {private String name;private Integer age;// getXXX , setXXX
}    

在全局配置文件yaml中配置dog对象的属性值。

dog:name: 旺财age: 2

在主启动类或配置类中使用@ ConfigurationProperties结合@Bean声明dog实例并给属性赋值。

@Bean
@ConfigurationProperties(prefix = "dog")
public Dog dog() {return new Dog();
}

测试结果:

Dog{name='旺财', age=2}

3.6 JSR303校验

@ConfigurationProperties结合@Validated注解支持JSR303进行配置文件属性值的校验。

pom.xml文件中需要加入相关依赖,尤其是验证依赖的实现类。

<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId>
</dependency>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.2.4.Final</version>
</dependency>

JavaBean

package com.atgugui.bean;
import org.springframework.validation.annotation.Validated;
// ....省略导入
@Component
@ConfigurationProperties(prefix = "person")  // 优先级高于@value
@Validated
public class Person implements Serializable {@Null // lastName必须为空private String lastName;private Integer age;private Boolean boss;private Date birth;private Map<String, Object> maps;private List<Object> lists;private Dog dog;// getXXX setXXX
}

启动应用报错,测试结果:

Property: person.lastNameValue: 张胜男562391e3-b84a-4d4d-ad9e-3d0322d67e94Reason: 必须为null

3.7 @Value和@ ConfigurationProperties比较

功能批量注入配置文件中的属性一个个指定
松散绑定(松散语法)支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持

如果我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,就用@Value

4. @ImportResource

读取外部配置文件,导入Spring的配置文件,让配置文件里面的内容生效。在对SSM老项目进行架构升级时可以在配置类中使用该注解将原来xml配置中的Bean维护到IOC容器中,实现与SpringBoot兼容的效果。

编写xml配置 beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="helloServiceBean" class="com.atgugui.service.HelloServiceBean"/>
</beans>

编写test测试模拟:

@SpringBootTest
@RunWith(SpringRunner.class)
class SpringBoot01HelloQuickApplicationTests {@AutowiredApplicationContext ioc;@Testpublic void testHelloService() {boolean helloServiceBean = ioc.containsBean("helloServiceBean");System.out.println(MessageFormat.format("contains helloServiceBean: {0}", helloServiceBean));}
}

没使用@ImportResouce注解的测试结果:

contains helloServiceBean: false

SpringBoot里面没有Spring的xml配置文件,我们自己编写的xml配置文件也不能自动识别。想让Spring的xml配置文件加载生效,使用@ImportResource注解。可以在主启动类添加 @ImportResource注解,指定要加载的xml配置。

@SpringBootApplication 
@ImportResource(locations = {"classpath:beans.xml"})
public class SpringBoot01HelloQuickApplication {public static void main(String[] args) {SpringApplication.run(SpringBoot01HelloQuickApplication.class, args);}
}

使用@ImportResouce注解的测试结果:

contains helloServiceBean: true

当然,SpringBoot推荐使用JavaConfig配置类的方式给容器中添加组件,不编写xml配置。

不需要编写xml配置,改用配置类实现Spring配置文件:

@Configuration
public class MyAppConfig {// 将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名@Beanpublic HelloServiceBean helloServiceBean() {System.out.println("配置类@Bean给容器中添加HelloServiceBean组件");return new HelloServiceBean();}
}

测试结果:

配置类@Bean给容器中添加HelloServiceBean组件
contains helloServiceBean: true

5. 配置文件占位符

5.1 随机数

RandomValuePropertySource 配置文件中可以使用随机数。
在这里插入图片描述

5.2 属性配置占位符

  • 可以在配置文件中引用前面配置过的属性。
  • ${person.hello:默认值} 来指定找不到属性时的默认值。

编写占位符配置:

person.last-name=张胜男${random.uuid}
person.age=${random.int}
person.dog.name=旺财-${person.last-name}-${person.hello:hello}

打印person测试结果:

Person{lastName='张胜男80eae444-2550-442c-b657-f5f6704794a3', age=1952295864, boss=false, birth=Fri Dec 15 00:00:00 CST 2017, maps={k1=v1, k2=v2}, lists=[[pig, dog, cat]], // 读取到上面的person.last-name 	${person.hello}没有就使用指定的默认值hello
dog=Dog{name='旺财-张胜男91918168-7841-41ce-9359-7129d6a866cd-hello', age=2}}

6. Profile

6.1 多profile文件形式

格式:application-{profile}.properties
application-dev.properties , application-prod.properties
然后在默认配置文件application.properties中指定加载哪个环境的配置文件:

#指定加载dev环境配置
spring.profiles.active=dev
#指定加载prod环境配置
#spring.profiles.active=prod

6.2 yml支持多profile文档块形式

使用三个短横线分割多个profile文档块,然后通过spring.profiles.active=${profile}指定加载哪个环境的配置。

spring:profiles:active: prod
---
server:port: 8081
spring:profiles: dev---
server:port: 8084
spring:profiles: prod

6.3 profile激活方式

可以在全局配置文件中指定: spring.profiles.active=dev

也可以在在命令行指定: --spring.profiles.active=dev

如果执行jar包也可以指定环境配置: java -jar xxx.jar --spring.profiles.active=dev
在这里插入图片描述

jvm参数指定配置环境 : -Dspring.profiles.active=dev
在这里插入图片描述

系统环境变量也可以指定
在这里插入图片描述

7. 配置文件加载位置

Spring Boot启动会扫描以下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件。

  • file:./config/

  • file:./

  • classpath:/config/

  • classpath:/

以上都是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。SpringBoot会从这四个位置全部加载主配置文件,互补配置。我们也可以通过配置spring.config.location来改变默认配置。

java -jar xxx.jar --spring.config.location=D:\\application.properties

8. 外部配置加载顺序

SpringBoot支持多种外部配置方式,可以从以下位置加载配置。优先级从高到低,高优先级的配置会覆盖低优先级的配置,所有的配置会形成互补配置。

  • 命令行参数, 多个参数配置用空格分开:
java -jar xxx.jar --server.port=8082 --server.context-path=/abc
  • 来自java:comp/env的JNDI属性
  • Java系统属性(System.getProperties())
  • 操作系统环境变量

jar包外jar包内寻找,优先加载带profile的配置

  • jar包外部的application-{profile}.properties或application-{profile}.yml(带spring.profile)配置文件。

  • jar包内部的application-{profile}.properties或application-{profile}.yml(带spring.profile)配置文件。

  • jar包外部的application-{profile}.properties或application-{profile}.yml(不带spring.profile)配置文件。

  • jar包内部的application-{profile}.properties或application-{profile}.yml(不带spring.profile)配置文件。

  • @Configuration注解类上的@PropertySource

  • 通过SpringApplication.setDefaultProperties指定的默认属性。
    参考官方资料: https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-external-config

9. 自动配置原理

9.1 剖析源码

  • SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration

  • @EnableAutoConfiguration作用:
    利用AutoConfigurationImportSelector给容器导入一些组件。
    可以导入selectImport()方法的内容,通过下面的方法获取候选的配置。

    AutoConfigurationImportSelector#selectImports

    @Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}try {// ...// 获取候选的配置List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);// ....}catch (IOException ex) {throw new IllegalStateException(ex);}}
    

    AutoConfigurationImportSelector#getCandidateConfigurations

    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,AnnotationAttributes attributes) {// SpringFactoriesLoader加载META-INF/spring.factories文件配置List<String> configurations = SpringFactoriesLoader.loadFactoryNames(// getSpringFactoriesLoaderFactoryClass()=EnableAutoConfiguration.classgetSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());Assert.notEmpty(configurations,"No auto configuration classes found in META-INF/spring.factories. If you "+ "are using a custom packaging, make sure that file is correct.");return configurations;
    }
    

    AutoConfigurationImportSelector#getSpringFactoriesLoaderFactoryClass

    protected Class<?> getSpringFactoriesLoaderFactoryClass() {return EnableAutoConfiguration.class;
    }
    

    SpringFactoriesLoader#loadFactoryNames(…) 扫描所有jar包类路径下META-INF/spring.factories,把扫描到的这些文件内容包装成Properties对象。

    从properties中获取EnableAutoConfiguration.class类对应的值,然后把它们加载到容器中。

    将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration.class类对应的值加入到容器中。

    public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {// EnableAutoConfiguration.class.getName()=EnableAutoConfigurationString factoryClassName = factoryClass.getName();try {// FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories"Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));// 存放解析后的候选配置List<String> result = new ArrayList<String>();while (urls.hasMoreElements()) {URL url = urls.nextElement();// 将解析的组件封装到properties对象中Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));String factoryClassNames = properties.getProperty(factoryClassName);result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));}return result;}catch (IOException ex) {throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +"] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);}}
    

    下图中每一个这样的xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中进行自动配置。
    在这里插入图片描述

9.2 案例分析

HttpEncodingAutoConfiguration为例解释自动配置原理

// 表示这是一个配置类,相当于以前的xml配置
@Configuration
// 启动指定配置类的属性配置绑定
@EnableConfigurationProperties(HttpEncodingProperties.class)
// Spring底层@Conditional注解根据不同的条件, 以及是否满足指定的条件来控制整个配置类里面的配置是否生效
@ConditionalOnWebApplication // 判断当前应用是否是web应用, 如果是web应用则生效
// 判断当前项目有没有指定的类, 如果有则生效
@ConditionalOnClass(CharacterEncodingFilter.class) // SpringMVC中解决乱码问题的过滤器
// 判断配置文件中是否存在某个配置属性,matchIfMissing=true 如果判断不存在默认也成立并生效
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {// 与SpringBoot项目的全局配置文件application.properties建立映射关系private final HttpEncodingProperties properties;// 只有一个有参构造器时, 参数的属性值就会从容器中获取public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {this.properties = properties;}@Bean// 给容器中添加一个组件,该组件的某些属性值要从this.properties中获取@ConditionalOnMissingBean(CharacterEncodingFilter.class)public CharacterEncodingFilter characterEncodingFilter() {CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();filter.setEncoding(this.properties.getCharset().name());filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));return filter;}// ....
}

以上根据当前不同的条件判断,决定这个配置类是否生效。一旦这个配置类生效,这个配置类就会给容器中添加各种组件,这些组件的属性从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的。

所有在配置文件中能配置的属性是在xxxProperties类中封装着,配置文件能配置什么就可以参照某个功能对应的这个属性类。

#我们能配置的属性都是来源于这个功能的properties类
spring.http.encoding.enabled=true
spring.http.encoding.charset=utf-8
spring.http.encoding.force=true

将SpringBoot项目全局配置文件中spring.http.encoding前缀的属性值绑定并填充到HttpEncodingProperties中.

实现属性值的绑定读取需要在启动类或配置类上添加@EnableConfigurationProperties注解开启属性绑定配置。

@ConfigurationProperties(prefix = "spring.http.encoding")
public class HttpEncodingProperties {//...
}

9.3 Conditional派生注解

@Conditional派生注解(Spring注解版原生的@Conditional作用):
必须是@Conditional指定的条件成立,才给容器中添加组件,配置里面的所有内容才会生效。

@Conditional扩展注解作用(判断是否满足当前指定条件)
@ConditionalOnJava系统的java版本是否符合要求
@ConditionalOnBean容器中存在指定Bean;
@ConditionalOnMissingBean容器中不存在指定Bean;
@ConditionalOnExpression满足SpEL表达式指定
@ConditionalOnClass系统中有指定的类
@ConditionalOnMissingClass系统中没有指定的类
@ConditionalOnSingleCandidate容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty系统中指定的属性是否有指定的值
@ConditionalOnResource类路径下是否存在指定资源文件
@ConditionalOnWebApplication当前是web环境
@ConditionalOnNotWebApplication当前不是web环境
@ConditionalOnJndiJNDI存在指定项

自动配置类必须在一定的条件下才能生效。我们如何知道哪些自动配置类生效。可以通过在全局配置文件application.properties文件中配置SpringBoot的debug模式,来让控制台打印自动配置报告,从而查看哪些自动配置类生效。

#开启SpringBoot的debug模式
debug=true

查看SpringBoot项目启动日志:

匹配上且生效的自动配置类

Positive matches:
-----------------DispatcherServletAutoConfiguration matched:- @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)- @ConditionalOnWebApplication (required) found StandardServletEnvironment (OnWebApplicationCondition)DispatcherServletAutoConfiguration.DispatcherServletConfiguration matched:- @ConditionalOnClass found required class 'javax.servlet.ServletRegistration'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)- Default DispatcherServlet did not find dispatcher servlet beans (DispatcherServletAutoConfiguration.DefaultDispatcherServletCondition)// ........

没有生效的自动配置类

Negative matches:
-----------------ActiveMQAutoConfiguration:Did not match:- @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)AopAutoConfiguration:Did not match:- @ConditionalOnClass did not find required classes 'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice' (OnClassCondition)// ..............  
2023-03-12 20:45:19.142  INFO 21220 --- [           main] c.a.SpringBoot01HelloQuickApplication    : Started SpringBoot01HelloQuickApplication in 2.672 seconds (JVM running for 4.087)  

相关文章:

Chapter2 : SpringBoot配置

尚硅谷SpringBoot顶尖教程 1. 全局配置文件 SpringBoot使用一个全局的配置文件 application.properties 或者 application.yml &#xff0c;该配置文件放在src/main/resources目录或者类路径/config目录下面&#xff0c; 可以用来修改SpringBoot自动配置的默认值。 yml是YA…...

手撕单链表练习

Topic 1&#xff1a;LeetCode——203. 移除链表元素203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09;移除链表中的数字6操作很简单&#xff0c;我们只需要把2的指向地址修改就好了&#xff0c;原来的指向地址是6现在改为3这个思路是完全正确的&#xff0c;但是在链表…...

Kubuntu安装教程

文章目录Kubuntu介绍下载Kubuntu在VMware虚拟机中安装Kubuntu1. 点击“创建新的虚拟机”2. 选择“自定义&#xff08;高级&#xff09;”3. 按照下图所示进行设置设置网络4. 点击“自定义硬件”5. 开启虚拟机6. 进入安装界面&#xff0c;选择中文&#xff0c;之后点击“安装Kub…...

[蓝桥杯] 树状数组与线段树问题(C/C++)

文章目录 一、动态求连续区间和 1、1 题目描述 1、2 题解关键思路与解答 二、数星星 2、1 题目描述 2、2 题解关键思路与解答 三、数列区间最大值 3、1 题目描述 3、2 题解关键思路与解答 标题&#xff1a;树状数组与线段树问题 作者&#xff1a;Ggggggtm 寄语&#xff1a;与其…...

Matlab-Loma Prieta 地震分析

此示例说明如何将带时间戳的地震数据存储在时间表中以及如何使用时间表函数来分析和可视化数据。 加载地震数据 示例文件quake.mat包含 1989 年 10 月 17 日圣克鲁斯山脉 Loma Prieta 地震的 200 Hz 数据。这些数据由加州大学圣克鲁斯分校查尔斯F里希特地震实验室的 Joel Yelli…...

Spring Boot全局异常处理

使用注解方式处理全局异常使用 ControllerAdvice &#xff08;RestControllerAdvice&#xff09; 配合 ExceptionHandler适用于返回数据的请求&#xff08;一般是RESTful接口规范下的JSON报文&#xff09;package com.example.exception;import org.slf4j.Logger; import org.s…...

websocket每隔5秒给服务端send一次信息

websocket轮询每隔5秒给服务端send一次信息&#xff0c;主要功能点如下&#xff1a;socket 采用了定时器 setInterval&#xff08;&#xff09; 需要清除定时器否则会报错监听了突然关闭浏览器窗口&#xff0c;destroyed里面直接监听 window.removeEventListener("beforeu…...

2023年中职网络安全——SQL注入测试(PL)解析

SQL注入测试(PL) 任务环境说明: 服务器场景:Server2312服务器场景操作系统:未知(关闭链接)已知靶机存在网站系统,使用Nmap工具扫描靶机端口,并将网站服务的端口号作为Flag(形式:Flag字符串)值提交。访问网站/admin/pinglun.asp页面,此页面存在SQL注入漏洞,使用排…...

利用蜜罐捕捉攻击实验(31)

预备知识 1、蜜罐的含义和作用 蜜罐(Honeypot)是一种在互联网上运行的计算机系统。它是专门为吸引并诱骗那些试图非法闯入他人计算机系统的人(如电脑黑客)而设计的&#xff0c;蜜罐系统是一个包含漏洞的诱骗系统&#xff0c;它通过模拟一个或多个易受攻击的主机&#xff…...

PyTorch深度学习实战 | 自然语言处理与强化学习

PyTorch是当前主流深度学习框架之一&#xff0c;其设计追求最少的封装、最直观的设计&#xff0c;其简洁优美的特性使得PyTorch代码更易理解&#xff0c;对新手非常友好。本文主要介绍深度学习领域中自然语言处理与强化学习部分。自然语言区别于计算机所使用的机器语言和程序语…...

测牛学堂:接口测试基础理论和工具的使用

接口测试流程总结 1 需求分析&#xff0c;看产品经理的需求文档 2 接口文档解析&#xff0c;开发编写的api接口文档 3 设计测试用例 4脚本开发 5 执行及缺陷跟踪 6 生成测试报告 7接口自动化持续集成 测试解析接口文档 接口文档&#xff0c;又称为api文档&#xff0c;是由后…...

定长内存池的实现

解决的是固定大小的内存申请释放需求&#xff1a; 性能达到极致不考虑内存碎片问题(统一使用自由链表管理还回来的空间) 为了避免命名污染&#xff0c;不要直接using namespace std;只展开常用的。 #include <iostream> using std::cout; using std::endl;申请空间时有…...

三更草堂springSecurity的学习

源码地址&#xff1a;学习springSecurity (gitee.com) git&#xff1a;https://gitee.com/misszyg/spring-security.git 一&#xff0c;认证流程 1&#xff0c;经过UsernamePasswordAuthenticationFilter &#xff08;1&#xff09;传入了用户的账号&#xff0c;密码 源码&a…...

【C语言】指针的深度理解(一)

前言 我们已经了解了指针的概念&#xff0c;一是指针变量是用来存放地址的&#xff0c;每个地址都对应着唯一的内存空间。二是指针的大小是固定的4或8个字节&#xff08;取决于操作系统&#xff0c;32位的占4个字节&#xff0c;64位的占8个字节&#xff09;。三是指针是有类型…...

Kafka最佳实践

前言 Kafka 最佳实践&#xff0c;涉及 典型使用场景Kafka 使用的最佳实践 Kafka 典型使用场景 Data Streaming Kafka 能够对接到 Spark、Flink、Flume 等多个主流的流数据处理技术。利用 Kafka 高吞吐量的特点&#xff0c;客户可以通过 Kafka 建立传输通道&#xff0c;把应…...

入门教程: 认识 React用于构建用户界面的 JavaScript 库

课前准备 我们将会在这个教程中开发一个小游戏。你可能并不打算做游戏开发,然后就直接跳过了这个教程——但是不妨尝试一下!你将在该教程中学到关于构建 React 应用的基础知识,掌握这些知识后,你将会对 React 有更加深刻的理解。 这篇教程分为以下几个部分: 环境准备是学…...

极紫外光源高次谐波发生腔不同区域真空度精密控制解决方案

摘要&#xff1a;在高次谐波发生器中一般包含两个不同真空区域&#xff0c;一个是1~100Torr绝压范围的气池内部的低真空区域&#xff0c;一个是高阶谐波光路上的绝压为0.001Pa量级的高真空区域。本文针对此两个区域的真空度控制提出了相应的解决方案&#xff0c;特别是详细介绍…...

「Vue面试题」在vue中为什么data属性是一个函数而不是一个对象

文章目录一、实例和组件定义data的区别二、组件data定义函数与对象的区别三、原理分析四、结论一、实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象&#xff0c;也可以是一个函数 const app new Vue({el:"#app",// 对象格式data:{foo:"…...

如何使用 ChatGPT 编写 SQL JOIN 查询

通过清晰的示例和解释&#xff0c;本文展示了 ChatGPT 如何简化和简化创建复杂 MySQL 查询的过程&#xff0c;使用户更容易与数据库交互并检索他们需要的数据。无论您是初学者还是经验丰富的开发人员&#xff0c;本文都提供了有关如何利用 ChatGPT 来增强您的 MySQL 查询编写技…...

vue2+elementUI完成添加学生删除学生案列

效果图&#xff1a; 点击添加学生按钮&#xff0c;弹出Dialog,收集用户信息&#xff1a; el-table中自定义复选框&#xff0c;选中一行&#xff0c;可以点击删除 代码区域&#xff1a;就一个HTML文件 <!DOCTYPE html> <html lang"en"> <head>&…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...