记录的是Springboot开源Demo的解读过程。
https://github.com/ityouknow/spring-boot-examples

dockercompose-springboot-mysql-nginx:

1,DockerCompose:

简介 - Docker — 从入门到实践
Docker Compose | 菜鸟教程

  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version: '3'
services:
nginx:
container_name: v-nginx
image: nginx:1.13
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d

mysql:
container_name: v-mysql
image: mysql/mysql-server:5.7
environment:
MYSQL_DATABASE: test
MYSQL_ROOT_PASSWORD: root
MYSQL_ROOT_HOST: '%'
ports:
- "3306:3306"
restart: always

app:
restart: always
build: ./app
working_dir: /app
volumes:
- ./app:/app
- ~/.m2:/root/.m2
expose:
- "8080"
depends_on:
- nginx
- mysql
command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker
bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
这个docker-compose文件定义了三个服务:nginx、mysql和app。让我逐个解释每个服务的配置:

nginx服务:

container_name:指定容器的名称为 v-nginx。
image:使用 nginx:1.13 镜像作为基础镜像。
restart:设置容器在退出时总是自动重启。
ports:将主机的80端口映射到容器的80端口,以及将主机的443端口映射到容器的443端口。
volumes:将主机上的 ./nginx/conf.d 目录挂载到容器的 /etc/nginx/conf.d 目录,用于提供Nginx的配置文件。
mysql服务:

container_name:指定容器的名称为 v-mysql。
image:使用 mysql/mysql-server:5.7 镜像作为基础镜像。
environment:设置MySQL容器的环境变量,包括数据库名称、root用户的密码和允许访问的主机。
ports:将主机的3306端口映射到容器的3306端口,以便可以通过主机访问MySQL服务。
restart:设置容器在退出时总是自动重启。
app服务:

restart:设置容器在退出时总是自动重启。
build:使用 ./app 目录中的Dockerfile构建镜像。
working_dir:设置容器的工作目录为 /app。
volumes:将主机上的 ./app 目录挂载到容器的 /app 目录,用于提供应用程序的代码文件。同时,将主机上的 ~/.m2 目录挂载到容器的 /root/.m2 目录,用于提供Maven的依赖文件。
expose:将容器的8080端口暴露给其他容器或主机。
depends_on:指定app服务依赖于nginx和mysql服务,以确保在启动app服务之前,nginx和mysql服务已经启动。
command:在容器内部运行命令 mvn clean spring-boot:run -Dspring-boot.run.profiles=docker,用于启动应用程序。
这个docker-compose文件定义了一个多容器应用程序的架构,其中nginx负责处理HTTP和HTTPS请求,mysql负责提供数据库服务,而app服务则是一个基于Spring Boot的应用程序。

2.在Docker容器中执行sql脚本:

Docker简单部署mysql并导入SQL文件_docker mysql 导入sql-CSDN博客
1.部署和运行docker:

bash
1
2
3
4
5
6
7
8
docker run -d --name mysql \
--restart=always \
-p 3306:3306 \
-v mysql:/etc/mysql/ \
-v /tmp/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=12345 \
mysql:8 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

-v mysql:/etc/mysql/:其中的mysql是虚拟目录对应容器里面的/etc/mysql目录;
上面的是在后台启动一个mysql容器,该容器的密码是12345,其中服务端采用的字符集是utf8mb4,并设置了相关的数据集mysql;

bash
1
2
/etc/mysql/ 储存配置信息相关文件
/var/lib/mysql 储存mysql实际的数据文件

2.运行mysql容器(方法1):直接使用sql语句

bash
1
2
3
docker exec -it mysql bash #给容器打开一个新的终端
mysql -uroot -p123456 #在新的终端中运行mysql服务器,如果是自己使用mysql语句创建sql时,可以直接
#在这后面创建数据库和表

3.导入sql文件(方法2):使用sql脚本

bash
1
2
3
4
5
6
7
8
9
10
11
# 1.拷贝SQL文件到mysql容器中
docker cp yyy.sql mysql:/yyy.sql

# 2. 创建数据库
docker exec -it mysql mysql -h 192.168.6.88 -uroot -p12345
mysql> create database yyy;
mysql> use yyy;

# 3.登陆控制台执行source 命令
mysql> source yyy.sql

3.Nginx:

Nginx 简介 | Nginx 入门教程

springboot多环境配置:

