从.Net到Java学习第二篇——IDEA and start spring boot
学习 Spring Boot 知识看这一篇就够了_纯洁的微笑
Java语法新特性_java5到java11 - SegmentFault 思否
lombok 插件, 自动加Getter/Setter/ToString方法, JAVA这个比C#麻烦
RepresentationModel类是用来加超链接的吗? 不明白用法?
package com.optimagrowth.license.model; import org.springframework.hateoas.RepresentationModel; import lombok.Getter; import lombok.Setter; import lombok.ToString; @Getter @Setter @ToString public class License extends RepresentationModel<License> { private int id; private String licenseId; private String description; private String organizationId; private String productName; private String licenseType; }
IntelliJ IDEA 对 Spring Boot 提供了更好的支持
Maven 可以理解为项目文件工具, pom.xml 中添加配置信息,导入 Spring Boot 相关的依赖。比如在pom.xml里增加
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency>
如果构建时说找不到依赖包,在Maven的Panel,点一下刷新的按钮
IDEA 连接MySQL如果出现, 应该是SSL的问题,网上说连接字符串禁用SSL就可以了. 但我发现是不行的, 最后把Driver改成5.1.35才可以
[08S01] Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. No appropriate protocol (protocol is disabled or cipher suites are inappropriate).
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class helloWorldApplication { public static void main(String[] args) { SpringApplication.run(helloWorldApplication.class, args); } }
默认情况下,Spring Boot 项目会创建一个名为 ***Application 的主程序启动类 ,该类中使用了一个组合注解 @SpringBootApplication,用来开启 Spring Boot 的自动配置,另外该启动类中包含一个 main() 方法,用来启动该项目。 Spring Boot 内部集成了 Tomcat,不需要人为手动配置 Tomcat, 就好像VS.NET 自带IIS Express
@SpringBootApplication 是一个组合元注解,其主要包含两个注解:@SpringBootConfiguration 和 @EnableAutoConfiguration,其中 @EnableAutoConfiguration 注解是 SpringBoot 自动化配置的核心所在。
以 spring-boot-starter-web 为例,它能够为提供 Web 开发场景所需要的几乎所有依赖,因此在使用 Spring Boot 开发 Web 项目时,只需要引入该 Starter 即可,而不需要额外导入 Web 服务器和其他的 Web 依赖。 可以理解为一个套餐,引用一个就把全家桶引入了
YAML 的语法如下:
- 使用缩进表示层级关系。
- 缩进时不允许使用 Tab 键,只允许使用空格。
- 缩进的空格数不重要,但同级元素必须左侧对齐。
- 大小写敏感。
- application.properties:主配置文件
- application-dev.properties:开发环境配置文件
- application-test.properties:测试环境配置文件
- application-prod.properties:生产环境配置文件
在 applcation.properties 文件中,指定默认服务器端口号为 8080,并通过以下配置激活生产环境(prod)的 profile。
#默认端口号 server.port=8080
#激活指定的profile spring.profiles.active=prod
Logger logger = LoggerFactory.getLogger(getClass());
- //日志级别 由低到高
- logger.trace("trace 级别日志");
- logger.debug("debug 级别日志");
- logger.info("info 级别日志");
- logger.warn("warn 级别日志");
- logger.error("error 级别日志");
但是 Spring Boot 项目是以 JAR 包的形式进行部署的,不存在 webapp 目录,那么 Web 前端资源该如何引入到 Spring Boot 项目中呢?
当访问项目中的任意资源(即“/**”)时,Spring Boot 会默认从以下路径中查找资源文件(优先级依次降低):
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
SpringBoot 2.0 后,WebMvcConfigurerAdapter 抽象类就被弃用了,改为实现 WebMvcConfigurer 接口来定制 Spring MvVC 配置。
WebMvcConfigurer 是一个基于 Java 8 的接口,该接口定义了许多与 Spring MVC 相关的方法,其中大部分方法都是 default 类型的,且都是空实现。因此我们只需要定义一个配置类实现 WebMvcConfigurer 接口,并重写相应的方法便可以定制 Spring MVC 的配置
在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:
- 定义拦截器;
- 注册拦截器;
- 指定拦截规则(如果是拦截所有,静态资源也会被拦截)。
由于 Spring Boot 默认以 Jar 包方式部署的,默认没有 web.xml,因此无法再像以前一样通过 web.xml 配置来使用 Servlet 、Filter、Listener,但 Spring Boot 提供了 2 种方式来注册这些 Web 原生组件。
通过组件扫描注册
使用 RegistrationBean 注册
想要在 Spring Boot 中使用 JDBC 进行数据访问,第一步就是要在 pom.xml 中导入 JDBC 场景启动器:spring-boot-starter-data-jdbc,代码如下。
- <!--导入JDBC的场景启动器-->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jdbc</artifactId>
- </dependency>
查看 spring-boot-starter-data-jdbc 的依赖树,可以看到,该场景启动器默认引入了一个数据源:HikariCP
访问 MySQL 数据库时,需要导入 MySQL 的数据库驱动:mysql-connector-java,示例代码如下。
- <!--导入数据库驱动-->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <scope>runtime</scope>
- </dependency>
Spring Boot 默认为数据库驱动程序做了版本仲裁,所以我们在导入数据库驱动时,可以不再声明版本。需要注意的是,数据库驱动的版本必须与数据库的版本相对应。
配置数据源
在导入了 JDBC 场景启动器和数据库驱动后,接下来我们就可以在配置文件(application.properties/yml)中配置数据源了,示例代码(application.yml)如下。
- #数据源连接信息
- spring:
- datasource:
- username: root
- password: root
- url: jdbc:mysql://127.0.0.1:3306/bianchengbang_jdbc
- driver-class-name: com.mysql.cj.jdbc.Driver
Hikari连接池非常强大,高效,并且号称“史上最快连接池”。由此可见他是有多受人喜欢,并且在springboot2.0之后,采用的默认数据库连接池就是Hikari。
热部署的,需要把dependcy里的optional选项设置为true才可以,还要设置IDEA的自动build,这两个都有了才会实现热部署。
场景描述:我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了。
穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层。从而失去缓存的意义。
常用解决办法:
①用一个bitmap和n个hash函数做布隆过滤器过滤没有缓存的键。
②持久层查询不到就缓存空结果,有效时间为数分钟。
微服务同时调用多个接口,怎么支持事务的啊?
支持分布式事务,可以使用Spring Boot集成 Aatomikos来解决,但是我一般不建议这样使用,因为使用分布式事务会增加请求的响应时间,影响系统的TPS。一般在实际工作中,会利用消息的补偿机制来处理分布式的事务。
Spring Cloud默认使用restful进行服务之间的通讯。rpc通讯效率会比restful要高一些,但是对于大多数公司来讲,这点效率影响甚微。我建议使用restful这种方式,易于在不同语言实现的服务之间通讯。
通常我们谈到队列服务, 会有三个概念: 发消息者、队列、收消息者,RabbitMQ 在这个基本概念之上, 多做了一层抽象, 在发消息者和 队列之间, 加入了交换器 (Exchange). 这样发消息者和队列就没有直接联系, 转而变成发消息者把消息给交换器, 交换器根据调度策略再把消息再给队列。