前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot笔记2

Spring Boot笔记2

作者头像
楠羽
发布2023-12-29 09:11:56
1460
发布2023-12-29 09:11:56
举报
文章被收录于专栏:后端开发笔记后端开发笔记

3. SpringBoot原理分析

3.1. 起步依赖原理解析

3.1.1. 分析spring-boot-starter-parent

按住Ctrl键,然后点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-starter-parent的pom.xml,xml配置如下(只摘抄了部分重点配置):

代码语言:javascript
复制
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-dependencies</artifactId>
  <version>2.3.3.RELEASE</version>
  <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

按住Ctrll键,然后点击pom.xml中的spring-boot-starter-dependencies,跳转到了spring-boot-starter-dependencies的pom.xml,xml配置如下(只摘抄了部分重点配置):

代码语言:javascript
复制
<properties>
  <activemq.version>5.15.3</activemq.version>
  <antlr2.version>2.7.7</antlr2.version>
  <appengine-sdk.version>1.9.63</appengine-sdk.version>
  <artemis.version>2.4.0</artemis.version>
  <aspectj.version>1.8.13</aspectj.version>
  <assertj.version>3.9.1</assertj.version>
  <atomikos.version>4.0.6</atomikos.version>
  <bitronix.version>2.1.4</bitronix.version>
  <build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version>
  <byte-buddy.version>1.7.11</byte-buddy.version>
  ... ... ...
</properties>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot</artifactId>
      <version>2.3.1.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-test</artifactId>
      <version>2.3.3.RELEASE</version>
    </dependency>
    ... ... ...
  </dependencies>
</dependencyManagement>
<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-maven-plugin</artifactId>
        <version>${kotlin.version}</version>
      </plugin>
      <plugin>
        <groupId>org.jooq</groupId>
        <artifactId>jooq-codegen-maven</artifactId>
        <version>${jooq.version}</version>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>2.3.3.RELEASE</version>
      </plugin>
      ... ... ...
    </plugins>
  </pluginManagement>
</build>

从上面的spring-boot-starter-dependencies的pom.xml中我们可以发现,一部分坐标的版本、> > 依赖管理、插件管理已经定义好,所以我们的SpringBoot工程继承spring-boot-starter-parent后> > 已经具备版本锁定等配置了。所以起步依赖的作用就是进行依赖的传递。

3.1.2. 分析spring-boot-starter-web

按住Ctrll键,然后点击pom.xml中的spring-boot-starter-web,跳转到了spring-boot-starter-web的pom.xml,xml配置如下(只摘抄了部分重点配置):

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starters</artifactId>
    <version>2.3.3.RELEASE</version>
  </parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <version>2.3.3.RELEASE</version>
  <name>Spring Boot Web Starter</name>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.3.3.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-json</artifactId>
      <version>2.3.3.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.3.3.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.9.Final</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.2.8.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.8.RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

从上面的spring-boot-starter-web的pom.xml中我们可以发现,spring-boot-starter-web就是将> web开发要使用的spring-web、spring-webmvc等坐标进行了“打包”,这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用。

3.2. 自动配置原理解析

按住Ctrll键,然后点击查看启动类DemoApplication上的注解@SpringBootApplication

代码语言:javascript
复制
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

注解@SpringBootApplication的源码

