从.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());

  1. //日志级别 由低到高
  2. logger.trace("trace 级别日志");
  3. logger.debug("debug 级别日志");
  4. logger.info("info 级别日志");
  5. logger.warn("warn 级别日志");
  6. logger.error("error 级别日志");

但是 Spring Boot 项目是以 JAR 包的形式进行部署的,不存在 webapp 目录,那么 Web 前端资源该如何引入到 Spring Boot 项目中呢?

当访问项目中的任意资源(即“/**”)时,Spring Boot 会默认从以下路径中查找资源文件(优先级依次降低):

  1. classpath:/META-INF/resources/
  2. classpath:/resources/
  3. classpath:/static/
  4. classpath:/public/

SpringBoot 2.0 后,WebMvcConfigurerAdapter 抽象类就被弃用了,改为实现 WebMvcConfigurer 接口来定制 Spring MvVC 配置。

WebMvcConfigurer 是一个基于 Java  8 的接口,该接口定义了许多与 Spring MVC 相关的方法,其中大部分方法都是 default 类型的,且都是空实现。因此我们只需要定义一个配置类实现 WebMvcConfigurer 接口,并重写相应的方法便可以定制 Spring MVC 的配置

Spring Boot整合Thymeleaf 

在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:

  1. 定义拦截器;
  2. 注册拦截器;
  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,代码如下。

 
  1. <!--导入JDBC的场景启动器-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-jdbc</artifactId>
  5. </dependency>


查看 spring-boot-starter-data-jdbc 的依赖树,可以看到,该场景启动器默认引入了一个数据源:HikariCP

访问 MySQL 数据库时,需要导入 MySQL 的数据库驱动:mysql-connector-java,示例代码如下。

  1. <!--导入数据库驱动-->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. <scope>runtime</scope>
  6. </dependency>

Spring Boot 默认为数据库驱动程序做了版本仲裁,所以我们在导入数据库驱动时,可以不再声明版本。需要注意的是,数据库驱动的版本必须与数据库的版本相对应。

 

配置数据源

在导入了 JDBC 场景启动器和数据库驱动后,接下来我们就可以在配置文件(application.properties/yml)中配置数据源了,示例代码(application.yml)如下。

  1. #数据源连接信息
  2. spring:
  3. datasource:
  4. username: root
  5. password: root
  6. url: jdbc:mysql://127.0.0.1:3306/bianchengbang_jdbc
  7. 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). 这样发消息者和队列就没有直接联系, 转而变成发消息者把消息给交换器, 交换器根据调度策略再把消息再给队列。

 

 

posted on 2022-01-19 19:38  Gu  阅读(40)  评论(0编辑  收藏  举报