02-SpringBoot基础

news2024/12/28 18:59:28

一、回顾

二、知识目标

SpringBoot概述【了解】
SpringBoot快速入门【掌握】
SpringBoot启动原理【重点】
SpringBoot配置文件【掌握】
SpringBoot属性注入【掌握】

三、为什么使用SpringBoot?

-SSM开发有哪些痛点?

1、在早期我们都是使用的是SSM来完成Web的开发的,应该都知道,当时采用的是XML配置文件,特别的多,整合起来非常复杂
2、特别容易出错,出现问题不好排查
3、不方便快速集成第三方的类库
4、需要放入外部的web容器中启动

-SpringBoot有哪些优点?

1、快速构建项目,目录结构一键生成
2、大量场景启动器,方便快速依赖第三方环境,并且没有依赖冲突问题
3、去除了繁琐的XML,采用注解配置
4、无需外部的启动web容器,内嵌tomcat,jetty等web容器,一键启动

四、什么是SpringBoot?

	Spring Boot 是由 Pivotal 团队提供的基于 Spring 的全新框架,其设计目的是为了简化 Spring 应用的搭建和开发过程。该框架遵循『约定大于配置』原则,采用特定的方式进行配置,从而使开发者无需定义大量的 XML 配置。通过这种方式,Spring Boot 致力于在蓬勃发展的快速应用开发领域成为领导者。
	SpringBoot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品,人们把Spring Boot称为搭建程序的『**脚手架**』。其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注于业务而非配置。我们可以使用SpringBoot创建java应用,并使用java –jar 启动它,就能得到一个生产级别的web工程。

五、如何使用SpringBoot?

1、搭建SpringBoot工程

第1步:创建maven控制台项目

创建一个 Maven 控制台项目,但是『不用』勾选 Create from archetype 。截止目前为止,该项目与 SpringBoot 还没有任何关系。
在这里插入图片描述

第2步:引入依赖

Spring Boot 提供了一个名为 spring-boot-starter-parent 的工程,里面已经对各种常用依赖(并非全部)的版本进行了管理,我们的项目需要以这个项目为父工程,这样我们就不用操心依赖的版本问题了,需要什么依赖,直接引入坐标即可!

  • 添加父工程坐标

    	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
    </parent>
    
  • 添加 web 启动器

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

    需要注意的是,我们并没有在这里指定版本信息。因为 Spring Boot 的 父工程 已经对版本进行了管理了,见后面讲解
    在这里插入图片描述
    这些都是 Spring Boot 根据 spring-boot-starter-web 这个依赖自动引入的,而且所有的版本都已经管理好,不会出现冲突。

  • 完整 pom

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>cn.woniu</groupId>
        <artifactId>springboot-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.7.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    </project>
    

    有时候,你不想,甚至是不能使用 spring-boot-starter-parent 作为你的父项目。例如,在父子模块项目中,你本身就有自己的父亲。这种情况下,你需要使用别的方式来使用 spring boot。见最后

2、创建类

​ SpringBoot 项目通过 main 函数即可启动,我们需要创建一个启动类,该类必须建在最大的包中

/**
 * SpringBoot启动类
 */
@SpringBootApplication
public class ApplicationApp {

    public static void main(String[] args) {
        SpringApplication.run(ApplicationApp.class,args);
    }
}

在这里插入图片描述
接下来的编码工作,就是正常的 Spring MVC 项目的开发过程。

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "hello springboot";
    }
}

在这里插入图片描述
运行启动类的 main 方法,会在控制台中看见日志信息,其中有一条信息如下:
在这里插入图片描述

说明:

  1. 监听的默认端口是 8080
  2. Spring MVC 的映射路径是:/
  3. /hello 路径已经映射到了 HelloController 中的 hello() 方法
  4. 打开页面访问:http://localhost:8080/hello

六、SpringBoot的启动原理

1、启动器分析1

为了让SpringBoot帮我们完成各种自动配置,我们必须引入SpringBoot提供的自动配置依赖,我们称为启动器。spring-boot-starter-parent工程将依赖关系声明为一个或者多个启动器,我们可以根据项目需求引入相应的启动器,因为我们是web项目,这里我们引入web启动器:

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

