Spring Boot入门程序
使用 Maven 创建一个Spring Boot项目
第一步:打开IDEA,new --> project --> new project -->Maven
注意:不要选择下面的Maven Archetype,这时创建Maven的模板。
此时创建的项目已经有各种预先创建好的文件夹了,方便后续使用。
第二步:修改pom…xml文件
如果像我一样第一次第一步选择了Maven Archetype,那么这一步就会出错。
修改如下:
添加代码
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
...
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
第三步:编写主程序启动类
在src\main\java底下可以自己创建一个Demo作为启动入口
编写代码:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.swing.*;
@SpringBootApplication
public class Chapter01Application {
public static void main(String[] args) {
SpringApplication.run(Chapter01Application.class, args); //与第一个参数与类名一致
}
}
这一步在@SpringBootApplication
可能会遇到报错信息,提示找不到符号’SpringBootApplication’,这时尝试一下重新加载,右键主目录 --> 最底下有个Maven --> reload project
第四步:在主程序启动类的同级目录下创建一个新包’HelloController’,然后编写一段代码
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello Spring Boot";
}
}
第五步:返回主程序启动类,run或者Debug
这一步如果发生报错信息: ERROR 23240 --- [ main] o.s.boot.SpringApplication
那么就是JDK版本太高导致的不兼容,这时候在 file --> Project Structure 里尝试把SDK换成JDK1.8,注意要看JDK后面括号里的版本号,千万别是17.xxx的。如果还是不行,尝试卸载高版本的JDK。然后修改pom.xml,将中间数字改成8(JDK1.8)
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
如果成功的话,下面这样:
然后打开浏览器:http://localhost:8080/hello,就可以看到hello语句了。
使用 Spring Initializr 创建一个Spring Boot项目
前面步骤和 Maven 创建差不多,在 Maven 创建步骤后
注意:这里如果需要选择版本的SpringBoot可以去CSDN找一下方法,我这里要用2.1.3.RELEASE,先随便选一个版本,然后把dependencies
都注释,然后按 Maven 创建时的pom.xml配置,最后 reload project 就可以用了。
第一步:先将pom.xml改成按 Maven 创建时的改,然后在pom.xml再添加一个测试类,用来单元测试
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
完整配置:
<?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.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>chapter01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>chapter01</name>
<description>chapter01</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
第二步:打开test文件夹下的 Chapter01ApplicationTests.java 文件,编写测试代码
package com.example.chapter01;
import com.example.chapter01.controller.HelloController;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class) //加载Springboot注解
@SpringBootTest //加载Springboot上下文环境
class Chapter01ApplicationTests {
@Test
void contextLoads() {
}
@Autowired
private HelloController helloController;
@Test
public void helloController(){
String hello = helloController.hello();
System.out.println(hello);
}
}
第三步:Debug 测试方法public void helloController()
结果如下:
热部署
第一步:pom.xml 导入热部署依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
第二步:setting --> compiler --> 勾选 Build project automatically(自动编译)
第三步:ctrl + alt + shift --> register --> 勾选 compiler automake when app running
注意:在2021以后的IDEA版本是没有这个选项的,移动到了 setting --> addvance setting --> compiler 底下勾选
第四步:热部署测试,运行主程序启动类,浏览器打开http://localhost:8080/hello
然后在 HelloController 中修改返回信息,将“hello”改为“你好”,回到浏览器刷新页面发现显示信息更换
注意:如果刷新没有用,回到IDEA,最下方工具栏底部会多出一个 Auto Build,到里面点点看 在代码区以外随便找个地方点一下,应该是让其脱离编写状态,然后才能编译。
Spring Boot 自定义配置文件
有两种配置文件,分别是 .propertie
和 .yaml
,两者在语法上不同。
使用 PropertiesResource 配置
第一步:在 resource 目录下创建 properties bundle 文件,命名为 test,resource 目录就是 classpath
第二步:在主程序启动类目录下创建 一个 domain 的包和 MyProperties.java 文件,编写代码
package com.example.chapter01.domain;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:test.properties") //classpath是src\main\resources
@EnableConfigurationProperties(MyProperties.class)
@ConfigurationProperties(prefix = "test")
public class MyProperties {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "MyProperties{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
注意:如果提示没有 SpringBoot 的 Configuration 之类的信息,打开它的网站,找到以下代码加入 pom.xml 文件,然后更新maven(改动后出现小浮窗由刷新按钮)。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
IDEA技巧:创建来个变量 id 和 name 后,右键该区域,选择 generate --> setter and getter --> 选中两个变量,就会自动生成 set 和 get 方法,toString() 同样。
第三步:编写测试类,在之前的测试类中添加以下代码
@Autowired
private MyProperties myProperties;
@Test
public void myProperties(){
System.out.println(myProperties);
}
然后 Debug 这个方法,结果如下:
注意:如果 Debug 结果中文全部显示 “???” 或者乱码,那么到 setting 中搜索 encodeing,将所有设置改为utf-8
:
两种管理的 bean 方法
使用 ImportResource 加载XML配置文件
第一步:在主程序启动类同目录下创建一个 config 包和一个 MyService.java 文件
第二步:在 resource 目录下创建 beans.xml 文件,添加以下代码:
<bean id="myService" class="com.example.chapter01.config.MyService"></bean>
注意:如果弹出提示有未认证的信息,跟着提示做,不做也行
第三步:将 beans.xml 引入主程序启动类
@ImportResource("classpath:beans.xml")
@SpringBootApplication
public class Chapter01Application {
public static void main(String[] args) {
SpringApplication.run(Chapter01Application.class, args);
}
}
第四步:和之前一样编写对应测试方法,该方法测试是否存在 bean myService
@Autowired
private ApplicationContext applicationContext;
@Test
public void iocTest(){
System.out.println(applicationContext.containsBean("myService"));
}
Debug结果为true:
使用 Congratulation 自定义配置类
与上一种方法都是为了将 MyService 做成bean,上一种方法采用的是 Spring 的xml 管理方式,更复杂一点。
第一步:注释前面写的 @ImportResource("classpath:beans.xml")
,否则会引发 bean 使用的冲突。
第二步:在 config 目录下创建 MyConfig 文件,编写代码:
package com.example.chapter01.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
public MyService myService(){
return new MyService();
}
}
第三步:重新 Debug 测试方法 iocTest()
,结果仍然为 true。
注意:如果报错,记得检查是否注@ImportResource("classpath:beans.xml")
。
Profile 多环境配置
我们之前主程序启动后运行的端口是 8080,我们可以增加一些配置,使其运行在其他 80 端口
第一步:在 resource 目录下创建 properties bundle 的文件 application-test.propertise
添加代码:
server.port=8083
第二步:打开文件 application.propertise
添加代码:
spring.profiles.active=test
第三步:重新 run 主程序,检查端口是否改为8083
随机数设置和参数值引用
第一步:在 resource 目录下的 test.properties 文件添加代码
//产生随机数
tom.age = ${random.int[10,20]}
tom.description = tom的年龄可能是:${tom.age}
第二步:编写测试方法:
//Value 可以读取配置文件的信息
@Value("${tom.description}")
private String description;
@Test
public void placeholderTest(){
System.out.println(description);
}
Debug 结果:
后续继续更新后面部分