记录的是Springboot开源Demo的解读过程。
https://github.com/ityouknow/spring-boot-examples
dockercompose-springboot-mysql-nginx:
1,DockerCompose:
简介 - Docker — 从入门到实践
Docker Compose | 菜鸟教程
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
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
|
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:
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;
1 2
| /etc/mysql/ 储存配置信息相关文件 /var/lib/mysql 储存mysql实际的数据文件
|
2.运行mysql容器(方法1):直接使用sql语句
1 2 3
| docker exec -it mysql bash mysql -uroot -p123456
|
3.导入sql文件(方法2):使用sql脚本
1 2 3 4 5 6 7 8 9 10 11
| docker cp yyy.sql mysql:/yyy.sql
docker exec -it mysql mysql -h 192.168.6.88 -uroot -p12345 mysql> create database yyy; mysql> use yyy;
mysql> source yyy.sql
|
3.Nginx:
Nginx 简介 | Nginx 入门教程
springboot多环境配置:
https://www.cnblogs.com/Chenjiabing/p/13968781.html
日常开发中至少有三个环境,分别是开发环境(dev),测试环境(test),生产环境(prod)。
既然每个环境的配置都不相同,索性将不同环境的配置放在不同的配置文件中,因此需要创建三个不同的配置文件,分别是application-dev.properties、application-test.properties、application-prod.properties。
「注意」:配置文件的名称一定要是application-name.properties或者application-name.yml格式。这个name可以自定义,主要用于区分。
指定运行的环境:1.在application.properties或者application.yml文件中指定;2.运行jar的时候指定,如:
1
| java -jar xxx.jar --spring.profiles.active=test
|
知识点:
1.@RequestMapping:对任意类型的请求都可以进行处理的。
如果想要修改springboot启动的banner可以:

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依赖
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:
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博客
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。
|
1 2 3
| @Query("select u from User u where u.emailAddress = ?1") User findByEmailAddress(String emailAddress); }上面的?1表示用下面方法中的第一个参数代替。
|
JPA的配置文件:
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
spring.jpa.properties.hibernate.hbm2ddl.auto=create spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
|
JPA多数据源:https://www.cnblogs.com/daimenglaoshi/p/16953667.html
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外键关联
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实体。
|
1 2 3 4 5
| @OneToOne(mappedBy = "bookDetail") private Book book; @OneToOne(mappedBy = "bookDetail"):这是一个注解,表示这个字段与另一个实体类的字段之 间建立了一对一的关联关系。通过"mappedBy"属性指定了与之关联的另一个实体类的字段名, 这里是"bookDetail",表示该关联关系由Book实体类中的"bookDetail"字段来维护。
|
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博客
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语句
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.整合数据源一定,可以设置特定的配置类来实现:
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 文件中,确保以下配置项的存在或根据需要进行修改:
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 方法被正确地重写。如果还没有重写,可以添加如下代码:
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:
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(); } }; }
|
上面是一个缓存键的生成策略
1
| @Cacheable(value="user-key")
|
@Cacheable 注解被用于某个方法,并指定了一个缓存的名称为 “user-key”。但是其缓存键不是这个,
定时任务:
SpringBoot实现定时任务的三种方式,总有一款适合你!-腾讯云开发者社区-腾讯云
1 2
| @Scheduled(cron="*/6 * * * * ?") Cron表达式参数分别表示:秒,分,时,日,月,周几,年,?表示无特定值,什么都可以
|
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
1 2 3
| @GetMapping("/hello") public Mono<String> hello() { return Mono.just("Welcome to reactive world ~");
|
- Mono:实现发布者,并返回 0 或 1 个元素,即单对象
- Flux:实现发布者,并返回 N 个元素,即 List 列表对象