需要注意的是,我们并没有在这里指定版本信息。因为SpringBoot的父工程已经对版本进行了管理了。按住Ctrl点击pom.xml中的spring-boot-starter-web,跳转到了spring-boot-starter-web的pom.xml,xml配置如下(只摘抄了部分重点配置)

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.3.6.RELEASE</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-json</artifactId>
    <version>2.3.6.RELEASE</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>2.3.6.RELEASE</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.11.RELEASE</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.11.RELEASE</version>
    <scope>compile</scope>
  </dependency>
</dependencies>

可以发现该启动器引入了部分spring的相关jar

2、启动器分析2

按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-starter-parent的pom.xml【重点配置】

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-dependencies</artifactId>
  <version>2.3.7.RELEASE</version>
</parent>

可以发现spring-boot-starter-parent的父工程又是spring-boot-dependencies,继续ctrl点击spring-boot-dependencies,发现这个spring-boot-dependencies工程里面定义了很多jar的版本锁定以及引入了很多的jar。所以我们的SpringBoot工程继承spring-boot-starter-parent后就已经具备版本锁定等配置了。所以起步依赖的作用就是进行依赖的传递。

3、启动流程分析3

注解@SpringBootApplication

@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

发现@SpringBootApplication其实是一个组合注解,这里重点的注解有3个:

  • @SpringBootConfiguration 可以简单的理解为就是一个@Configuration注解,通过@Configuration 与 @Bean结合,将Bean注册到Spring ioc 容器

    • 标注这个类是一个配置类

    • 它只是@Configuration注解的派生注解

    • 它与@Configuration注解的功能一致

    • 只不过@SpringBootConfiguration是springboot的注解,而@Configuration是spring的注解

  • @ComponentScan:开启注解扫描:默认扫描@SpringBootApplication所在类的同级目录以及它的子目录
    在这里插入图片描述

    大概的意思:
    
    配置组件扫描的指令。提供了类似与<context:component-scan>标签的作用
    通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包
    

    而我们的@ComponentScan注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子包。一般启动类会放在一个比较浅的包目录中

  • @EnableAutoConfiguration:开启spring应用程序的自动配置,SpringBoot基于你所添加的依赖和你自己定义的bean,试图去猜测并配置你想要的配置。比如我们引入了spring-boot-starter-web,而这个启动器中帮我们添加了tomcatSpringMVC的依赖。此时自动配置就知道你是要开发一个web应用,所以就帮你完成了web及SpringMVC的默认配置了!

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import({AutoConfigurationImportSelector.class})
    public @interface EnableAutoConfiguration {
        String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    
        Class<?>[] exclude() default {};
    
        String[] excludeName() default {};
    }
    

    该注解引入了AutoConfigurationImportSelector.class这个类,在该类中有如下方法,启动时会调用该方法

     protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
            List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.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;
        }
    

    可以看到该方法内部调用了loadFactoryNames(),该方法是获取配置类下的全限定名,它会去spring-boot-autoconfigure:2.3.7里面找META-INF/spring.factories,这个文件里就是大量配置类的全限定名。
    在这里插入图片描述这些配置类路径在springboot启动时,通过反射创建配置类对象并且由spring的IOC容器来管理,当然我们也可以通过exclude属性关闭某些配置类,在springboot启动时,这些配置类不加载

@SpringBootApplication(exclude = {RedisAutoConfiguration.class, ActiveMQAutoConfiguration.class})
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class,args);
    }
}

4、默认配置类分析

-以我们熟悉的WebMvcAutoConfiguration配置类为例在这里插入图片描述

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {
    public static final String DEFAULT_PREFIX = "";
    public static final String DEFAULT_SUFFIX = "";
    private static final String[] SERVLET_LOCATIONS = new String[]{"/"};
    
    ......
}

我们看到这个类上的4个注解:

  • @Configuration:声明这个类是一个配置类

  • @ConditionalOnWebApplication(type = Type.SERVLET)

    ConditionalOn,翻译就是在某个条件下,此处就是满足项目的类是Type.SERVLET类型,也就是一个普通web工程,显然我们就是

  • @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })

    这里的条件是OnClass,也就是满足以下类存在:Servlet、DispatcherServlet、WebMvcConfigurer,其中Servlet只要引入了tomcat依赖自然会有,后两个需要引入SpringMVC才会有。这里就是判断你是否引入了相关依赖,引入依赖后该条件成立,当前类的配置才会生效!

  • @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

    这个条件与上面不同,OnMissingBean,是说环境中没有指定的Bean这个才生效。其实这就是自定义配置的入口,也就是说,如果我们自己配置了一个WebMVCConfigurationSupport的类,那么这个默认配置就会失效!

