1. 程式人生 > >SpringBoot2.0學習 (一)

SpringBoot2.0學習 (一)

SpringBoot簡介

SpringBoot是什麼?

SpringBoot是由Pivotal團隊提供的全新框架 ,它使用特定的方式進行配置(大多數為自動配置),省去了Spring繁瑣的xml配置,內建了http伺服器,可以通過java程式啟動web容器,也整合了常用的框架。總之,SpringBoot幫助程式設計師進行快速開發和構建專案。

SpringBoot和SpringMvc

在使用SpringBoot構建web專案時,我們需要引入spring-starter-web模組,實際上這個模組會幫我們引入SpringMvc,由此可見,SpringBoot並不是一個全新的web框架,它只是幫助我們將一些框架整合起來,在構建web專案時,底層還是使用的SpringMvc。

SpringBoot和SpringCloud

SpringCloud是一套微服務框架,它基於SpringBoot開發,簡化了分散式系統的基礎設施的開發,比如配置中心、負載均衡、路由、服務治理等,簡單的說SpringCloud依賴SpringBoot

SpringBoot中幾個常用的註解

@Configuration   

作用在類上,底層使用的@Component註解,和xml中的<bean>標籤功能類似,Spring容器啟動時會載入這個類,可以用作配置。

@EnabledAutoConfiguration

作用在類上,會自動載入jar包裡的META-INF/spring-autoconfigure-metadata.properties配置的類(自動配置)

@ComponentScan

開啟註解掃描,如果不指定範圍,預設掃描當前類所在包範圍

@SpringBootApplication

相當於@Configuration、@EnabledAutoConfiguration、@ComponentScan三個註解,通常為專案的入口

SpringBoot中的配置檔案

SpringBoot可以使用.yml(或者.yaml)和.properties作為配置檔案,我們一般使用.yml,因為它結構清晰,更方便閱讀

** Springboot提供了兩種配置檔案的格式:application.properties和application.yml,
   因為.yml檔案編寫和結構更加清晰,所以我們應該儘量使用application.yml作為配置檔案

1.配置server(埠、專案訪問路徑等資訊)
	server:
	  port: 8081
	  context-path: /girl
  
2.配置spring整合外部框架和應用的資訊,如datasource、redis、thymeleaf等
	spring:
	  datasource:
		driver-class-name: com.mysql.jdbc.Driver
		url: jdbc:mysql://127.0.0.1:3306/girl
		username: root
		password: 444668
	
3.配置自定義資訊:
	(1) 普通訊息:在程式中如果需要引用這些引數,使用@Value("${引數名}")註解
		name: eragon
		age: 23
	(2) 封裝成物件: 在程式中如果需要引用到這個物件,那麼需要寫一個POJO類,並使用@ConfigurationProperties(prefix="該物件的名稱")和@Component註解,通過@Autowire引用
		gril:
			name: eragon
			age:23
	(3) 引用配置檔案中的引數
		name: eragon
		age: 23
		content: ${name},${age}
		
4. 配置profiles:在開發中,我們由於開發環境和生產環境的不同,經常要進行配置檔案的切換,比如資料庫等資訊的配置,會非常的麻煩。通過配置profiles可以實現非常方便的環境
				 切換。spriingboot中預設採用application-{profileName}.yml來適用於不同環境的配置檔案。通過在application.yml主配置檔案中使用如下配置:
	
	profiles:
		active: dev   // 這裡的dev指向的是application-dev.yml
	
5. 配置隨機值:通過${random}可以生成不同型別的隨機值:
	age: ${random.int}
	name: ${random.value}

6. 配置日誌:
	debug: ture   // debug級別的日誌也會被列印到控制檯
	logging:
	path: c:/upload/   // 指定日誌輸出目錄,會自動生成spring.log檔案記錄日誌
	file: c:/upload/my.log  // 自定義日誌輸出路徑,需要注意的是path和file如果同時使用,只有file會生效
	level:
		com.eragon: warn  // 表時com.eragon包下的所有類以warn級別輸出日誌
	另外還可以引入外部配置檔案,比如使用logback時,以下規則的配置檔案都會被載入:logback-spring.xml、logback-spring.groovy、logback.xml、logback.groovy
	也可以自定義外部配置檔案:
	config: classpath:myLogback.xml

SpringBoot中的靜態資源訪問

classpath:/META-INF/resources            classpath:/resources            classpath:/static            classpath:/public   上面4個目錄都是SpringBoot的靜態資源對映路徑,優先順序順序為:META-INF/resources > resources > static > public   對應在application.yml中的預設配置為:   spring:     mvc:         static-path-pattern: ##預設值為 /**     resources:         static-locations:    ##預設值為classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/   這兩個配置相當於nginx的配置,可以通過修改上面兩個屬性來配置自定義的靜態資源路徑對映。

SpringBoot整合Freemarker模板

在pom中新增Freemarker的依賴後就可以在專案中使用Freemarker了

          

SpringBoot全域性捕獲異常

在專案中我們的程式中肯定會出現異常,直接將異常返回給前臺展示對使用者非常的不友好,所以我們需要異常進行捕獲,用JSON或者其他格式返回給頁面。SpringBoot可以通過@ControllerAdvice註解來配置一個全域性異常處理類,它可以且只能處理Controller中丟擲的異常,不能處理其他如service層丟擲的異常。

    

SpringBoot中使用Lombok簡化程式碼

在專案中我們經常要在JavaBean類中寫getter、setter、toString等方法,每新增一個屬性都需要改寫,非常不方便。Lombok通過改變位元組碼檔案(使用javac技術),讓我們只用幾個註解就可以簡單方便的建立JavaBean。在IDEA中需要先下載Lombok外掛。

           

           

可以使用@Getter、@Setter等註解自動擁有getter方法和setter方法,也可以直接使用@Data等於@Getter、@Setter、@ToString等。另外我們可以在@Slf4j註解,用來簡化日誌的輸出。

           

SpringBoot中非同步執行方法

如果要在controller中使用非同步方法,一般會使用java多執行緒技術,new一個Thread去執行,在SpringBoot中我們可以使用@Async註解達到同樣的效果。

 @Async
    public String sendEmail() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "success";
    }

另外還需要在controller類中使用@EnableAsync開啟非同步方法掃描

@EnableAsync
@RestController
public class AsyncController {
    @Autowired
    private IEmailService emailService;
    @RequestMapping("test/async")
    public String testAsync(){
        // 這個方法將會被非同步執行
        emailService.sendEmail();
        return "";
    }
}