Java Springboot 重要知識點(diǎn)整理匯總
1、springboot controller 單例
Spring中 controller默認(rèn)是單例的,因?yàn)閱卫圆皇蔷€程安全的。
所以需要注意下面幾點(diǎn)
- 不要在Controller中定義成員變量,可能會造成數(shù)據(jù)混亂。
- 萬一必須要定義一個非靜態(tài)成員變量時候,則通過注解@Scope(“prototype”),將其設(shè)置為多例模式。
- 在Controller中使用ThreadLocal變量解決多線程問題
spring bean作用域:
singleton:單例模式,當(dāng)spring創(chuàng)建applicationContext容器的時候,spring會欲初始化所有的該作用域?qū)嵗由蟣azy-init就可以避免預(yù)處理;
prototype:原型模式,每次通過getBean獲取該bean就會新產(chǎn)生一個實(shí)例,創(chuàng)建后spring將不再對其管理;
2、Springboot 環(huán)境變量配置
在開發(fā)的過程中不是所有的配置文件都可以寫入yaml或者properties文件中,可能需要動態(tài)的從容器中讀取,看下如何配置
現(xiàn)在看看如果我們使用環(huán)境變量的方式來配置我們的參數(shù),如下:
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: ${DEMO_APP_JDBC_URL:jdbc:mysql://127.0.0.1/demo?serverTimezone=Asia/Shanghai} username: ${DEMO_APP_JDBC_USERNAME:demo} password: ${DEMO_APP_JDBC_PASSWORD:demo} hikari: maximum-pool-size: ${DEMO_APP_JDBC_POOL_MAX_SIZE:30} max-lifetime: ${DEMO_APP_JDBC_POOL_MAX_LIFE_TIME:60000} minimum-idle: ${DEMO_APP_JDBC_POOL_MIN_SIZE:5}
以上使用${ENV:defauleValue}的形式配置了我們應(yīng)用的相關(guān)參數(shù),如果我們的運(yùn)行環(huán)境配置了上面用到的環(huán)境變量,則使用環(huán)境變量中的配置,如果沒有配置則使用默認(rèn)的,比如我配置了環(huán)境變量DEMO_APP_JDBC_POOL_MAX_SIZE = 100,則應(yīng)用程序中的連接池最大連接數(shù)就變成100了。
配合docker 食用更香哦
3、restful 接口
現(xiàn)在的應(yīng)用基本上都是前后端分離的,所以后端接口基本上都是restful接口,怎么做吶?
在controller 的class 上增加注解 @RestController,就會生成restful接口
@RestController的作用 相當(dāng)于@Controller + @ResponseBody
@RestController @RequestMapping("/api/v1/h5Adapter") @Api(description = "server-h5-adapter") public class BaMessageConverterController {
4、@ResponseBody 和 @RequestBody 的區(qū)別
@ResponseBody是作用在方法上的,@ResponseBody 表示該方法的返回結(jié)果直接寫入 HTTP response body 中,一般在異步獲取數(shù)據(jù)時使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析為跳轉(zhuǎn)路徑,但是加上 @ResponseBody 后返回結(jié)果不會被解析為跳轉(zhuǎn)路徑,而是直接寫入 HTTP response body 中。 比如異步獲取 json 數(shù)據(jù),加上 @ResponseBody 后,會直接返回 json 數(shù)據(jù)。@RequestBody 將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個對象。
@RequestBody是作用在形參列表上,用于將前臺發(fā)送過來固定格式的數(shù)據(jù)【xml 格式或者 json等】封裝為對應(yīng)的 JavaBean 對象,封裝時使用到的一個對象是系統(tǒng)默認(rèn)配置的 HttpMessageConverter進(jìn)行解析,然后封裝到形參上。
5、@Schedule
定時任務(wù)幾乎是項(xiàng)目的標(biāo)配了, SpringBoot內(nèi)置了Sping Schedule定時框架,通過注解驅(qū)動方式添加所注解方法到定時任務(wù),根據(jù)配置定時信息定時執(zhí)行
主要是以下兩步:
1、開啟定時器
@SpringBootApplication @EnableEurekaClient @EnableHystrix @EnableCircuitBreaker @EnableCaching @EnableScheduling public class Application { ? public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ?
2、在方法上加上注解
//每天凌晨1點(diǎn)執(zhí)行 @Scheduled(cron = "0 0 1 * * ?") public void doTask() { }
6、async異步調(diào)用
異步調(diào)用主要處理一些不要求及時返回的任務(wù),springboot提供了支持
SpringBoot中使用 async實(shí)現(xiàn)異步調(diào)用
基于注解的使用方式包括如下三步:
- 啟動類加上@EnableAsync(也可以在配置類中加上)
- 配置類中完成異步線程池的導(dǎo)入(這一個可以不要,采用默認(rèn)的)
- 需要異步調(diào)用的方法加上@Async
定義線程池
package com.aispeech.bj.bams.msproduct.config; ? import org.springframework.context.annotation.AdviceMode; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; ? import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; ? @Configuration @EnableAsync(mode = AdviceMode.ASPECTJ) public class ExecutorConfig { ? /** Set the ThreadPoolExecutor's core pool size. */ private int corePoolSize = 10; /** Set the ThreadPoolExecutor's maximum pool size. */ private int maxPoolSize = 300; /** Set the capacity for the ThreadPoolExecutor's BlockingQueue. */ private int queueCapacity = 10; ? @Bean public Executor myAsync() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize); executor.setMaxPoolSize(maxPoolSize); executor.setQueueCapacity(queueCapacity); executor.setThreadNamePrefix("MyExecutor-"); // rejection-policy:當(dāng)pool已經(jīng)達(dá)到max size的時候,如何處理新任務(wù) // CALLER_RUNS:不在新線程中執(zhí)行任務(wù),而是有調(diào)用者所在的線程來執(zhí)行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } ? } ?
使用異步 @Async 注解
@Async("myAsync") void notifyProductInfo(String thirdPartyId, ThirdPartyProductVO thirdPartyProductVO) {}
7、request 的獲取方式和線程安全
request 是來自前端的請求,怎么才能安全的獲取request,線程安全的request 才能取出正確的數(shù)據(jù),主要有下面幾種方式
1、靜態(tài)類獲取
HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
2、函數(shù)參數(shù)
Controller中獲取request對象后,如果要在其他方法中(如service方法、工具類方法等)使用request對象,需要在調(diào)用這些方法時將request對象作為參數(shù)傳入
此時request對象是方法參數(shù),相當(dāng)于局部變量,毫無疑問是線程安全的。
@RequestMapping("/test") public void test(HttpServletRequest request) { ...... }
3、自動注入
@Autowired private HttpServletRequest request; //自動注入request
對象是線程局部變量(ThreadLocal),因此request對象也是線程局部變量;這就保證了request對象的線程安全性。
不會有線程安全問題的 實(shí)際上spring 注入的是一個代理類
到此這篇關(guān)于Java Springboot 重要知識點(diǎn)整理匯總的文章就介紹到這了,更多相關(guān)Java Springboot 知識點(diǎn)匯總內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)上傳網(wǎng)絡(luò)圖片到微信臨時素材
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)上傳網(wǎng)絡(luò)圖片到微信臨時素材,網(wǎng)絡(luò)圖片上傳到微信服務(wù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07SpringBoot項(xiàng)目打成War布署在Tomcat的詳細(xì)步驟
這篇文章主要介紹了SpringBoot項(xiàng)目打成War布署在Tomcat,本文分步驟結(jié)合圖文實(shí)例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03Mybatis-Plus中updateById方法不能更新空值問題解決
本文主要介紹了Mybatis-Plus中updateById方法不能更新空值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Java?CompletableFuture實(shí)現(xiàn)原理分析詳解
CompletableFuture是Java8并發(fā)新特性,本文我們主要來聊一聊CompletableFuture的回調(diào)功能以及異步工作原理是如何實(shí)現(xiàn)的,需要的可以了解一下2022-09-09Springboot中的異步任務(wù)執(zhí)行及監(jiān)控詳解
這篇文章主要介紹了Springboot中的異步任務(wù)執(zhí)行及監(jiān)控詳解,除了自己實(shí)現(xiàn)線程外,springboot本身就提供了通過注解的方式,進(jìn)行異步任務(wù)的執(zhí)行,下面主要記錄一下,在Springboot項(xiàng)目中實(shí)現(xiàn)異步任務(wù),以及對異步任務(wù)進(jìn)行封裝監(jiān)控,需要的朋友可以參考下2023-10-10