-WebMvcAutoConfiguration类定义相关的方法,这里只说明部分方法

  • 定义视图解析器(解析jsp的视图解析器)
    在这里插入图片描述
  • 定义处理器适配器
@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter(@Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager, @Qualifier("mvcConversionService") FormattingConversionService conversionService, @Qualifier("mvcValidator") Validator validator) {
            RequestMappingHandlerAdapter adapter = super.requestMappingHandlerAdapter(contentNegotiationManager, conversionService, validator);
            adapter.setIgnoreDefaultModelOnRedirect(this.mvcProperties == null || this.mvcProperties.isIgnoreDefaultModelOnRedirect());
            return adapter;
        }
    • this.mvcProperties属性

      这写些法都用到了this.mvcProperties属性,通过查看该属性是WebMvcProperties类型

      @ConfigurationProperties(
          prefix = "spring.mvc"
      )
      public class WebMvcProperties {
      
      	...........
      	public static class View {
              private String prefix;
              private String suffix;
      
              public View() {
              }
              ..........
          }
      }
      

      可以在springboot全局配置文件application里面去定义属性值,如spring.mvc.prefix = 前缀路径 spring.mvc.suffix= 后缀名

    • this.resourceProperties属性,定义了静态资源的位置

      @ConfigurationProperties(
          prefix = "spring.resources",
          ignoreUnknownFields = false
      )
      public class ResourceProperties {
          private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
          private String[] staticLocations;
      

      更多全局属性,参考当前SpringBoot全局属性笔记

七、SpringBoot配置文件

1、properties 和 yml

Spring Boot 整个应用程序只有一个配置文件,那就是 .properties.yml 文件。如果你的 Spring Boot 项目中没有包含这个配置文件,Spring Boot 对每个配置项都有默认值(当然,我们也可以添加配置文件,用以覆盖其默认值)。

这里以 .properties 文件为例,首先在 resources 下新建一个名为 application.properties必须是这个名字)的文件。

内容为:

server.port=8081  //设置tomcat访问端口为8081
server.servlet.context-path=/aaa  //设置项目启动路径为aaa

并且启动 main 方法,这时程序请求地址则变成了:http://localhost:8081/aaa/hello

Spring Boot 支持 .properties 和 .yml 两种格式的文件,文件名分别对应 application.propertiesapplication.yml

下面贴出 yaml 文件格式供大家参考:

server:
    port: 8080
    servlet:
        context-path: /aaa

可以看出 yml 则 换行 + tab 隔开。这里需要注意的是冒号后面 必须有空格,否则会报错

idea中可以安装Convert YAML andProperties File插件,将properties文件变为yml文件

2、springboot日志配置

Spring Boot 直接使用 slf4j ,默认间接使用 logback 日志,因此,它支持直接在 .properties.yml 文件中对日志的相关信息进行配置。另外,Spring Boot 还支持控制台日志上色功能。

logging.level.root=INFO
logging.level.cn.woniu.dao=DEBUG
logging.pattern.console=${CONSOLE_LOG_PATTERN:%clr(${LOG_LEVEL_PATTERN:%5p}) %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}}
logging.file=D:/mylog/log.log

采用application.yml

logging:
    level:
        cn:
            woniu:
                dao: DEBUG
        root: INFO
    pattern:
        console: ${CONSOLE_LOG_PATTERN:%clr(${LOG_LEVEL_PATTERN:%5p}) %clr([%15.15t]){faint}
            %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}}

可以在idea中安装插件 Convert YAML and Properties File,该插件可以将properties文件直接转为yml文件

八、springBoot属性注入

1、Spring 配置类注解回顾

从 Spring 3.0 开始,Spring 官方就推荐大家使用 java 代码配置来代替以前的 xml 文件配置。而到了 SpringBoot,Java 代码配置更是成了标配。Java 代码配置主要靠 Java 类和一些注解,比较常用的注解有:

