Java微服务篇1——SpringBoot
1、什么是springboot
1.1、Spring出现的问题
Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的 Enterprise Java Bean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和 面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能
-
虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很 多XML配 置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML 配置。Spring 3.0引入 了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML -
所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切 换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求 的回报也不少 -
除此之外,项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标, 而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题 就会严重阻碍项目的开发进度
1.2、SpringBoot的诞生
SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在 配置与逻辑 业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的 效率,一定程度上缩短 了项目周期
- 起步依赖:本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依 赖,这些东西加在一起即支持某项功能。 简单的说,起步依赖就是将具备某种功能的依赖坐标打包到一起,并提供一些默认的功能
- 自动装配:指的是springboot,会自动将一些配置类的bean注册进ioc容器,我们可以需 要的地方使用@autowired或者@resource等注解来使用它。 “自动”的表现形式就是我们只需要引我们想用功能的包,相关的配置我们完全不用管,springboot会自 动注入这些配置bean,我们直接使用这些bean即可
2、SpringBoot核心理念
约定大于配置
Build Anything with Spring Boot:Spring Boot is the starting point forbuilding all Spring-based applications. Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring.
使用Spring Boot构建任何东西:Spring Boot是构建所有基于Spring的应用程序的起点。Spring Boot的设计目的是让您以最少的Spring前端配置尽快启动和运行
3、SpringBoot快速入门
3.1、创建项目
3.2、pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/>
</parent>
<groupId>cn.winkto</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.3、启动类
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
3.4、Controller
@RestController
public class SpringBootController {
@RequestMapping("/hello")
public String hello(){
return "Hello, SpringBoot!";
}
}
4、SpringBoot单元测试
@SpringBootTest
class DemoApplicationTests {
@Autowired
SpringBootController springBootController;
@Test
void contextLoads() {
System.out.println(springBootController.hello());
}
}
5、热部署
在开发过程中,通常会对一段业务代码不断地修改测试,在修改之后往往需要重启服务,有些服务 需要加载很久才能启动成功,这种不必要的重复操作极大的降低了程序开发效率。为此,Spring Boot框 架专门提供了进行热部署的依赖启动器,用于进行项目热部署,而无需手动重启项目。
5.1、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
5.2、开启Idea的自动编译
5.3、开启Idea的在项目运行中自动编译
Ctrl+Shift+Alt+/打开Maintenance选项框,勾选compiler.automake.allow.when.app.running
然后自行测试即可
6、配置文件
配置文件能够对一些默认配置值进行修改,Spring Boot使用一个application.properties或者application.yaml(application.yml)的文件作为全局配置文件,该文件存放在**src/main/resource目录(常用)**或者类路径的/config
实体类
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private double money;
private String[] hobbies;
private List<String> books;
private Set<String> lotteries;
private Map<String,String> bankcards;
private Pet pet;
}
public class Pet {
private String name;
private int age;
}
@ConfigurationProperties(prefix = “person”)爆红问题
虽然爆红,但是不影响运行,实在看着不爽,引入一个依赖解决一下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
6.1、properties配置文件
#tomcat的端口号
server.port=8099
#基础类型
person.name=zhangsan
person.age=20
person.money=123.5
#数组和集合(list,set)种赋值方式可以互换
person.hobbies=basketball,football,volleyball
person.books[0]=book1
person.books[1]=book2
person.books[2]=book3
person.lotteries[0]=book1
person.lotteries[1]=book2
person.lotteries[2]=book3
#map
person.bankcards.ICBC=123456789
person.bankcards.ABC=987654321
#对象
person.pet.name=huahua
person.pet.age=2
6.2、yaml配置文件
YAML文件格式是Spring Boot支持的一种JSON文件格式,相较于传统的Properties配置文件,YAML文 件以数据为核心,是一种更为直观且容易被电脑识别的数据序列化格式,application.yaml配置文件的工作原理和application.properties是一样的,yaml格式配置文件看起来更简洁一些
对空格要求极其严格
server:
port: 8099
person:
name: zhangsan
age: 20
money: 123.5
hobbies: baskball,football,volleyball
books:
- book1
- book2
- book3
lotteries: [lottery1,lottery2,lottery3]
bankcards: {ICBC: 123456789,ABC: 987654321}
pet:
name: huahua
age: 2
6.3、测试
@SpringBootTest
class DemoApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person.toString());
}
}
6.4、配置文件优先级
spring-boot-starter-parent-2.5.3.pom中出现这个的配置文件加载顺序,那么文件的优先级yml<yaml<properties
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include>
<include>**/application*.properties</include>
</includes>
6.5、自定义配置文件
有时候我们需要一些额外的配置文件,比如secretkey.properties,但是SpringBoot并不知道我们要加载这个配置文件,此时我们需要使用@PropertySource加载自定义配置文件(@PropertySource只对properties文件可以进行加载,对于yml或者yaml不能支持,需要自行实现)
@Component
@PropertySource("classpath:secretkey.properties")
@ConfigurationProperties(prefix = "secretkey")
public class SecretKey {
private int num;
private String secretkey;
public SecretKey() {
}
public SecretKey(int num, String secretkey) {
this.num = num;
this.secretkey = secretkey;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getSecretkey() {
return secretkey;
}
public void setSecretkey(String secretkey) {
this.secretkey = secretkey;
}
@Override
public String toString() {
return "SecretKey{" +
"num=" + num +
", secretkey='" + secretkey + '\'' +
'}';
}
}
secretkey.num=22
secretkey.secretkey=abcdefg
@SpringBootTest
class DemoApplicationTests {
@Autowired
SecretKey secretKey;
@Test
void contextLoads() {
System.out.println(secretKey.toString());
}
}
6.6、自定义配置类(推荐使用)
在Spring Boot框架中,通常使用@Configuration注解定义一个配置类,Spring Boot会自动扫描和识别 配置类,从而替换传统Spring框架中的XML配置文件
@Configuration
public class WinktoConfig {
@Bean
public ObjectMapper objectMapper(){
return new ObjectMapper();
}
}
@SpringBootTest
class DemoApplicationTests {
@Autowired
SecretKey secretKey;
@Autowired
ObjectMapper objectMapper;
@Test
void contextLoads() throws JsonProcessingException {
System.out.println(objectMapper.writeValueAsString(secretKey));
}
}
|