https://www.cnblogs.com/Chenjiabing/p/13968781.html
日常开发中至少有三个环境,分别是开发环境(dev),测试环境(test),生产环境(prod)。
既然每个环境的配置都不相同,索性将不同环境的配置放在不同的配置文件中,因此需要创建三个不同的配置文件,分别是application-dev.propertiesapplication-test.propertiesapplication-prod.properties
「注意」:配置文件的名称一定要是application-name.properties或者application-name.yml格式。这个name可以自定义,主要用于区分。
指定运行的环境:1.在application.properties或者application.yml文件中指定;2.运行jar的时候指定,如:

bash
1
java -jar xxx.jar --spring.profiles.active=test

知识点:

1.@RequestMapping:对任意类型的请求都可以进行处理的。
如果想要修改springboot启动的banner可以:
image.png

Spring boot——Actuator 详解

Springboot actuator使用详解 -腾讯云开发者社区-腾讯云

Spring Boot Admin :

Spring Boot Admin 2.0 详解-腾讯云开发者社区-腾讯云
Spring Boot Admin :是一种监控技术

CommandLineRunner和order注解:

ApplicationRunner、CommandLineRunner+@order注解学习-CSDN博客
1.ApplicationRunner和CommandLineRunner:
是一个接口,常用于项目启动后,(也就是ApringApplication.run()执行结束),立马执行某些逻辑。
可用于项目的准备工作,比如加载配置文件,加载执行流,定时任务等等。
2.ApplicationRunner和CommandLineRunner:接口中的run方法都是容器启动后执行的逻辑,其run方法执行的顺序和bean加载的顺序一致,可以通过order注解来实现bean加载的顺序。
3.ApplicationRunner中run方法的参数是:ApplicationArguments,其可以获取到当前项目执行的命令参数;而CommandLineRunner接口中run方法的参数是String数组
4.注入容器中的bean如果没有指定order那么默认为优先级最低的。

Springboot中实现定时任务:

Spring Boot 实现定时任务的 4 种方式-腾讯云开发者社区-腾讯云

Docker整合Springboot:

1.在pom中导入Docker依赖

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker

2.编写Dockerfiler:

bash
1
2
3
4
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD spring-boot-docker-1.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

注意上面的spring-boot-docker-1.0.jar的位置,上面的"-Djava.security.egd=file:/dev/./urandom",是一个Java命令行参数,用于设置Java安全随机数生成器(SecureRandom)使用的随机源。 在这个参数中,“file:/dev/./urandom"表示使用系统的随机设备文件作为随机源。”/dev/./urandom"是Linux系统中的随机设备文件,它可以提供高质量的随机数据。 这个参数的作用是确保Java应用程序在启动时使用足够的随机数据来初始化SecureRandom对象,以增强应用程序的安全性。

springboot中elasticsearch:

【SpringBoot高级篇】SpringBoot集成Elasticsearch搜索引擎_springboot集成elasticsearch 生成索引-CSDN博客

文件上传:

https://github.com/search?q=springboot%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0&type=repositories&s=&o=desc&p=1差一个项目

JPA:

Spring Data JPA 中文文档
SpringBoot集成jpa 一篇就够了 超详细_springboot集成jpa切面-CSDN博客

bash
1
2
3
4
5
6
public interface UserRepository extends JpaRepository<User, Long> 中的
JpaRepository<User, Long>中,User表示存储库中的实体类类型,Long表示实体类中的主键类型。
因此,JpaRepository<User, Long>表示一个存储库,其中的实体类使用Long类型的主键.
而上面的这个接口就是Dao层,在Service注入的就是上面的接口。但是上面的接口没有相关注解修饰
,但是因为其继承了JpaRepository<User, Long>该接口被注入到容器中了。因此Service层中就可以
自动注入该接口的bean。
bash
1
2
3
  @Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
}上面的?1表示用下面方法中的第一个参数代替。

JPA的配置文件:

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 数据库连接的配置
spring.datasource.url=jdbc:mysql://192.168.44.130:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# jpa的配置,hibernate.hbm2ddl.auto:create,
# 表示每次启动时都重新创建数据库表结构(慎用,会清空原有数据)
# hibernate.dialect:org.hibernate.dialect.MySQL5InnoDBDialect,表示使用MySQL数据库的
# InnoDB方言
# show-sql:true,表示在控制台上显示生成的SQL语句
# format_sql:true,表示格式化生成的SQL语句,使其更易读
spring.jpa.properties.hibernate.hbm2ddl.auto=create
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
#sql\u8F93\u51FA
spring.jpa.show-sql=true
#format\u4E00\u4E0Bsql\u8FDB\u884C\u8F93\u51FA
spring.jpa.properties.hibernate.format_sql=true

