詳細SpringBoot框架教程——SpringBoot開發(fā)實踐

本篇文章主要內(nèi)容
SpringBoot開發(fā)最佳實踐
SpringBoot敏感配置信息加密
SpringBoot數(shù)據(jù)庫連接池
SpringBoot跨域資源共享CORS
SpringBoot靜態(tài)資源處理
SpringBoot核心配置文件
(Duration/DataSize單位類型、隨機值、占位符、多環(huán)境、4種配置文件讀取方式)
SpringBoot線程池異步調(diào)用(@Async、手動編碼)
SpringBoot開發(fā)最佳實踐
1、SpringBoot 程序,每個類應該有一個包,沒有包的話會出現(xiàn)問題;
2、一個合理的包結(jié)構(gòu):

3、我們通常建議您將主應用程序類放在其他類之上的根包中,主類上需要有一個@SpringBootApplication注解,默認是掃描當前包及子類下的標有@Component,?@Service,?@Repository,?@Controller等注解的bean;
4、如果main類上不使用@SpringBootApplication注解,可以使用@EnableAutoConfiguration、@ComponentScan、@Configuration 注解代替;
5、main方法的類也是一個配置類,也是ioc容器中的一個bean,Springboot不推薦使用xml配置方式;
6、還可以通過@Import導入其他bean對象(組件),或者通過@Configuration加入bean組件,或者@Configuration+@Bean,或者@Configuration+@ComponentScan加入bean對象(組件);
7、也可以通過@ImportResource(locations = "classpath:applicationContext.xml")加入xml配置的bean對象(組件);
8、禁止某些自動配置:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
或者在配置文件中 spring.autoconfigure.exclude=?進行排除,可以達到優(yōu)化程序的效果;
9、springboot內(nèi)嵌了web服務器,所以打成一個jar包即可運行,方便我們的開發(fā)和調(diào)試;
10、延遲初始化bean:spring.main.lazy-initialization=true

如果要禁用某些bean的延遲初始化,則可以使用@Lazy(value=false)注解將它們的延遲屬性顯式設(shè)置為false;
SpringApplication啟用延遲初始化后,將根據(jù)需要創(chuàng)建bean,而不是在應用程序啟動期間創(chuàng)建bean,因此啟用延遲初始化可以減少啟動應用程序所需的時間。在Web應用程序中,啟用延遲初始化將導致許多與Web相關(guān)的Bean直到收到HTTP請求后才被初始化。延遲初始化的缺點是,它可能會延遲發(fā)現(xiàn)應用程序的問題。如果錯誤地配置了Bean的延遲初始化,則可能導致啟動時沒有問題,在訪問調(diào)用的時候出現(xiàn)問題,另外還必須注意確保JVM有足夠的內(nèi)存來容納所有應用程序的bean,而不僅僅是啟動過程中初始化的bean,由于這些原因,默認情況下SpringBoot不會開啟延遲初始化;
11、CommandLineRunner, ApplicationRunner在springboot啟動后回調(diào)著兩個接口里面的run方法;
SpringBoot敏感配置信息加密
配置信息加密主要利用了http://www.jasypt.org/?這個類庫,Jasypt是一個Java庫,允許開發(fā)人員以最小的努力將基本的加解密功能添加到你的項目中,而無需對密碼加解密的工作原理有深入的了解;
Github:https://github.com/jasypt/jasypt?這個庫是java語言寫的;
不過直接使用上面這個類庫進行開發(fā)稍微有些麻煩,所以在SpringBoot中有人對Jasypt制作了一個starter依賴,方便開發(fā),maven依賴如下:

加解密代碼

SpringBoot中的數(shù)據(jù)源
SpringBoot默認采用的是HikariCP數(shù)據(jù)庫連接池,該數(shù)據(jù)庫連接池性能極好;
若要更換為阿里巴巴Druid數(shù)據(jù)庫連接池,首先把HikariCP的依賴排除掉:

然后添加druid依賴

然后需要在配置文件中指定:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
另外一種更簡潔的方式是通過starter更換為Druid數(shù)據(jù)庫連接池,直接加一個依賴即可:

除此之外還有其他一些數(shù)據(jù)庫連接池:
DBCP
DBCP2
Tomcat JDBC
C3P0
等等
SpringBoot跨域資源共享CORS支持
Spring 4.2.x版本開始支持CORS
我們知道,傳統(tǒng)的Ajax請求只能獲取在同一個域名下的資源,但是HTML5規(guī)范中打破了這種限制,允許Ajax發(fā)起跨域的請求;
瀏覽器本身是可以發(fā)起跨域請求的,比如你可以鏈接一個外域的圖片或者腳本,但是javascript腳本是不能獲取這些外域資源內(nèi)容的;
CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing),它允許瀏覽器向跨源服務器發(fā)出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制;
這種CORS使用了一個額外的HTTP響應頭來賦予當前user-agent(瀏覽器)獲得非同源資源的權(quán)限,這里的非同源就是Cross-Origin的概念,這里的權(quán)限就是訪問非同源的資源權(quán)限;
CORS是現(xiàn)在HTML5標準中的一部分,在大部分現(xiàn)代瀏覽器中都有所支持,可能在某些老版本的瀏覽器不支持CORS,如果要兼容一些老的瀏覽器版本,則需要采用JSONP進行跨域請求;
同源與非同源的定義
如果訪問協(xié)議、端口(如果指定了端口)、host都相同,則稱之為同源,否則為非同源;
比如源鏈接:?http://store.company.com/dir/page.html

