Java框架 —— SpringBoot(一)-牛翰网

Java框架 —— SpringBoot(一)

简介

  Spring Boot 是一个开源的 Java 框架,用于简化 Spring 应用程序的开发过程。它基于 Spring 框架,旨在通过自动配置、简化的项目结构以及内嵌的服务器支持,帮助开发者快速构建和部署应用程序。

特性

  • 自动配置:根据项目的依赖关系自动配置 Spring 框架

  • 内嵌服务器:内嵌Tomcat或Jetty、 Undertow 等Servlet容器;

  • 开箱即用:SpringBoot提供了许多默认的配置和模版,使开发者可以快速上手

  • 提供可选的starter,简化应用整合: 场景启动器(starter):web、json、邮件、oss(对象存储)、异步、定时任务、缓存…

  • 开发工具支持:支持自动重启、热部署

项目创建

创建方式一

  通过脚手架进行创建:Spring Boot CLI 命令行界面;使用idea创建选择Spring boot或者Spring Initializr
图片[1]-Java框架 —— SpringBoot(一)-牛翰网

创建方式二

  通过maven进行创建,创建的项目需要直接继承spring-boot-starter-parent

<?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>

  <parent>
    <artifactId>spring-boot-starter-parent</artifactId>
    <groupId>org.springframework.boot</groupId>
    <version>2.7.18</version>
  </parent>
  <groupId>org.example</groupId>
  <artifactId>boot-02</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>
</project>

创建方式三(推荐)

父子工程

  • 在父工程中添加spring-boot-dependencies依赖管理标签
<?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>org.example</groupId>
  <artifactId>boot-03</artifactId>
  <packaging>pom</packaging>
  <version>1.0-SNAPSHOT</version>
  <modules>
    <module>model-01</module>
  </modules>

  <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <spring-boot.version>2.7.18</spring-boot.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>
  • 在子工程中直接进行依赖引入
<?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">
  <parent>
    <artifactId>boot-03</artifactId>
    <groupId>org.example</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>model-01</artifactId>
  <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>
</project>

自动装配

流程

  • 启动应用程序,使用@SpringBootApplication注解标注启动类,启动SpringBoot应用程序;

  • 启动自动装配,@SpringBootApplication包含@EnableAutoConfiguration注解(自动装配)

  • 加载spring.factories文件: AutoConfigurationImportSelector 类通过SpringFactoriesLoader加载META-INF下面的spring.factories文件

  • 获取候选配置类,通过该文件获取到所有的候选配置类;

  • 条件化加载配置类: SpringBoot 根据@Conditional 注解条件,有条件的加载配置类;

  • 注解bean:将加载的配置类注入到spring容器中,并创建相对应的bean。

配置文件

properties 配置文件

  Springboot应用启动的时候会默认去加载application.properties文件

属性注入

  • application.properties

    user.username=ww
    user.password=123456
    user.email=ww@example.com
    user.phone=1235648
    
  • User. java

    @Data
    @Component
    public class User {
        @Value("${user.username}")
        private String username;
        @Value("${user.password}")
        private String password;
        @Value("${user.email}")
        private String email;
        @Value("${user.phone}")
        private String phone;
    }
    

类型安全的配置属性

@ConfigurationProperties注入的数据不再是简单数据类型的数据。

  • 在使用之前需要导入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <version>3.0.10</version>
    </dependency>
    
  • User. java

    @Data
    @Component
    @ConfigurationProperties(prefix = "user")
    public class User {
        private String username;
        private String password;
        private String email;
        private String phone;
    }
    

yaml 配置文件

properties文件可读性差,没有办法直观的看到属性与属性之间的关系

特点

  1. 易于阅读:YAML采用简洁的键值对形式表示数据,使得数据更加易于阅读和理解。同时,YAML
    支持使用缩进表示层级关系,使得数据结构更加清晰。

  2. 易于编写:YAML的语法相对简单,开发人员可以快速编写和修改配置文件,而无需担心格式错误
    或语法错误。这大大提高了开发效率和配置管理的便捷性。

  3. 支持多种数据类型:YAML可以表示多种数据结构,如普通的值(数字、字符串、布尔值、日期
    等)、数组、列表、集合等。这使得YAML能够满足各种复杂的配置需求。

  4. 可扩展性:YAML允许用户自定义节点,根据实际需求添加新的配置项。这使得YAML能够适应不
    断变化的应用需求。

语法

  • 大小写敏感。

  • 使用缩进表示层级关系,通常使用两个空格(不能使用Tab键)。

  • 键值对格式: key: value 。

  • 注释使用 # ,后面的内容将被忽略。

user:
  username: lisi
  password: 123456
  email: lisi@example.com
  phone: 13800138000

配置文件加载优先级

优先级随着目录依次递减,最高的优先级使用命令行启动项目。优先级越高的,重复的内容会覆盖。

  1. 命令行启动项目

    java -jar xxx.jar -server.port=9000

  2. 项目根目录的config目录配置文件

    项目名字/config/yml

  3. 项目根目录配置文件

    项目名字/yml

  4. classpath下的config配置文件

    src/main/resources/config/yml # 80

  5. classpath下的配置文件

    src/main/resources/yml #8081

修改Banner

  在SpringBoot项目启动时,会打印Spring图案,我们可以对其进行修改

  1. 在src/main/resources下新建一个banner.txt文档

  2. 通过 http://patorjk.com/software/taag 网站生成需要的字符,将字符拷贝到banner.txt文档中

  重启后效果:

日志

简介

  • Spring使用commons-logging作为内部日志,但底层日志实现是对外开放的,可以使用其他日志框架

  • 核心场景引入了日志的所用功能spring-boot-starter-logging

  • 默认整合的日志是Logback + slf4j

  • 日志是利用监听器机制配置

  • 日志所有的配置都可以通过修改配置文件实现。以logging开始的所有配置

自定义配置logback

logging:
#  设置日志级别,默认为:info
  level:
    root: info
#  设置日志输出格式:默认为%d{yyyy-MM-dd HH:mm:ss} [%-5level]
  pattern:
    file:
#  设置日志生成的文件:日志生成的文件一般以.log为后缀
  file:
    name: 

日志级别

由低到高:ALL TRACE DEBUG INFO WARN ERROR FATAL OFF

只会打印指定级别及以上级别的日志

  • ALL:打印所有日志

  • TRACE:追踪框架详细流程日志,一般不使用

  • DEBUG:开发调试细节日志

  • INFO:关键信息日志

  • WARN:警告但不是错误的信息日志,比如:版本过时

  • ERROR:业务错误日志,比如出现各种异常

  • FATAL:致命错误日志,比如jvm系统崩溃

  • OFF:关闭所有日志记录

日志分组

SpringBoot 预定义的两个组

name Loggers
web org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans
sql org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener

日志输出

logging.file.name logging.file.path 示例 效果
未指定 未指定 仅控制台输出
指定 未指定 my.log 写入指定文件。可以加路径
未指定 指定 /var/log 写入指定目录,文件名为spring.log
指定 指定 以logging.file.name为准

切换日志组合

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

切换应用服务器

 从 tomcat 切换到 jetty,默认spring-boot-starter-web使用的是 tomcat 启动器,可以排除掉以后添加 jetty 启动器直接使用。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <!--web项目启动器-->
    <artifactId>spring-boot-starter-web</artifactId>
    <!--移除tomcat的启动器-->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
    <!--移除tomcat以后添加jetty-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

来源链接:https://www.cnblogs.com/codyxz/p/18640304

请登录后发表评论

    没有回复内容