JPA多数据源:https://www.cnblogs.com/daimenglaoshi/p/16953667.html

bash
1
2
3
4
5
6
1.多数据源要可以在配置文件写多个连接数据库的连接配置
2.DataSourceConfig配置类要注入2个数据源,且这2个数据源的配置文件的前缀不一样,bean的名称也不一样
3.DataSourceConfig实现的是将2个根据配置文件生成的不同配置源注入到容器中
4.分别写2个数据源的配置文件,表名每个数据源所关联的Dao层和实体类
5.在控制层注入不同的Dao就实现了采用不同的数据源访问数据库了
6.

JPA常见的数据库关系:JPA关系映射系列一:one-to-one外键关联

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "book_detail_id")
// @Lazy(false)
private BookDetail bookDetail
@OneToOne(cascade = CascadeType.ALL):这是一个注解,表示这个字段与另一个实体类的字段之间建
立了一对一的关联关系。CascadeType.ALL表示级联操作,即当对该实体进行操作时,也会对关联的实体
进行相同的操作。

@JoinColumn(name = "book_detail_id"):这是一个注解,表示指定关联的外键列的名称。在数据库中
,这个字段将被用作与关联实体的主键进行关联的外键列。

private BookDetail bookDetail:这个字段表示关联的另一个实体类的对象。在这个例子中,
它表示与Book实体关联的BookDetail实体。
bash
1
2
3
4
5
@OneToOne(mappedBy = "bookDetail")
private Book book;
@OneToOne(mappedBy = "bookDetail"):这是一个注解,表示这个字段与另一个实体类的字段之
间建立了一对一的关联关系。通过"mappedBy"属性指定了与之关联的另一个实体类的字段名,
这里是"bookDetail",表示该关联关系由Book实体类中的"bookDetail"字段来维护。
bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@TableGenerator(
name = "AppSeqStore",
table = "APP_SEQ_STORE",
pkColumnName = "APP_SEQ_NAME",
pkColumnValue = "LISTENER_PK",
valueColumnName = "APP_SEQ_VALUE",
initialValue = 10000,
allocationSize = 1 )
@GeneratedValue( strategy = GenerationType.TABLE, generator = "AppSeqStore" )
private long id;
@TableGenerator:这是一个注解,用于定义一个表生成器,用于生成主键的值。它具有以下属性:
name:生成器的名称,用于关联到`@GeneratedValue这段代码是用于生成实体类中的主键(ID)的配置。
以下是对代码的解释:

@TableGenerator:这是一个注解,用于定义一个表生成器,用于生成主键的值。它具有以下属性:

name:生成器的名称,用于关联到@GeneratedValue注解中的generator属性。
table:生成器使用的数据库表的名称。
pkColumnName:指定存储主键名称的列的名称。
pkColumnValue:指定存储主键值的列的值。
valueColumnName:指定存储下一个可用主键值的列的名称。
initialValue:指定生成器的初始值。
allocationSize:指定每次从数据库中获取的主键值的数量。
@GeneratedValue:这是一个注解,用于指定生成主键值的策略。在这个例子中,使用GenerationType.TABLE作为主键生成策略,并将生成器的名称设置为AppSeqStore,与@TableGenerator中的name属性对应。

private long id:这个字段表示实体类的主键(ID),通过以上配置的表生成器来生成主键值。

springboot发送邮箱:

Springboot实现发送邮件功能-CSDN博客

bash
1
2
3
4
5
6
7
1.发送邮件需要知道邮件的发送者和接收者,而发送者和接受者可以在spring项目的配置文件中配置也可以
通过前端传递过来。
2.邮件发送靠的是spring中的JavaMailSenderImpl实例来实现的,这个实例已经注入到容器中了;可以通过
@Autowired注解来使用
3.如果发送的邮件是复杂类型则需要借助MimeMessageHelper类来实现,这个类可以配置发送者,接受者
,主题,内容(其中的内容可以是html,text),附件地址。MimeMessageHelper接受一个MimeMessage对象
的参数

Spring Boot 集成 Memcached:

Spring Boot 集成 Memcached_springboot 继承 memcached-CSDN博客

Spring boot集成mongodb:

https://blog.csdn.net/weixin_47343544/article/details/127175205

Springboot和mybatis:

其实mybatis可以不用写mapper.xml文件,而是直接通过注解在方法名前写sql语句

bash
1
2
3
4
5
6
7
8
9
10
@Select("SELECT * FROM users")
@Results({
@Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class),
@Result(property = "nickName", column = "nick_name")
})
List<User> getAll();
上面的@Results是把查询的结果集映射到那种实体上;
@Result(property = "userSex", column = "user_sex", javaType = UserSexEnum.class)
中的含义是将查询表中的user_sex列和User类的userSex属性关联,至于为什么是user类是因为该方法
的返回值是一个User的List;而后面的javaType意思是映射的属性userSex为UserSexEnum类型的

整合多数据源:
1.整合数据源一定,可以设置特定的配置类来实现:

bash
1
2
3
4
5
6
7
8
9
10
@Configuration
@MapperScan(basePackages = "com.neo.mapper.test2", sqlSessionTemplateRef = "test2SqlSessionTemplate")
上面的代码是该配置类是处理com.neo.mapper.test2接口的; sqlSessionTemplateRef表示该
接口中使用的sqlSessionTemplate来源是什么;其中的sqlSessionTemplate是对sqlSsion进行封装的;
其中的SqlSession是 是 MyBatis 中用于执行 SQL 语句的主要接口;
sqlSessionTemplateRef = "test2SqlSessionTemplate”表示将容器中的test2SqlSessionTemplate实例
作为com.neo.mapper.test2该接口的sqlSessionTemplate;
sqlSessionTemplate的产生需要SqlSessionFactory的;所以我们需要在容器中注入SqlSessionFactory;
我们在sql操作中常进行事务操作,我们应该在配置类中配置事务管理器:DataSourceTransactionManager ;

2.h2数据库

springboot的打包jar包和war包的区别:

SpringBoot项目打成war和jar的区别「建议收藏」-腾讯云开发者社区-腾讯云
1.jar包可以直接通过java -jar 项目名.jar的方式运行,不依赖外部 Servlet 容器;而war包的必须将应用部署到传统的 Servlet 容器时,如 Tomcat、Jetty 等,才能运行。
2.spring项目选择打成了war包可以直接通过springboot启动,这个时候使用的是springboot项目内置的容器(常为tomcat);这个运行的端口是根据项目的配置文件来决定的;当我们把war包放进一个新的tomcat容器中时,这个时候的端口不由配置文件决定而是用新的tomcat设置的端口决定。
3.打成war包的方法:
修改pom.xml文件:
在项目的 pom.xml 文件中,确保以下配置项的存在或根据需要进行修改:

bash
1
2
3
4
5
6
7
8
<packaging>war</packaging>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

  • war 表示你将打包成 WAR 文件。
  • 部分中,spring-boot-starter-tomcat 设置为 provided,表示这个依赖在编译和运行时由 Servlet 容器提供,而不是包含在 WAR 文件中。

修改主应用类:
如果你的应用的主类继承了 SpringBootServletInitializer,确保它的 configure 方法被正确地重写。如果还没有重写,可以添加如下代码:

bash
1
2
3
4
5
6
7
8
9
10
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class YourApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(YourApplication.class);
}
}

springboot和redis:

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}

上面是一个缓存键的生成策略

bash
1
@Cacheable(value="user-key")

@Cacheable 注解被用于某个方法,并指定了一个缓存的名称为 “user-key”。但是其缓存键不是这个,

定时任务:

SpringBoot实现定时任务的三种方式,总有一款适合你!-腾讯云开发者社区-腾讯云

bash
1
2
@Scheduled(cron="*/6 * * * * ?")
Cron表达式参数分别表示:秒,分,时,日,月,周几,年,?表示无特定值,什么都可以
bash
1
2
@Scheduled(fixedRate = 6000)
fixedRate表示固定间隔时间执行,单位为毫秒,1000毫秒为1秒

springboot+Swaager:

Webflux:

webflux + springboot 整合(史上最全)_spring boot集成webflux-CSDN博客
https://www.cnblogs.com/crazymakercircle/p/16127013.html

bash
1
2
3
@GetMapping("/hello")
public Mono<String> hello() {
return Mono.just("Welcome to reactive world ~");
  • Mono:实现发布者,并返回 0 或 1 个元素,即单对象
  • Flux:实现发布者,并返回 N 个元素,即 List 列表对象