SpringBoot解決跨域問題,只需要配置如下代碼即可:

JSONP 是 JSON with padding(填充式 JSON 或參數(shù)式 JSON)的簡寫;
JSONP實現(xiàn)跨域請求的原理簡單來說,就是動態(tài)創(chuàng)建<script>標簽,然后利用<script>的src 不受同源策略約束來跨域獲取數(shù)據(jù);
JSONP 由兩部分組成:回調(diào)函數(shù)和數(shù)據(jù),回調(diào)函數(shù)是當響應到來時應該在頁面中調(diào)用的函數(shù),回調(diào)函數(shù)的名字一般是在請求中指定的,而數(shù)據(jù)就是傳入回調(diào)函數(shù)中的 JSON 數(shù)據(jù),例如;

CORS與JSONP比較
CORS與JSONP都是為了跨域,但是CORS比JSONP更強大;
JSONP只支持GET請求,CORS支持所有類型的HTTP請求;
JSONP的優(yōu)勢在于支持老式瀏覽器;
SpringBoot靜態(tài)資源處理
靜態(tài)資源:js, css, html, 圖片,音視頻等;
靜態(tài)資源路徑:是指系統(tǒng)可以直接訪問的路徑,且路徑下的所有文件均可被用戶直接訪問;
Spring Boot默認靜態(tài)資源目錄位置位于classpath下,目錄名需符合如下規(guī)則:
有4個目錄下的靜態(tài)資源可以直接訪問:
/static
/public
/resources
/META-INF/resources
?在SpringBoot的源碼中有定義:

可以通過spring.resources.static-locations=classpath:/mysource/進行修改;
SpringBoot核心配置文件
1、.properties文件
鍵值對的properties屬性文件配置方式
SpringBoot默認讀取該文件作為項目配置文件
2、.yml文件
yml 也是一種配置文件格式,主要采用空格、換行、冒號等格式排版進行配置;
yml 后綴也可以使用 yaml 后綴;
配置的值與前面的冒號必須要有一個空格;
只要在類路徑上具有SnakeYAML的jar包,SpringApplication類就會自動支持YAML作為配置文件,默認的spring-boot-starter自動依賴了SnakeYAML;
具體使用可以參考一下視頻演示;
3、多環(huán)境配置文件
#比如配置測試環(huán)境
spring.profiles.active=dev
application-dev.properties
#比如配置生產(chǎn)環(huán)境
spring.profiles.active=product
application-product.properties
配置隨機值,通過配置文件得到一個隨機值,springboot提供RandomValuePropertySource可用于注入隨機值(例如,注入一些隨機值或測試用例),它可以產(chǎn)生整數(shù),longs,uuid或字符串,如下示例所示:
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
4、配置文件中可以使用占位符:
my.name = cat
my.desc = ${my.name} is a teacher.
5、Duration單位轉(zhuǎn)換:
30秒超時:
30,PT30S、30s都是等效的;
500ms超時:
500,PT0.5S和500ms都是等效的;
也可以使用任何受支持的單位,包括:
ns納秒
us 微秒
ms 毫秒(毫秒)
s秒
m分鐘
H 小時
d天
w周
m月
y年
比如:
server.servlet.session.timeout=1800s
server.servlet.session.timeout=30m
server.servlet.session.timeout=PT30m
6、DataSize?類型單位轉(zhuǎn)換
若要指定10 MB的緩沖區(qū)大小,則10和10MB是等效的;
256個字節(jié)的大小閾值可以指定為256或256B;
B?for bytes
KB?for kilobytes
MB?for megabytes
GB?for gigabytes
TB?for terabytes
比如:
server.tomcat.max-swallow-size=2048KB
application.properties/yml文件讀取
1、通過@Value注解讀??;(配置項比較少的時候)
2、通過映射類讀?。唬ㄅ渲庙椖勘容^多的時候)
新建一個配置映射類,只需要說明配置的前綴
@ConfigurationProperties(prefix = "myconfig.user")//前綴
public class User {
private String name;//自動匹配name
private int sex;//自動匹配sex
private int age;//自動匹配age
}
3、通過Environment對象讀?。唬╯pring ioc直接就給我們創(chuàng)建了該環(huán)境對象)
從環(huán)境對象中讀取配置;
@Autowired
Environment env;
?
@GetMapping("/user")
Public String user() {
????????StringBuilder sb = new StringBuilder();
????????sb.append("從Environment中獲取配置:\n");
????????sb.append(env.getProperty("myconfig.user.name"));//注意這里不加${}
????????return sb.toString();
}
4、通過嵌套靜態(tài)內(nèi)部類讀取(參考server.前綴的方式)
SpringBoot線程池異步調(diào)用
SpringBoot框架自動裝配提供了一個的線程池,用于提交異步任務;
有了線程池我們就只需要寫任務即可,提交任務采用@Async注解;(底層是aop)
Springboot自動裝配提供的線程池還可以根據(jù)需要進行配置:
#SpringBoot配置線程池,修改線程池默認配置
spring.task.execution.pool.max-size=99999
spring.task.execution.thread-name-prefix=cat-task-
spring.task.execution.pool.queue-capacity=99999
我們也可以覆蓋SpringBoot自動配置的線程池,用我們自定義的線程池:
如果想更深入的學習springboot,奉上springboot全套視頻教程,視頻學習效果更佳,走過路過別忘素質(zhì)三連哦~~