代码语言:javascript
复制
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
                                 @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {  //...  }

@SpringBootConfiguration:等同与@Configuration,既标注该类是Spring的一个配置类@EnableAutoConfiguration:SpringBoot自动配置功能开启 @ComponentScan:定义扫描路径,从中找出标识了需要装配的类,并自动装配到spring容器中

3.3. 处理器配置原理解析

按住Ctrll键,然后点击查看处理器类 UserController上的注解@RestController

代码语言:javascript
复制
@RestController
public class UserController { }

注解@RestController的源码

代码语言:javascript
复制
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController { //... }

可以看到:@RestController注解就相当于:@Controller+@ResponseBody

4. SpringBoot工程配置文件

SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用SpringBoot配置文件进行配置。

SpringBoot配置文件有两种:properties文件形式、yml文件形式。SpringBoot默认会从Resources目录下加载application.properties或application.yml文件。

4.1. application.properties配置文件

下面是一个 application.properties 配置文件实例:

代码语言:javascript
复制
## 修改服务器启动端口
server.port=8080
## 设置应用程序访问上下文路径
server.servlet.context-path=/elm
## 设置SpringBoot日志输出级别(error、warn、info、debug)
logging.level.org.springframework=debug

4.2. application.yml配置文件

YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。

YML文件的扩展名可以使用.yml或者.yaml。

下面是一个 application.yml 配置文件实例:

代码语言:javascript
复制
server:
    port: 8080
    servlet:
        context-path: /elm
logging:
    level:
        org.springframework: debug

yml文件基本语法:

  1. 大小写敏感
  2. 使用缩进表示层级关系(缩进的空格数并不重要,只要相同层级的元素左对齐即可)
  3. 缩进不允许使用tab,只允许空格
  4. 冒号后必须要有一个空格
  5. 使用 # 作为注释

4.3. SpringBoot配置信息的查询

上面提及过,SpringBoot的配置文件,主要的目的就是对配置信息进行修改的,但在配置时的key从哪里去查询呢?我们可以查阅SpringBoot的官方文档文档URL: Spring Boot Reference Guide 常用的配置摘抄如下:

代码语言:javascript
复制
# QUARTZ SCHEDULER (QuartzProperties)
spring.quartz.jdbc.initialize-schema=embedded # Database schema initialization mode.
spring.quartz.jdbc.schema=classpath:org/quartz/impl/jdbcjobstore/tables_@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
spring.quartz.job-store-type=memory # Quartz job store type.
spring.quartz.properties.*= # Additional Quartz Scheduler properties.
# ----------------------------------------
# WEB PROPERTIES
# ----------------------------------------
# EMBEDDED SERVER CONFIGURATION (ServerProperties)
server.port=8080 # Server HTTP port.
server.servlet.context-path= # Context path of the application.
server.servlet.path=/ # Path of the main dispatcher servlet.
# HTTP encoding (HttpEncodingProperties)
spring.http.encoding.charset=UTF-8 # Charset of HTTP requests and responses. Added to the "Content-Type" header if not set explicitly.
# JACKSON (JacksonProperties)
spring.jackson.date-format= # Date format string or a fully-qualified date format class name. For instance, `yyyy-MM-dd HH:mm:ss`.
# SPRING MVC (WebMvcProperties)
spring.mvc.servlet.load-on-startup=-1 # Load on startup priority of the dispatcher servlet.
spring.mvc.static-path-pattern=/** # Path pattern used for static resources.
spring.mvc.view.prefix= # Spring MVC view prefix.
spring.mvc.view.suffix= # Spring MVC view suffix.
# DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.driver-class-name= # Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
spring.datasource.password= # Login password of the database.
spring.datasource.url= # JDBC URL of the database.
spring.datasource.username= # Login username of the database.

4.4. @Value注解

我们可以通过@Value注解,将配置文件中的值映射到一个Spring管理的Bean的属性上。

代码语言:javascript
复制
@RestController
public class DeptController {
    //server.port 就是SpringBoot配置文件中的一个值
    @Value("${server.port}")
    private int port;
    @Autowired
    private DeptService deptService;
    @RequestMapping("/listDept")
    public List<Dept> listDept(){
        System.out.println("端口:"+port);
        return deptService.listDept();
    }
}

将@Value注解放置在一个属性上,就可以使用它获取SpringBoot配置文件中的值。

5. SpringBoot整合MyBatis

5.1. 添加MyBatis相关依赖

代码语言:javascript
复制
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.0.1</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.6</version>
  <scope>runtime</scope>
</dependency>

5.2. 添加MyBatis相关配置

在application.properties配置文件中配置MyBatis相关信息

代码语言:javascript
复制
server.port=8080
server.servlet.context-path=/elm
## logging.level.org.springframework=debug
## 配置mapper输出日志级别
logging.level.com.neusoft.demo.mapper=debug
## 配置数据源信息
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.url=jdbc:mysql://localhost:3306/elm?characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
## 配置mapper映射文件路径
mybatis.mapper-locations=classpath:mapper/*.xml
## 配置扫描实体包,给实体类设置别名
mybatis.type-aliases-package=com.neusoft.demo.po

也可以使用application.yml形式配置文件进行MyBatis相关配置:

代码语言:javascript
复制
server:
    port: 8080
    servlet:
        context-path: /elm
logging:
    level:
        org.springframework: debug
        com.neusoft.demo.mapper: debug
spring:
    datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/elm?characterEncoding=utf-8
        username: root
        password: 123
mybatis:
    mapper-locations: classpath:mapper/*.xml
    type-aliases-package: com.neusoft.demo.po

5.3. 创建mapper接口

代码语言:javascript
复制
@Mapper
public interface DeptMapper {
    @Select("select * from dept order by deptno")
    public List<Dept> listDept();
}

注意:必须要使用 @Mapper 标识此mapper接口

5.4. 创建service接口与实现类

代码语言:javascript
复制
public interface DeptService {
    public List<Dept> listDept();
}
代码语言:javascript
复制
@Service
public class DeptServiceImpl implements DeptService{

    @Autowired
    private DeptMapper deptMapper;

    @Override
    @Transactional   //注意:需要在主启动类上添加@EnableTransactionManagement注解
    public List<Dept> listDept() {
        return deptMapper.listDept();
    }
}

5.5. 创建controller

代码语言:javascript
复制
@RestController
public class DeptController {
    @Autowired
    private DeptService deptService;
    @RequestMapping("/listDept")
    public List<Dept> listDept(){
        return deptService.listDept();
    }
}

5.6. 测试

代码语言:javascript
复制
<script src="https://unpkg.com/axios/dist/axios.js"></script>
<script>
  axios.post('http://localhost:8080/elm/listDept')
    .then(response => {
      console.log(response.data);
    }).catch(error => {
      console.log(error);
    });    
</script>

6. 问题

  1. SpringBoot与SpringMVC的区别?
  2. 简述SpringBoot的特点?
  3. 简述SpringBoot的核心功能?
  4. 简述@RequestBody 注解的功能?
  5. 简述yml文件的基本语法?
  6. 什么是 Spring Boot Stater?
  7. 什么是嵌入式服务器?我们为什么要使用嵌入式服务器呢?
  8. 编程题:
    1. 使用SpringBoot+MyBatis集成框架实现一个登录案例。
    2. 使用前后端分离的模式实现。
    3. 服务器端要有数据层组件、业务层组件、控制层组件。
    4. 数据层组件使用MyBatis框架完成对数据库的操作。
    5. 控制层组件要向前端返回json数据。
    6. 前端使用ajax请求,并通过服务器端返回的json数据来判断是否登录成功。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3. SpringBoot原理分析
    • 3.1. 起步依赖原理解析
      • 3.1.1. 分析spring-boot-starter-parent
      • 3.1.2. 分析spring-boot-starter-web
    • 3.2. 自动配置原理解析
      • 3.3. 处理器配置原理解析
      • 4. SpringBoot工程配置文件
        • 4.1. application.properties配置文件
          • 4.2. application.yml配置文件
            • 4.3. SpringBoot配置信息的查询
              • 4.4. @Value注解
              • 5. SpringBoot整合MyBatis
                • 5.1. 添加MyBatis相关依赖
                  • 5.2. 添加MyBatis相关配置
                    • 5.3. 创建mapper接口
                      • 5.4. 创建service接口与实现类
                        • 5.5. 创建controller
                          • 5.6. 测试
                          • 6. 问题
                          相关产品与服务
                          容器服务
                          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档