常用注解说明
@Configuration声明一个类作为配置类,代替 .xml 文件
@Bean声明在方法上,将方法的返回值加入Bean容器,代替 <bean> 标签
@Value属性注入
@PropertySource指定外部属性文件

2、使用spring的属性注入配置druid数据源

  • 添加相关的依赖

    <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.10</version>
    </dependency>
    
  • 添加外部属性文件:db.properties

    jdbc.driverClassName=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://127.0.0.1:3306/woniu_db?serverTimezone=UTC
    jdbc.username=root
    jdbc.password=root
    
  • 编写配置类: DataSourceConfig

    /**
     * 读取数据库连接信息配置类
     */
    @Configuration
    @PropertySource(value={"classpath:db.properties"})
    public class DataSourceConfig {
        @Value("${jdbc.url}")
        String url;
        @Value("${jdbc.driverClassName}")
        String driverClassName;
        @Value("${jdbc.username}")
        String username;
        @Value("${jdbc.password}")
        String password;
    
        @Bean
        public DruidDataSource dataSource() {
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setUrl(url);
            dataSource.setDriverClassName(driverClassName);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            return dataSource;
        }
    }
    
  • controller获取druid数据源

    @RestController
    public class HelloController {
        //注入数据源对象
        @Autowired
        private DataSourceConfig dataSource;
    
        @RequestMapping("/hello")
        public String hello(){
            System.out.println(dataSource.dataSource().getUrl());
            return "hello springboot";
        }
    }
    

3、SpringBoot的属性注入

在上面的案例中,我们实验了java配置方式。不过属性注入使用的是@Value注解。这种方式虽然可行,但是不够强大,因为它只能注入基本类型值。在SpringBoot中,提供了一种新的属性注入方式,支持各种java基本数据类型及复杂类型的注入。

a、@ConfigurationProperties普通注入

该注解为属性注值,该注解声明当前类为属性读取类

  • 编写application.properties配置文件

    jdbc.driverClassName=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://127.0.0.1:3306/mall_db?serverTimezone=UTC
    jdbc.username=root
    jdbc.password=123
    
  • 创建属性类:JdbcProperties

    @Component
    @ConfigurationProperties(prefix = "jdbc")//根据前缀去springboot配置文件找对应的属性值
    @Data
    public class JdbcProperties {
        //属性必须有get和set方法
        private String url;
        private String driverClassName;
        private String username;
        private String password;
    }
    
    • 在类上通过@ConfigurationProperties注解声明当前类为属性读取类

    • @Component创建该类的对象

    • prefix=“jdbc” 读取属性⽂件中,前缀为jdbc的值。

    • 在类上定义各个属性,名称必须与属性⽂件中 jdbc. 后⾯部分⼀致,并且必须具有getter和setter⽅法

    • 需要注意的是,这⾥我们并没有指定属性⽂件的地址,SpringBoot默认会读取⽂件名为application.properties的资源⽂件,所以我们把jdbc.properties名称改为application.properties,或者定义application.properties,把jdbc.properties属性⽂件内容拷⻉到application.properties中

  • 编写配置类

    @Configuration
    public class JdbcSourceConfig {
        @Autowired
        private JdbcProperties jdbcProperties;
    
        @Bean
        public DruidDataSource dataSource() {
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setUrl(jdbcProperties.getUrl());
            dataSource.setDriverClassName(jdbcProperties.getDriverClassName());
            dataSource.setUsername(jdbcProperties.getUsername());
            dataSource.setPassword(jdbcProperties.getPassword());
            
            System.out.println(jdbcProperties.getUrl());
            return dataSource;
        }
    }
    

b、@ConfigurationProperties更优雅的注入

