0.前言:
SpringBoot是Spring社區發佈的一個開源項目,在幫助開發者快速並且更簡單的構建項目。它使用習慣優於配置的理念讓你的項目快速運行起來,使用Spring Boot很容易創建一個獨立運行(運行jar,內置Servlet容器,Tomcat、jetty)、準生產級別的基於Spring框架的項目,使用SpringBoot框架,你可以不用或者只需要很少的配置文件。
1. Spring Boot概述
目標:瞭解Spring Boot是什麼,有什麼作用
小結:
Spring Boot是一個便捷搭建 基於spring工程的腳手架;作用是幫助開發人員快速搭建大型的spring 項目。簡化工程的配置,依賴管理;實現開發人員把時間都集中在業務開發上。
2. Spring Boot入門
目標:能夠使用Spring Boot搭建項目
分析:
需求:可以在瀏覽器中訪問http://localhost:8080/hello輸出一串字符
實現步驟:
- 創建工程;
- 添加依賴(啓動器依賴,spring-boot-starter-web);
- 創建啓動類;
- 創建處理器Controller;
- 測試
小結:
Spring Boot工程可以通過添加啓動器依賴和創建啓動引導類實現快速創建web工程。
spring-boot-starter-web默認的應用服務器端口是8080
3. Java代碼方式配置
目標:可以使用@Value獲取配置文件配置項並結合@Bean註冊組件到Spring
分析:
需求:使用Java代碼配置數據庫連接池,並可以在處理器中注入並使用
步驟:
- 添加依賴;
- 創建數據庫;
- 創建數據庫連接參數的配置文件jdbc.properties;
- 創建配置類;
- 改造處理器類注入數據源並使用
小結:
package com.itheima.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import javax.sql.DataSource;
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
4. Spring Boot屬性注入方式
目標:能夠使用@ConfigurationProperties實現Spring Boot配置文件配置項讀取和應用
分析:
需求:將配置文件中的配置項讀取到一個對象中;
實現:可以使用Spring Boot提供的註解@ConfigurationProperties,該註解可以將Spring Boot的配置文件(默認必須爲application.properties或application.yml)中的配置項讀取到一個對象中。
實現步驟:
- 創建配置項類JdbcProperties類,在該類名上面添加@ConfigurationProperties;
- 將jdbc.properties修改名稱爲application.properties;
- 將JdbcProperties對象注入到JdbcConfig;
- 測試
小結:
- 使用@ConfigurationProperties編寫配置項類將配置文件中的配置項設置到對象中
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String url;
private String driverClassName;
private String username;
private String password;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
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;
}
}
- 使用@ConfigurationProperties在方法上面使用
@Bean
@ConfigurationProperties(prefix = "jdbc")
public DataSource dataSource() {
return new DruidDataSource();
}
5. 多個yml文件配置
目標:可以將多個yml文件在application.yml文件中配置激活
分析:
yaml與properties配置文件除了展示形式不相同以外,其它功能和作用都是一樣的;在項目中原路的讀取方式不需要改變。
1)yml配置文件的特徵:
- 樹狀層級結構展示配置項;
- 配置項之間如果有關係的話需要分行空兩格;
- 配置項如果有值的話,那麼需要在
:
之後空一格再寫配置項值;
將application.properties配置文件修改爲application.yml的話:
jdbc:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/heima
username: root
password: root
key:
abc: cba
def:
- g
- h
- j
2)多個yml配置文件;在spring boot中是被允許的。這些配置文件的名稱必須爲application-***.yml,並且這些配置文件必須要在application.yml配置文件中激活之後纔可以使用。
3)如果properties和yml配置文件同時存在在spring boot項目中;那麼這兩類配置文件都有效。在兩個配置文件中如果存在同名的配置項的話會以properties文件的爲主。
小結:
在多個配置文件時,需要將這些文件在application.yml文件中進行激活:
#激活配置文件;需要指定其它的配置文件名稱
spring:
profiles:
active: abc,def
6. 自動配置原理
目標:瞭解Spring Boot項目的配置加載流程
小結:
- 在
META-INF\spring.fatories
文件中定義了很多自動配置類;可以根據在pom.xml文件中添加的 啓動器依賴自動配置組件 - 通過如下流程可以去修改application配置文件,改變自動配置的組件默認參數
7. lombok應用
目標:使用lombok的註解實現pojo類的簡化
分析:
使用Spring Boot整合SSM工程;需要使用到數據庫數據。
-
將數據庫表數據導入到數據庫中(springboot_test);
-
編寫數據庫表對應的實體類;一般情況下需要編寫get/set/toString等這些方法會耗時並且會讓實體類看起來比較臃腫。可以使用lombok插件對實體類進行簡化。
lombok是一個插件工具類包;提供了一些註解@Data、@Getter等這些註解去簡化實體類中的構造方法、get/set等方法的編寫。
- 在IDEA中安裝lombok插件;
- 添加lombok對應的依賴到項目pom.xml文件;
- 改造實體類使用lombok註解
小結:
在Bean上使用:
@Data :自動提供getter和setter、hashCode、equals、toString等方法
@Getter:自動提供getter方法
@Setter:自動提供setter方法
@Slf4j:自動在bean中提供log變量,其實用的是slf4j的日誌功能。
8. Spring Boot整合-SpringMVC端口和靜態資源
目標:可以修改tomcat的端口和訪問項目中的靜態資源
分析:
-
修改tomcat端口
查詢**Properties,設置配置項(前綴+類變量名)到application配置文件中
-
訪問項目中的靜態資源
靜態資源放置的位置;放置靜態資源並訪問這些資源
小結:
- 修改項目tomcat端口:
#tomcat端口
server:
port: 80
- 在spring boot項目中靜態資源可以放置在如下目錄:
9.Spring Boot整合-SpringMVC攔截器
目標:可以在Spring Boot項目中配置自定義SpringMVC攔截器
分析:
- 編寫攔截器(實現HandlerInterceptor);
- 編寫配置類實現 WebMvcConfigurer,在該類中添加各種組件;
- 測試
小結:
可以在spring boot項目中通過配置類添加各種組件;如果要添加攔截器的話:
package com.itheima.config;
import com.itheima.interceptor.MyInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MvcConfig implements WebMvcConfigurer {
//註冊攔截器
@Bean
public MyInterceptor myInterceptor(){
return new MyInterceptor();
}
//添加攔截器到spring mvc攔截器鏈
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor()).addPathPatterns("/*");
}
}
10. Spring Boot整合-事務和連接池
目標:配置Spring Boot自帶默認的hikari數據庫連接池和使用@Transactional註解進行事務配置
分析:
-
事務配置
- 添加事務相關的啓動器依賴,mysql相關依賴;
- 編寫業務類UserService使用事務註解@Transactional
-
數據庫連接池hikari配置
只需要在application配置文件中指定數據庫相關參數
小結:
- 事務配置;只需要添加jdbc啓動器依賴
- 數據庫連接池使用默認的hikari,在配置文件中配置如下:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springboot_test
username: root
password: root
11. Spring Boot整合-Mybatis
目標:配置Mybatis在Spring Boot工程中的整合包,設置mybatis的實體類別名,輸出執行sql語句配置項
分析:
- 添加啓動器依賴;
- 配置Mybatis:實體類別名包,日誌,映射文件等;
- 配置MapperScan
小結:
-
添加mybatis官方對於spring boot的一個啓動器
<!--mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.1</version> </dependency>
-
配置mybatis
mybatis: # 實體類別名包路徑 type-aliases-package: com.itheima.pojo # 映射文件路徑 # mapper-locations: classpath:mappers/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
設置啓動器類中的mapper掃描
12. Spring Boot整合-通用Mapper
目標:配置通用Mapper組件到Spring Boot項目中並使用Mapper接口
分析:
通用Mapper:可以實現自動拼接sql語句;所有的mapper都不需要編寫任何方法也就是不用編寫sql語句。可以提高開發效率。
- 添加啓動器依賴;
- 改造UserMapper繼承Mapper;
- 修改啓動引導類Application中的Mapper掃描註解;
- 修改User實體類添加jpa註解;
- 改造UserService實現業務功能;
小結:
在啓動引導類上面的mapper掃描註解 一定要修改爲 通用mapper的掃描註解
13. Spring Boot整合測試
目標:可以訪問處理器對應路徑將數據庫中的數據根據id查詢
分析:
- 改造HelloController,注入UserService利用其方法實現查詢;
- 啓動項目進行測試 http://localhost/user/用戶id --> http://localhost/user/8
小結:
修改了HelloController:
@Autowired
private UserService userService;
/**
* 根據用戶id查詢用戶
* @param id 用戶id
* @return 用戶
*/
@GetMapping("/user/{id}")
public User queryById(@PathVariable Long id){
return userService.queryById(id);
}
14. Spring Boot整合-Junit
目標:在Spring Boot項目中使用Junit進行單元測試UserService的方法
分析:
- 添加啓動器依賴spring-boot-starter-test;
- 編寫測試類
小結:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void queryById() {
User user = userService.queryById(8L);
System.out.println("user = " + user);
}
@Test
public void saveUser() {
User user = new User();
user.setUserName("test2");
user.setName("test2");
user.setAge(13);
user.setPassword("123456");
user.setSex(1);
user.setCreated(new Date());
userService.saveUser(user);
}
}
在Spring Boot項目中如果編寫測試類則必須要在類上面添加@SpringBootTest
15. Spring Boot整合-redis
目標:在Spring Boot項目中使用Junit測試RedisTemplate的使用
分析:
- 添加啓動器依賴;spring-boot-starter-data-redis
- 配置application.yml中修改redis的連接參數;(redis需要啓動)
- 編寫測試類應用RedisTemplate操作redis中的5種數據類型(string/hash/list/set/sorted set)
小結:
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test(){
//string 字符串
//redisTemplate.opsForValue().set("str", "heima");
redisTemplate.boundValueOps("str").set("heima");
System.out.println("str = " + redisTemplate.opsForValue().get("str"));
//hash 散列
redisTemplate.boundHashOps("h_key").put("name", "heima");
redisTemplate.boundHashOps("h_key").put("age", 13);
//獲取所有域
Set set = redisTemplate.boundHashOps("h_key").keys();
System.out.println(" hash散列的所有域:" + set);
//獲取所有值
List list = redisTemplate.boundHashOps("h_key").values();
System.out.println(" hash散列的所有域的值:" + list);
//list 列表
redisTemplate.boundListOps("l_key").leftPush("c");
redisTemplate.boundListOps("l_key").leftPush("b");
redisTemplate.boundListOps("l_key").leftPush("a");
//獲取全部元素
list = redisTemplate.boundListOps("l_key").range(0, -1);
System.out.println(" list列表中的所有元素:" + list);
// set 集合
redisTemplate.boundSetOps("s_key").add("a", "b", "c");
set = redisTemplate.boundSetOps("s_key").members();
System.out.println(" set集合中的所有元素:" + set);
// sorted set 有序集合
redisTemplate.boundZSetOps("z_key").add("a", 30);
redisTemplate.boundZSetOps("z_key").add("b", 20);
redisTemplate.boundZSetOps("z_key").add("c", 10);
set = redisTemplate.boundZSetOps("z_key").range(0, -1);
System.out.println(" zset有序集合中的所有元素:" + set);
}
}
16. Spring Boot項目部署
目標:將Spring Boot項目使用maven指令打成jar包並運行測試
分析:
- 需要添加打包組件將項目中的資源、配置、依賴包打到一個jar包中;可以使用maven的
package
; - 部署:java -jar 包名
小結:
-
添加打包組件
<build> <plugins> <!-- 打jar包時如果不配置該插件,打出來的jar包沒有清單文件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
-
部署運行
java -jar 包名