Spring Boot基础快速开发
SpringBoot 概述
SpringBoot官方开发文档spring boot reference guide
Spring Boot 功能
-
自动配置
-
起步依赖(传递依赖):将具备某种功能的坐标打包到一起,并提供一些默认的功能.
-
辅助功能:内置tomcat等
Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式。
SpringBoot 快速入门
快速构建springboot项目(推荐)
基于maven搭建SpringBoot工程
-
创建Maven项目
-
导入SpringBoot起步依赖
pom.xml中添加
<groupId>com.emprock</groupId> <artifactId>springboot_helloworld</artifactId> <version>1.0-SNAPSHOT</version> <!-- 从Spring Boot默认继承 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> </parent> <!-- 为web应用程序添加典型的依赖项 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
-
定义Controller
HelloController类中
package com.emprock.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @RequestMapping("/hello") public String hello(){ return "hello world"; } }
-
编写引导类
package com.emprock; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; //引导类,项目入口 @SpringBootApplication public class HelloApplication { public static void main(String[] args) { SpringApplication.run(HelloApplication.class,args); } }
-
启动测试
控制台显示Started HelloApplication in 25.596 seconds (JVM running for 33.273)启动成功
浏览器网址输入localhost:8080/hello返回hello world则项目成功运行
遇到的问题:无法导入@SpringBootApplication包
解决方案:pom.xml中spring-boot-starter-parent版本修改为1.4.0.RELEASE及以上版本
SpringBoot 起步依赖原理分析
1) spring-boot-starter-parent
定义了各种技术的版本信息,组合了一套最优搭配的技术版本,不指定版本父类里自动匹配版本,指定版本注意版本冲突问题
2) spring-boot-starter-web
在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程。
我们的工程继承parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在版本冲突等问题。
SpringBoot 配置
配置文件在resources文件中
配置文件分类
- SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties(server.port=8080)或者application.yml(application.yaml)(server: port: 8080)进行配置。
- 默认配置文件名称:application
- 在同一级目录下优先级为:properties > yml > yaml
yaml
YML文件是以数据为核心的,比传统的xml方式更加简洁。
-
大小写敏感
-
数据值前边必须有空格,作为分隔符
-
使用缩进表示层级关系缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱,idea自动将tab转换为空格)。
-
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
-
“#” 表示注释,从这个字符一直到行尾,都会被解析器忽略
例:
server:
port: 8080
address: 127.0.0.1
YAML:数据格式
-
对象(map):键值对的集合。
person: name: aaa #行内写法 person: {name: aaa}
-
数组:一组按次序排列的值
address:
- bbb
- ccc
#行内写法
address: {bbb,ccc}
- 纯量:单个的、不可再分的值
msg1: 'hello /n world' #单引忽略转义字符
msg2: "hello /n world" #双引识别转义字符
YAML:参数引用
name: lisi
person:
name: ${name} # 引用上边定义的name值
读取配置文件内容
1) @Value单个注入
@Value("${person.name}")
private String name;
@Value("${address[0]}")
private String address;
@Value("${msg1}")
private String msg1;
2) Environment注入一个对象
@Autowired
private Environment env;
@RequestMapping("/hello")
public String hello(){
System.out.println(env.getProperty("person.name"));
System.out.println(env.getProperty("address[0]"));
System.out.println(env.getProperty("msg1"));
return "hello world";
}
3) @ConfigurationProperties对象与控制属性的绑定
//调用类中代码
@Autowired
public Person person;
package com.emprock.springbootinit;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
//实体类中代码
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private String[] address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String[] getAddress() {
return address;
}
public void setAddress(String[] address) {
this.address = address;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
resources下yml类中
person:
name: aaa
age: 11
address:
- bbb
- ccc
profile
- profile是用来完成不同环境下,配置动态切换功能的。
2) profile配置方式
-
多profile文件方式:提供多个配置文件,每个代表一种环境。
application-dev.properties/yml 开发环境
application-test.properties/yml 测试环境
application-pro.properties/yml 生产环境
在application.properties中调用对应的环境spring.profiles.active=dev
-
yml多文档方式:在yml中使用 — 分隔不同配置
--- server: port: 8081 spring: config: activate: on-profile: test --- server: port: 8082 spring: config: activate: on-profile: dev --- server: port: 8083 spring: config: activate: on-profile: pro --- #调用配置 spring: profiles: active: test
3) profile激活方式
配置文件中配置:spring.profiles.active=dev
虚拟机参数:在VM options 指定:-Dspring.profiles.active=dev
或在Program argvments指定: --spring.profiles.active=pro
打包后命令行参数(工作中使用):java –jar .\程序jar包名.jar --spring.profiles.active=pro
在jar包文件目录空白处按shift+右键,选在此处打开Power shell窗口,执行上面的命令即可
ctrl+c结束运行
内部配置加载顺序
Springboot程序启动时,会从以下位置加载配置文件:
1.file:./config/:当前项目下的/config目录下
2.file:./ :当前项目的根目录
3.classpath:/config/:classpath的/config目录
4.classpath:/ :classpath的根目录
加载顺序为上文的排列顺序,高优先级配置的属性会生效
外部配置加载顺序
外部配置作用:快速配置项目配置
通过官网查看外部属性加载顺序: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
SpringBoot 整合其他框架
SpringBoot整合Junit。
-
搭建SpringBoot工程
见文章开头
-
引入starter-test起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
- 编写测试类
import org.springframework.stereotype.Service;
@Service
public class UserService {
public void add(){
System.out.println("add..");
}
}
- 添加测试相关注解@RunWith(SpringRunner.class)@SpringBootTest(classes = 启动类.class)及编写测试方法
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)
//包名路径或子包与测试包路径相同可以不指定启动类
@SpringBootTest(classes = SpringBootInitApplication.class)
class SpringBootInitApplicationTests {
@Autowired
private UserService userService;
@Test
public void testAdd(){
userService.add();
}
}
SpringBoot整合Redis。
- 搭建SpringBoot工程
见文章开头
- 引入redis起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置redis相关属性
spring:
data:
redis:
host: 127.0.0.1
port: 6379
-
注入RedisTemplate模板与编写测试方法,测试
运行redis-server.exe
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class SpringBootRedisApplicationTest { @Autowired private RedisTemplate redisTemplate; @Test public void testSet(){ redisTemplate.boundValueOps("name").set("hello"); } @Test public void testGet(){ Object name = redisTemplate.boundValueOps("name").get(); System.out.println(name); } }
SpringBoot整合MyBatis.
-
搭建SpringBoot工程与准备mysql数据
cmd运行mysql -uroot -proot
CREATE DATABASE `springboot`; USE `springboot`; DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `password` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; insert into `t_user`(`id`,`username`,`password`) values (1,'zhangsan','123'),(2,'lisi','234');
-
引入mybatis起步依赖,添加mysql驱动
<!-- mybatis依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <!-- mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--可不加,无影响--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter-test</artifactId> <version>3.0.3</version> <scope>test</scope> </dependency>
-
编写DataSource和MyBatis相关配置
spring: datasource: url: jdbc:mysql:///springboot?serverTimezone=UTC username: root password: root driver-class-name: com.mysql.jdbc.Driver
-
定义表和实体类
public class User { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
-
编写dao和mapper文件/纯注解开发
- 注解开发
import com.emprock.springbootmybatis.domain.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; import java.util.List; @Mapper @Repository public interface UserMapper { @Select("select * from t_user") public List<User> findAll(); }
- mapper文件开发
import com.emprock.springbootmybatis.domain.User; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; import java.util.List; @Mapper @Repository public interface UserXmlMapper { public List<User> findAll(); }
resources文件下创建mapper文件中创建UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.emprock.springbootmybatis.mapper.UserXmlMapper"> <select id="findAll" resultType="user"> select * from t_user </select> </mapper>
yml文件中
mybatis: mapper-locations: classpath:mapper/*Mapper.xml #mapper映射文件路径 type-aliases-package: com.emprock.springbootmybatis.domain # config-location: #指定mybatis的核心配置文件
-
测试
import com.emprock.springbootmybatis.domain.User; import com.emprock.springbootmybatis.mapper.UserMapper; import com.emprock.springbootmybatis.mapper.UserXmlMapper; import org.junit.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; import java.util.List; @RunWith(SpringRunner.class) @SpringBootTest public class SpringBootMybatisApplicationTests { //注解开发 @Autowired private UserMapper userMapper; @Test public void testFindAll() { List<User> list = userMapper.findAll(); System.out.println(list); } //mapper文件开发 @Autowired private UserXmlMapper userXmlMapper; @Test public void testFindAll2() { List<User> list = userXmlMapper.findAll(); System.out.println(list); } }
-
出现的错误信息
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.emprock.springbootinit.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
解决:版本问题导致,mybatis-spring-boot-starter由1.3.0版本改为3.0.3即可
SpringBoot 项目部署
jar包(推荐)
新建模块
选择Web > Spring Web
创建类
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/user")
@RestController
public class UserController {
@RequestMapping("/findAll")
public String findAll(){
return "success";
}
}
右侧maven > Lifecycle > package打包
运行jar包命令
java -jar .\springboot-admin-server-0.0.1-SNAPSHOT.jar
war包
pom
<!--添加到<properties>上面一行-->
<packaging>war</packaging>
启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class SpringbootAdminServerApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringbootAdminServerApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringbootAdminServerApplication.class);
}
}
右侧maven > Lifecycle > package打包
将war包放入外置tomcat的webapps中即可
虚拟目录端口号后面需要加上springboot/