我们直接把@ConfigurationProperties(prefix = "jdbc")声明在需要使用的@Bean的方法上,然后SpringBoot就会自动调用这个Bean(此处是DataSource)的set方法,然后完成注入。使用的前提是:该类必须有对应属性的set方法!

  • 编写application.properties配置文件

    jdbc.driverClassName=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://127.0.0.1:3306/mall_db?serverTimezone=UTC
    jdbc.username=root
    jdbc.password=123
    
  • 编写配置类

    /**
     * 读取数据库连接信息配置类
     */
    @Configuration
    public class DataSourceConfig {
        /*
        prefix:声明要注入的属性前缀,SpringBoot调用该方法创建对象时
        根据前缀去application配置文件中找对应的属性,然后把属性的值注入给对象的同名属性
        */
        @Bean
        @ConfigurationProperties(prefix = "jdbc")
        public DruidDataSource dataSource() {
            DruidDataSource dataSource = new DruidDataSource();
            return dataSource;
        }
    }
    
  • 编写controller

    @RestController
    public class HelloController {
        @Autowired
        private DataSourceConfig dataSource;
    
        @RequestMapping("/hello")
        public String hello(){
            System.out.println(dataSource.dataSource().getUrl());
            return "hello springboot";
        }
    }
    

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

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

相关文章

web前端期末大作业:美食网站设计与实现——HTML+CSS+JavaScript休闲美食餐饮公司网站静态模板(6个页面)

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

POI在指定excel插入行java

我想在第三行&#xff0c;插入数据库的数据&#xff0c;这里假如数据库有10条&#xff0c;并且继承第二行的格式 数据库数据 {"clark",25}&#xff0c;我写个json对象&#xff0c;10条这个 造数据代码 JSONArray jsonArray new JSONArray();for (int i 0; i <…

Mac 安装mysql8.0

1. 确认下载的版本 并下载dmg文件 官网下载dmg安装文件 &#xff0c;查看自己电脑用的是什么芯片 选择对应版本的安装包&#xff0c;终端命令&#xff1a; uname -a 参考&#xff1a;http://www.yaotu.net/biancheng/13817.html 系统偏好设置里是 英特尔的i7处理器 并且查询…

可观测性-Metrics-Tomcat连接数、线程数理解以及压测记录

文章目录背景原理压测5个并发压测10个并发压测60个并发压测61个并发压测背景 为了搞懂Tomat的连接线程模型&#xff0c;搞清楚每个配置参数的作用&#xff0c;实际压测看一下是否与预期一致。 Tomcat配置如下&#xff1a; server:# tomcat配置tomcat:# 允许最大连接数,默认8…

磁盘和文件系统管理(一)

检测并确认新硬盘 fdisk命令 查看或管理磁盘分区 fdisk -l [磁盘设备] 或 fdisk [磁盘设备] 交互模式中的常用指令 m、p、n、d、t、w、q d delete a partition * 删除分区 g create a new empty GPT partition table 创建一个新的空的GPT分区表(可以对大于2T磁盘进行分区) l…

Java - Object#finalize在JDK9中被标记废弃了!

Java - Object#finalize在JDK9中被标记废弃了&#xff01; 时间&#xff1a;2022年12月6日01:34:10 目录&#xff1a; ① 为什么要废弃&#xff1f; ② 废弃后&#xff0c;使用什么方式主动监测对象是否被回收&#xff1f; 一、为什么要废弃&#xff1f; ⚡注意&#xff1a;废…

ChatGPT成精了!

最近几天&#xff0c;朋友圈、公众号都被 ChatGPT 刷屏了。 更有不少标题党吹嘘 “谷歌要完&#xff0c;百度也危了”。 那么它到底有没有网上吹的这么神奇呢&#xff1f; 我亲测了一把&#xff0c;感觉确实非常惊艳&#xff01; 例如&#xff1a; 看着还不错&#xff0c;每…

20221206英语学习

今日新词&#xff1a; outwards adv.向外, 朝外 outrage n.义愤&#xff0c;愤慨&#xff1b;暴行&#xff0c;骇人听闻的事件 drown v.淹没, 溺死, 浸透, 浸泡 visit n.访问, 参观, 看望, 游览 setting n.环境, 背景, &#xff08;戏剧、小说等的&#xff09;情节背景&am…

面试题: Hive-SQL查询连续活跃登录用户思路详解

文章目录创造数据登录日志去重一、思路一1.1、分组排序1.2、日期减去计数值得到结果, 用户连续登陆情况下&#xff0c;每次相减的结果都相同1.3、根据 user_id 和 dis 分组&#xff0c;得到用户的 开始、结束时间、连续登录天数1.4、连续登录超过两天用户二、思路二&#xff1a…

