SpringBoot簡介及與整合
SpringBoot
SpringBoot簡介:
簡單的說,spring boot就是整合了很多優秀的框架,不用我們自己手動的去寫一堆xml配置然後進行配置。 從本質上來說,Spring Boot就是Spring,它做了那些沒有它你也會去做的Spring Bean配置。它使用“習慣優於配置”(專案中存在大量的配置,此外還內建了一個習慣性的配置,讓你無需手動進行配置)的理念讓你的專案快速執行起來。使 用Spring Boot很容易建立一個獨立執行(執行jar,內嵌Servlet容器)、準生產級別的基於Spring框架的專案,使用Spring Boot你可以不用或者只需要很少的Spring配置。
SpringBoot工程環境快速搭建
步驟分析: 建專案– 建立一個maven工程 注意:springboot整合的時候在建立maven工程的時候一定要建立一個父 工程 而且,父工程選擇2.x的版本,因為我們用的是spring5.x的版本。
導依賴– spring-boot-web.jar
寫配置… 配置SpringBoot的核心配置檔案application.properties 此處省略一堆字。因為我們今天要用springboot
建立類– 在src目錄下的com.itiheimaba包下新建一個SpringBootApplicationRunner的類。並且在類上加上 @SpringBootApplication 的註解來表示此類就是一個SpringBoot的啟動器。另外還需要我們在此類中寫一個main方法,方法中利用 SpringApplication.run(SpringBootApplicationRunner.class,args); 來完成最終的啟動。
訪問localhost:8080 分析spring-boot-web這個依賴:由於這個依賴的匯入,根據maven 的依賴機制他給我們匯入了一大堆支援我們開發的依賴。
springboot啟動器
@SpringBootApplication
public class SpringBootApplicationRunner {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplicationRunner.class, args);
}
}
解釋此類的作用: 這個類就是我們SpringBoot 整合其他框架的一個啟動類,一會所有準備都完事後,只要一執行此類,那麼整合就完事了。
解釋@SpringBootApplication的作用:
@SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan @Configuration – 提到@Configuration就要提到他的搭檔@Bean。使 用這兩個註解就可以建立一個簡單的spring配置 類,可以用來替代相應的xml配置檔案。 @EnableAutoConfiguration – 能夠自動配置spring的上下文,試圖猜 測和配置你想要的bean類,通常會自動 根據你的類路徑和你的bean定義自動配 置。 @ComponentScan – 會自動掃描指定包下的全部標有@Component的類,並註冊成bean
經常見到的幾個jdk的元註解:
@Target(ElementType.TYPE) // 當前註解的使用範圍 @Retention(RetentionPolicy.RUNTIME) //生命週期 @Documented // 宣告在生成doc文件時是否帶著註解 @Inherited // 宣告是否子類會顯示父類的註解 總結:一個@SpringBootApplication註解就搞定了所有事,因為它覺得以上三個註解都是我們固定的配置,所以就給我們省略了。又封裝出一個註解來代替,這就是SpringBoot 的核心設計思想。
思考–我們為什麼要把SpringBoot工程的啟動類建立在base包下? SpringBoot工程執行時,掃描包來建立容器會掃描啟動類所在的包以及它下面的子包。
細節一分析
SpringApplication.run(SpringBootApplicationRunner.class,args); 備註: – run方法: 此方法是用於把啟動類的位元組碼傳入給SpringBoot的核心容器, 通過註解配置解析來建立IOC容器。 – 引數一:就是啟動類的位元組碼。 – 引數二:通常情況下就是main方法的args **拓展:args有內容嗎? 驗證:進行列印,會出現一個物件的地址
細節二分析
問題:我們關注控制檯,有一個SpringBoot的圖示。那這個圖示我們可以不讓其列印嗎? 解釋:可以。按照以下操作 SpringBootApplication sba = new SpringBootApplication(class); sba.setBannerMode(Mode.off); sba.run(args);
SpringBoot與SpringMVC的整合
入門案例:springboot 整合Spring 和 springMVC 步驟分析: ** 在com.itheima 包下新建一個web.controller包 ** 在web.controller下新建 HelloController ** 加入 @RestController 註解就ok 啦! ** 然後通過訪問 localhost:8080/…
@RestController
public class TestController {
@RequestMapping("/hello")
public String hello(){
return "success";
}
}
SpringBoot熱部署的使用-spring5x和spring-devtools-2.0.0
-
重啟傳統的springmvc專案,訪問一把!OK 修改:此時隨便在controller類中改改 再訪問!不OK 原因:我們改變原始碼了,但是沒有重新部署!!! 解決:重新部署一遍,又OK了!!!
-
分析: 問題: 總是重新部署勢必會花費大量的時間!這時候大膽暢想一下能不能修改原始碼後不重新部署也能生效呢? 注意:修改原始碼必須重新編譯,重啟是重新編譯的手段。這個思想是沒有問題的,但是我們此時要想的是能不能不重新部署也能完成重新編譯!!! 解決:利用SpringBoot的熱部署就可以實現。
-
如何實現SpringBoot的熱部署 – 匯入依賴 spring-boot-devtools.jar 2.0.0 導完座標儲存後我們的專案在開發工具中會有一個變化
springloaded-1.2.9.jar 注意:這個jar包我們直接匯入不了,需要手動改變一下版本號。匯入包以後還需要我們 在eclipse中配置 -javaagent:D:/RepMaven/RepMaven/org/springframework/springloaded/1.2.9/springloaded-1.2.9.jar -noverify 引數配置:是springloaded-1.2.9.jar 這個包在maven本地倉庫的位置。 此時熱部署就可以正常使用了…
SpringBoot整合springdatajpa
– 建立一個新的專案 在剛才整合完springmvc的基礎上進行整合 – 導依賴 mysql 驅動包 spring-boot-starter-data-jpa.jar – 寫配置 在專案的resources目錄下新建application.properties檔案 此檔案中配置一些 經常修改 的資訊,此處我們配置的是 資料庫連線資訊。
– 建立類 ** 建立實體類 並利用註解建立與資料庫的對應關係。 ** 建立Dao介面並且 extends JpaRepository和JpaSpecificationExecutor ** 建立service層 ** 建立Controller層,寫相應的查詢方法 引入jQueryeasyUI 外掛,將資料顯示到表格中 步驟分析: – 在resources目錄下新建一個static資料夾,必須 命名為static 這是springboot的規定,然後將easyUI的相關檔案放入,最後直接訪問 user.html 通過ajax 請求請求後臺資料。 application.properties
#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springdata
spring.datasource.username=root
spring.datasource.password=199505140110
#JPA Configuration:
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
SpringBoot整合MyBatis
步驟分析:
- 建專案(還用剛才的)
- 導依賴 在 pom.xml 中加入以下依賴
< dependency > < groupId>org.mybatis.spring.boot</ groupId> < artifactId>mybatis-spring-boot-starter</ artifactId> < version>1.1.1</ version> </ dependency>
- 寫配置(springboot的核心配置檔案,此時不用改!)
- 建立類 – 新建IUserMapper 介面 寫一個根據username模糊查 詢User集合的介面 和之前的方式一樣,只是多了兩個註解: @Mapper:宣告 Mapper 介面 @Select:宣告這個介面所需要使用的 sql,當然,有查 詢的註解,肯定就有增刪改的註解。
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import cn.itcast.info.pojo.User;
@Mapper
public interface UserMapper {
@Select("select * from user where name like
'%${value}%'")
public List<User> queryUserByName(String name);
}
– Service層新增一個介面和實現方法 – 進入controller 新增一個方法(此時需要傳入引數,我 們用一下REST 風格)
@RequestMapping(“findUserByName/{name}”)
public List<User> findUserByName(@PtahVarable(“name”)String name){
List<User> list = userService.findUserByName(name);
Return list;
}
總結: 通過以上操作我們發現一個問題,就是熱部署也不是萬能的,當我們修改了Dao層中註解裡面的SQL語句並不能自動部署。這個問題要注意,它屬於一個細節,但是往往細節也能決定你的身價!! 注意: mybatis的特性,只有實體類欄位與資料庫欄位相同時物件才可以封裝成功,如果不相同,記得sql語句起別名
SpringBoot整合Redis
- 準備工作 – Windows下開啟Redis服務 – 為了方便查檢視,開啟Redis的一個客戶端管理工具
- 整合步驟分析 – 建專案(此處還用原來的專案) – 導依賴 在 pom.xml 加入依賴 spring-boot-starter-redis – 寫配置(注意:SpringBoot的核心配置不用改,但 是此時由於是要快取資料庫,需要配置若干註解) – 開啟SpringBoot啟動類,加入 @EnableCaching 意思就是開啟快取的支援。 – 接著到service中在配置快取的具體適用規則。 ** @Cacheable(value=”…”) 注:在執行查詢的方法上加@Cacheable註解表示第一次查詢到資料庫取值然後在快取中存一份,當再次查詢的時候就先到快取中取值,知道執行快取清理操作快取資料才消失,其中重點分析註解中的兩個引數 value :指定存入redis中的key的值。 **@CacheEvict(value=”…”) 注:這個註解適用於清除快取,裡面的引數和存入註解時的一樣,只是多一個allEntries屬性表示是否徹底清除。
@Override
//@Cacheable(value="userList")
@CacheEvict(value="userList",allEntries=true)
public List<User> findAll() {
System.err.println("到資料庫查詢*****************************************");
return userDao.findAll();
}
SpringBoot整合Junit
- 步驟分析: – 建專案(此處還用以上的專案為例) – 導依賴 在 pom.xml 中加入測試依賴 spring-boot-starter-test – 寫配置(SpringBoot核心配置不用改) – 建立類 在工程的test目錄下新建一個測試類 測試類內容如下:
//替換執行器
@RunWith(SpringJUnit4ClassRunner.class)
//指定引導類的位元組碼
@SpringBootTest(classes=SpringBootApplicationRunner.class)
public class SpringBootJunitTest {
@Autowired
private IUserService userService;
@Test
public void testFindAll() {
List<User> users = userService.findAll();
for(User user : users) {
System.out.println(user);
}
}
}
總結:SpringBoot的Junit整合其實和spring對Junit的整合差不多,只是換了一個註解配置。
SpringBoot讀取配置檔案
SpringBoot讀取application.properties配置檔案
- properties檔案通常是做什麼的? 在我們程式中,一些我們經常要進行修改的屬性, 通常配在properties檔案中,這樣當修改的時候就可以修改properties檔案就可以了。但是有一個環節必不可少,那就是我們想用這些屬性的時候,必然要去讀取properties檔案。所以讀取properties檔案也是我們程式中必須的一部分。
- 在SpringBoot中如何讀取核心配置檔案application.properties 步驟分析: – 在測試類中注入一個Envrionment 物件。 private Envrionment environment; – 然後呼叫這個物件的getProperty() 方法就可以了。 environment.getProperty(key); 注意:此物件只用於讀取SpringBoot的核心配置檔案, 不是它核心配置檔案的內容讀不出來。
// 專門用來讀取SpringBoot的核心配置檔案
@Autowired
private Environment environment;
/**
* 讀取SpringBoot的核心配置檔案(application.properties)
*/
@Test
public void test(){
String url = environment.getProperty("spring.datasource.url");
System.err.println(url);
}
SpringBoot讀取自定義properties檔案
-
需求分析: – 自定義一個mail.properties 檔案 – 再建立一個MailProperty.java 物件 – mail.properties檔案中的值和MailProperty.java 物件的屬性對應。 – 然後最終直接操作MailProperty.java物件就相當於 操作mail.properties檔案,從而達到不直接讀取 mail.properties檔案就能對其進行操作的目的。
-
操作步驟: – 自定義一個mail.properties 檔案 – 再建立一個MailProperty.java 物件 – mail.properties檔案中的值和MailProperty.java 物件的屬性對應。 – 在MailProperty.java 物件上配置兩個註解 @ConfigurationProperties(prefix=”mail”) @PropertySource(value=”classpath:mail.properties”) 注意:@ConfigurationProperties prefix屬性的含義就是指定properties檔案中的屬性的字首。 @PropertySource 註解是指定對應的properties檔案的位置。 – 配置完了還不能用,此時我們需要一個springboot的一個依賴 spring-boot-configuration-processor
– 完成以上步驟後,發現還不行,此時我們還需要一個註解的配合才能完成。 == @Component 或者 @Configuration== 把以上註解配置到我們的MailProperty.java上就相當於把這個類當做一個可配置的類,才能夠最終將 MailProperty.java 注入到IOC 容器中。 總結:這樣做的好處就是當專案中有大量的properties檔案的時候我們可以不用頻繁的解析配置檔案,而是轉化成操作物件的方式,變得更簡單。
MailProperty.java:
@Component
@Configuration
@PropertySource("classpath:mail.properties")// 找目標檔案
@ConfigurationProperties("mail")
public class MailProperty {
private String host;
private String port;
private String username;
private String password;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
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 "MailProperty [host=" + host + ", port=" + port + ", username=" + username + ", password=" + password
+ "]";
}
測試類
@Autowired
private MailProperty mailProperty;
/**
* 自定義的配置檔案(xx.proerties)
* 需求: 傳送一份郵件,需要有傳送郵件的相關必備資訊
*/
@Test
public void test1(){
System.err.println(mailProperty.getHost());
}
mail.properties
mail.host=smtp.sina.com
mail.port=25
mail.username=itcast
mail.password=heima
SpringBoot讀取yml配置檔案
概述:yml檔案也是springboot為我們提供的一種核心配置檔案的格式,它除了能像application.properties檔案那樣寫配置,另外他也提供了一種新的資料結構就是 更加 一目瞭然 的樹形結構。 用法: 1.讀取普通資料 – 使用@Value 註解配合 Spring 的 EL 表示式 @Value("${mail.host}") private String mailHost;
2.讀取物件資料 – 和讀取自定義的properties一樣。
MailYml
@Component
@PropertySource("classpath:mail.yml")// 找目標檔案
@ConfigurationProperties("mail")
public class MailYml {
private String host;
private String port;
private String username;
private String password;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
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 "MailYml [host=" + host + ", port=" + port + ", username=" + username + ", password=" + password
+ ", getHost()=" + getHost() + ", getPort()=" + getPort() + ", getUsername()=" + getUsername()
+ ", getPassword()=" + getPassword() + ", getClass()=" + getClass() + ", hashCode()=" + hashCode()
+ ", toString()=" + super.toString() + "]";
}
}
測試類
@Autowired
private MailYml mailYml;
/**
* 讀取yml配置檔案(SpringBoot中的一種特製 xx.yml)
*/
@Value("${spring.jpa.database}")
private String aaa;
@Test
public void test2(){
System.err.println(aaa);
System.err.println(mailYml);
}
mail.yml
#普通資料
spring.jpa.database: mysql
#物件資料
mail:
host: smtp.sina.com
port: 25
username: itcast
password: heima