本文來自于千鋒教育在阿裡雲開發者社群學習中心上線課程《SpringBoot實戰教程》,主講人楊紅豔, 點選檢視視訊内容
。
本課程包含了SpringBoot的基本使用及SpringBoot如何和各項技術整合,快速學習到 SpringBoot 整合其他技術,熟練使用 SpringBoot。
随着動态語言的流行(Ruby,Groovy,Scala,Node.js),Java的開發顯得格外的笨重:繁多的配置,低下的開發效率,複雜的部署流程以及第三方技術內建難度大。在上述環境下,SpringBoot應運而生。它使用“習慣由于配置”的理念讓項目快速運作起來。使用SpringBoot很容易建立一個獨立運作(運作jar,内嵌Servlet容器)準生産級别的基于Spring架構的項目,使用SpringBoot可以不用或隻需要很少的Spring配置。
第一節:SpringBoot 入門程式
SpringBoot核心特點:
- 可以以jar包的形式獨立運作,運作一個SpringBoot項目隻需通過 java -jar xx.jar來運作
- 内嵌Servlet容器,SpringBoot可以選擇Tomcat,Jetty或者Undertow,這樣我們無須以war包形式部署項目
- 簡化Maven配置,SpringBoot提供了一系列的starter pom 來簡化Maven的依賴加載
- SpringBoot會根據在類路徑中的jar包,類,為jar包中的類自動配置Bean,這樣就極大的減少了我們要使用的配置
- ......
第二節:超全!預設全局配置檔案都在這啦!
SpringBoot項目使用一個全局的配置檔案application.properties或者是application.yml,在resources目錄下或者類路徑下的/config下,一般我們放到resources下。
預設的配置很多,使用的時候查找即可:
# BANNER
banner.charset=UTF-8 # Banner file encoding.
banner.location=classpath:banner.txt # Banner file location.
banner.image.location=classpath:banner.gif # Banner image file location (jpg/png can also be used).
banner.image.width= # Width of the banner image in chars (default 76)
banner.image.height= # Height of the banner image in chars (default based on image height)
banner.image.margin= # Left hand image margin in chars (default 2)
banner.image.invert= # If images should be inverted for dark terminal themes (default false)
......
第三節:3個經典場景配置
1、SpringBoot為我們提供了企業級開發絕大多數場景的starter pom,隻要使用了應用場景所需的starter pom,相關的技術配置将會消除,就可以得到SpringBoot為我們提供的自動配置的Bean。
2、在SpringBoot中如何擷取自定義的值?
使用
@Value(“${book.author}”)
擷取自定義屬性的值。
3、SpringBoot還提供了基于類型安全的配置方式,通過@ConfigurationProperties将properties中的屬性和一個Bean的屬性關聯,進而實作類型安全的配置。
第四節:自動配置的原理詳解
既然SpringBoot可以在根據可依賴的架包進行自動配置,說明在項目啟動的時候進行了配置。
SpringBoot自動配置的原理就是讀取了檔案中的類,根據屬性使用預設值。
第五節:不再做重複工作!建立父工程搞定
在建立每個SpringBoot前,都需要父級依賴。顯然很麻煩,那麼能不能不做父級依賴?我們自己建立父級依賴,這個父級工程對jar包進行管理,那麼子工程就不用每一個進行父級依賴了。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
子工程如何實作父級依賴呢?
第六節:玩轉SpringBootApplication注解
應該把啟動方法放在一個單獨的類當中,這個類就稱為啟動類。
@EnableAutoConfiguration
@ComponentScan("com.qianfeng.controller")
public class SpringController {
public static void main(String[] args) {
SpringApplication.run(SpringController.class, args);
}
}
另外還有一個注解,該注解是一個組合注解,可以替代啟動類的兩個注解。
@SpringBootApplication //組合注解
第七節:一文了解SpringBoot的日志管理
SprongBoot使用的預設日志架構是Logback,并用INFO級别輸出到控制台。
日志輸出内容元素具體如下:
- 時間日期:精确到毫秒
- 日志級别:ERROR, WARN, INFO, DEBUG or TRACE
- 程序ID
- 分隔符:— 辨別實際日志的開始
- 線程名:方括号括起來(可能會截斷控制台輸出)
- Logger名:通常使用源代碼的類名
- 日志内容
第八節:2種loger的使用
第一種:帶有loger的配置,不指定級别,不指定appender
< logger name="com.qianfeng.controller" />
第二種:帶有多個loger的配置,指定級别,指定appender
<logger name="com.qianfeng.controller.SpringController" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
第九節:不同環境下如何輸出不同日志
根據不同環境(prod:生産環境,test:測試環境,dev:開發環境)來定義不同的日志輸出,在 logback-spring.xml中使用 springProfile 節點來定義,方法如下:
<!-- 測試環境+開發環境. 多個使用逗号隔開-->
<springProfile name="test,dev">
<logger name="com.qianfeng.controller" level="info" />
</springProfile>
<!-- 生産環境-->
<springProfile name="prod">
<logger name="com.qianfeng.controller" level="ERROR" />
</springProfile>
在application.properties檔案中指明使用哪一種:
spring.profiles.active=prod
第十節:還在手動操作?試試配置為開發模式
大家會發現每次對代碼進行了修改之後,都需要手動的進行啟動,這樣很麻煩。是以我們可以把工程設定為開發模式,就不需要這樣麻煩了。設定開發模式之後,需要加入兩個依賴:
<!-- 加入以下依賴,代碼做了修改,不用重新運作 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId> </dependency>
第十一節:詳解通路靜态資源
在SpringBoot中加載靜态資源和在普通的web應用中不太一樣。預設情況下,Spring Boot從classpath的/static,/public或/META-INF/resources檔案夾或從ServletContext根目錄提供靜态内容。
如果想自己配置,我們需要在全局配置當中,覆寫預設配置:
其對應屬性為:
spring.resources.static-locations=classpath:/static/
第十二節:如何解析Json資料
SpringBoot預設配置的是Jackson。
自定義使用FastJson解析Json資料,添加依賴:
<!-- fastjson的依賴 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
配置FastJson有兩種方式:
第一種:讓啟動類繼承WebMvcConfigurerAdapter
第十三節:定義全局異常處理器
SpringBoot使用AOP思想進行全局異常處理
異常通常作為一個通知介入的,是以說我們需要用到注解。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public Map<String,Object> allExceptionHandler(
Exception exception) throws Exception
{
Map<String,Object> map = new HashMap<String,Object>();
map.put("errorCode", 500);
map.put("errorMsg", exception.toString());
return map;
}
}
第十四節:異步調用實作多線程處理任務
在項目中,當通路其它接口較慢或者做耗時任務時,不想程式一直卡在耗時任務上,想程式能夠并行執行,我們可以使用多線程來并行的處理任務,SpringBoot提供了異步處理方式@Async。
第十五節:官方推薦!SpringBoot這樣整合JSP
Spring Boot官方不推薦使用jsp,因為jsp相對于一些模闆引擎,性能都比較低,官方推薦使用thymeleaf。
springboot整合jsp,必須是war工程。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
第十六節:詳解SpringBoot整合Freemarker
springboot不建議使用jsp,使用模闆引擎,比如themleaf,velocity,freemarker整合freemarker 。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
第十七節:SpringBoot整合Thymeleaf
SpringBoot官方是不推薦jsp頁面的,推薦的是模闆引擎。Thymeleaf是其中一種模闆引擎。SpringBoot如何整合Thymeleaf:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
第十八節:SpringBoot整合QuartZ
QuartZ是一個任務排程架構,我們以實作每隔一秒列印一下時間為例:
//任務
@Component
public class MyJob {
@Scheduled(fixedRate=1000)
public void run()
{
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
第十九節:SpringBoot中如何使用JdbcTemplate?
我們通過新增資料庫表中的使用者來實作SpringBoot中如何使用JdbcTemplate。
<!-- springboot整合jdbctemplate -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql的依賴 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
第二十節:SpringBoot中如何使用xml方式整合Mybatis?
通過實作對資料庫表中添加使用者以及分頁查找使用者來實作SpringBoot中如何使用xml方式整合Mybatis。
添加mybatis、MySQL、druid資料庫連接配接池、分頁依賴:
<!-- springboot整合mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- alibaba的druid資料庫連接配接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.11</version>
</dependency>
<!-- 分頁插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.2</version>
</dependency>
<!-- @Param注解在該包中 -->
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-core</artifactId>
<version>3.0</version>
</dependency>
第二十一節:SpringBoot中如何使用注解方式整合Mybatis?
通過實作查找使用者和添加使用者,來解析SpringBoot中如何使用注解方式去整合Mybatis。
@Service
public class UsersServiceImpl implements UsersService {
@Autowired
private UsersMapper usersMapper;
@Override
public Users findUser(String name) {
return usersMapper.findUserByName(name);
}
@Override
public void saveUser(Users user) {
usersMapper.addUser(user.getName(), user.getPassword());
}
}
第二十二節:如何區分多資料源?
在項目中,我們通常會進行資料庫拆分或是引入其他資料庫,進而我們需要配置多個資料源。
如何區分多個資料源:
- 通過包來區分:com.db1.mapper、com.db2.mapper
- 使用注解來區分:需要用到大量的注解,一般不推薦使用。
第二十三節:SpringBoot的事務管理
在SpringBoot中可以使用xml配置檔案的方式或者注解的方式來聲明事務。
在Spring Boot中推薦使用@Transactional注解來聲明事務。
當我們使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依賴的時候,SpringBoot會自動預設分别注入DataSourceTransactionManager或JpaTransactionManager。
第二十四節:SpringBoot如何整合JPA-Hibernate?
通過實作資料庫表中添加、查找、删除使用者的功能來詳解SpringBoot如何整合JPA-Hibernate。
<!-- springboot整合jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
第二十五節:如何在SpringBoot中實作郵件的發送?
擷取發件人的郵箱:
@Component
public class EmailConfig {
@Value("${spring.mail.username}")
private String emailFrom;
public String getEmailFrom() {
return emailFrom;
}
public void setEmailFrom(String emailFrom) {
this.emailFrom = emailFrom;
}
}
第二十六節:如何實作發送帶附件的郵件?
發送帶附件的郵件:
void sendAttachmentMail(String sendTo, String title, String content, File file);
第二十七節:如何發送基于模闆的郵件?
模闆:使用一些相同的模闆,但裡面的資料是可以變化的。
添加模闆引擎依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
第二十八節:SpringBoot實作檔案上傳
實作上傳頁面:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>檔案上傳</title>
</head>
<body>
<h2>檔案上傳</h2>
<hr/>
<form method = "POST" enctype="multipart/form-data" action="/upload">
<p>
檔案<input type="file" name="file"/>
</p>
<p>
<input type="submit" value="上傳"/>
</p>
</form>
</body>
</html>
第二十九節:SpringBoot實作批量檔案上傳
批量上傳需要利用for循環實作:
//建立檔案在伺服器端的存放路徑
String dir=request.getServletContext().getRealPath("/upload");
File fileDir = new File(dir);
if(!fileDir.exists())
fileDir.mkdirs();
//生成檔案在伺服器端存放的名字
for(int i = 0;i<file.length;i++) {
String fileSuffix=file[i].getOriginalFilename().substring(file[i].getOriginalFilename().lastIndexOf("."));
String fileName=UUID.randomUUID().toString()+fileSuffix;
File files = new File(fileDir+"/"+fileName);
//上傳
file[i].transferTO(files);
}
第三十節:什麼是Neo4J?
Neo4j是一個高性能的,NOSQL圖形資料庫,它是一個嵌入式的、基于磁盤的、具備完全的事務特性的Java持久化引擎,但是它将結構化資料存儲在網絡(從數學角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟資料庫的所有特性。

第三十一節:SpringBoot如何整合Neo4j?
添加依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
在全局配置檔案application.properties中添加:
spring.data.neo4j.uri=http://localhost:7474
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=123
第三十二節:SpringBoot如何整合Redis(單機版)?
在程式之中Redis緩存如何使用:
首先開啟緩存,在啟動類中添加
@EnableCaching //開啟緩存
第三十三節:SpringBoot如何整合Redis叢集?
添加叢集配置:
spring.redis.cluster.nodes=192.168.25.128:7550, 192.168.25.128:7551, 192.168.25.128:7552, 192.168.25.128:7553, 192.168.25.128:7554, 192.168.25.128:7555
第三十四節:SpringBoot如何內建MongoDB?
MongoDB是一個基于分布式檔案存儲的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充的高性能資料存儲解決方案。MongoDB是一個介于
關系資料庫和非關系資料庫之間的産品,是非關系資料庫當中功能最豐富,最像關系資料庫的。他支援的資料結構非常松散,是類似
json的bson格式,是以可以存儲比較複雜的資料類型。Mongo最大的特點是他支援的查詢語言非常強大,其文法有點類似于面向對象的查詢語言,幾乎可以實作類似關系資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。
第三十五節:SpringBoot怎樣整合ActiveMQ?
ActiveMQ是符合JMS規範的消息管理者。
<!-- 整合ActiveMQ的依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
第三十六節:SpringBoot怎樣整合RabbitMQ?
通過SpringBoot內建RabbitMQ實作消息的發送,接收。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
第三十七節:Kafka概述及安裝
Apache Kafka是一個分布式釋出 - 訂閱消息系統和一個強大的隊列,可以處理大量的資料,并使您能夠将消息從一個端點傳遞到另一個端點。 Kafka适合離線和線上消息消費。 Kafka消息保留在磁盤上,并在群集内複制以防止資料丢失。 Kafka建構在ZooKeeper同步服務之上。 它與Apache Storm和Spark非常好地內建,用于實時流式資料分析。
第三十八節:SpringBoot如何實作Solr?
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
</dependency>
全局配置:
spring.data.solr.host=http://192.168.25.129:8080/solr
第三十九節:ElasticSearch概述及安裝
ElasticSearch是一個基于Lucene的搜尋伺服器。它提供了一個分布式多使用者能力的全文搜尋引擎,基于RESTful web接口。Elasticsearch是用Java開發的,并作為Apache許可條款下的開放源碼釋出,是目前流行的企業級搜尋引擎。用于
雲計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用友善。
第四十節:SpringBoot如何整合ElasticSearch?
添加相關依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
application.yml全局配置:
spring:
data:
elasticsearch:
cluster-nodes: 192.168.25.129:9300
local: false
repositories:
enabled: true
第四十一節:SpringBoot如何整合WebSocket?
WebSocket 連接配接允許用戶端和伺服器之間進行全雙工通信,以便任一方都可以通過建立的連接配接将資料推送到另一端。WebSocket 隻需要建立一次連接配接,就可以一直保持連接配接狀态。這相比于輪詢方式的不停建立連接配接顯然效率要大大提高。
第四十二節:SpringBoot如何整合AngularJS?
SpringBoot整合AngularJS實作資料庫表頁面的增删改查。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>