【Rust日报】2022-12-05 探索 docker 的 WASM 技术预览

探索 docker 的 WASM 技术预览docker于近日发布了支持 WASM 容器的预览版本,本文带你体验使用 Rust 编写代码,并且编译成 WASM 最终运行于 docker 的过程.原文链接: https://medium.com/shyamsundarb/exploring-docker-hubs-wasm-technical-preview-76de28c3b1b4使用 Rust 破解…

Matlab学习——变量与档案存取

一、变量 1. char和string MATLAB里面的字符和字符串都是用单引号括起来的。 % 示例&#xff1a;aI like China; n0; for n1:1:size(a,2)b(size(a,2)-n1)a(n); end disp(a); disp(b);% 输出&#xff1a;>> work I like China anihC ekil I >> % 示例&#xff…

Dockerfile的常用指令和构建案例

一、Dockerfile操作常用的指令 (1) FROM 镜像 指定新镜像所基于的基础镜像&#xff0c;第一条指令必须为FROM指令&#xff0c;每创建一个镜像就需要一条FROM指令 (2) MAINTAINER 名字 说明新镜像的维护人信息 (3) RUN命令 在所基于的镜像上执行命令&#xff0c;并提交到新的…

B2B商城交易平台搭建方案为专用设备行业注入新动力,加快产业数字化转型升级

专用设备是指设备的结构、性能专门针对某一种或一类对象&#xff0c;实现一项或几项功能的工业&#xff0c;包括工程机械、光伏设备、锂电设备、3C设备、半导体设备等。近年来&#xff0c;受市场对专用设备的应用需求不断扩大、产业技术升级趋势加快等影响&#xff0c;我国专用…

直播回顾:Coremail校园邮件安全防护交流会暨新技术应用分享

11月23日&#xff0c;Coremail校园邮件安全防护交流会暨新技术应用分享直播举办。 Coremail作为国内TOP级邮件系统厂商&#xff0c;服务上百家高校&#xff0c;特邀以下重磅嘉宾参与了本次圆桌讨论。 本次圆桌会主要探讨校园典型钓鱼邮件防范与新技术在校园邮件中的应用。 高校…

mysql 查询在一张表不在另外一张表的记录

SQL Join子句&#xff0c;主要用在select语句中&#xff0c;把两个或多个表的行结合起来&#xff0c;基于这些表之间的共同字段(往往是id字段)来查询&#xff0c;从多个表中返回满足条件的所有行。 常见join子句类型 常见join子句类型有INNER JOIN(同JOIN)、LEFT JOIN、RIGHT…

【Java学习Note】第8章 多线程

8. 多线程 文章目录8. 多线程8.1 程序、进程、线程8.2 线程的创建8.2.1 继承Thread类-创建线程方法之一8.2.2 Thread常用方法8.2.3 实现Runnable接口-创建线程方法之二8.2.4 两种多线程的区别8.3 线程得调度8.4 线程的生命周期8.5 线程的同步8.5.1 线程同步--Synchronized8.5.2…

html网页设计与制作:基于html设计整套招聘网站求职前端模板页面 静态网页HTML代码 学生网页课程设计期末作业下载

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

联通边缘AI:打造“职业技能”,助力行业高质量发展

内容来源&#xff1a;2022年11月12日&#xff0c;由边缘计算社区主办的全球边缘计算大会上海站圆满落幕。我们非常荣幸邀请到了联通数科首席AI科学家廉士国博士来分享&#xff0c;廉博士是中国图像图形学会三维视觉专委会委员、IEEE智能计算及多媒体通信委员会委员、国家工业互…

WSL VSCode运行C++项目

WSL VSCode运行C项目collect2: error: ld returned 1 exit statusboost库的链接安装并编译boost库&#xff1a;链接库(&#xff01;&#xff01;这一步有错误&#xff0c;下面会改正)/usr/include/boost/python/detail/wrap_python.hpp:57:11: fatal error: pyconfig.h: No suc…

RK3588平台开发系列讲解(SARADC篇)SARADC的工作流程

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、SARADC驱动二、SARADC常用接口三、SARADC源码分析1、SARADC驱动注册2、用例分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍SARADC的源码分析和工作流程。 一、SARADC驱…