日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot笔记

發布時間:2023/12/9 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 1?? 簡介
        • 一. 什么是 IoC 容器?
        • 二. AOP面向切面編程
        • 三. SSM整合
        • 四. HttpServletRequest
        • 五. HttpServletResponse
        • 六. Cookie 與 Session
        • 七. Cookie
        • 八. Session
        • 九. 轉發與重定向
        • 十. Spring項目轉SpringBoot
        • 十一. Spring生命周期
        • 十二. 什么是 pom
        • 十三. 為什么會返回JSON格式數據
        • 十四. 跨域請求 CORS
      • 2?? Spring基礎知識
        • 一. 注解開發說明
        • 二. 配置 Bean
        • 三. 配置第三方 Bean
        • 四. 單例與多實例
        • 五. @Autowired說明
        • 六. Bean的生命周期
        • 七. 條件裝配:Bean加載控制
        • 八. 為Bean內的變量賦值
        • 九. Spring事務管理
        • 十. JdbcTemplate解釋
        • 十一. P命名空間
        • 十二. 關閉ApplicationContext
        • 十三. 完全注解開發
        • 十四. 獲取 Bean
        • 十五. 導入其他配置項
        • 十六. Bean的分類
      • 3?? Spring MVC基礎知識
        • 一. MVC簡介
        • 二. 衍生的 Bean注解
        • 三. 路徑疊加
        • 四. RESTful風格
        • 五. @RequestMapping詳解
        • 六. 路徑 ant風格
        • 七. 非 RESTful風格說明
        • 八. 域共享對象
        • 九. ModelAndView
        • 十. 請求響應擴展
        • 十一. MVC工作流程
        • 十二. 文件下載
        • 十三. 文件上傳
        • 十四. 攔截、過濾、分發器總結
        • 十五. @RequestParam、@PathVariable區別
        • 十六. 視圖解析器
        • 十七. SpringMVC執行流程
        • 十八. Thymeleaf說明
      • 4?? SpringBoot小知識點
      • 5?? SpringBoot基礎知識
        • 一. 初始項目結構
        • 二. delete、put請求說明
        • 三. jar包與 war包的區別
        • 四. start 與 parent的區別
        • 五. @SpringBootApplication說明
        • 六. #{ }與 ${ }說明
        • 七. @ControllerAdvice說明
        • 八. 臨時配置說明
        • 九. yml格式說明
        • 十. 松散綁定說明
      • 6?? SpringBoot常用操作
        • 一. 頁面跳轉
        • 二. 注解方式獲取請求頭
        • 三. 注解方式獲取Cookie
        • 四. 編碼格式修改
        • 五. 發送郵件
        • 六. Scheduled定時任務
        • 七. Cron格式編寫指南
        • 八. SpringBootAdmin監控
        • 九. 消息中間件
        • 十. 自定義錯誤頁
        • 十一. Slf4j日志使用
        • 十二. 靜態資源訪問
        • 十三. 路徑映射
        • 十四. 服務器日志
        • 十五. 多環境開發 Profile
        • 十六. 優先執行的代碼
        • 十七. 異常處理器
        • 十八. 配置日志等級
        • 十九. 兼容xml配置文件
        • 二十. 讀取標準 yml配置
        • 二十一. 讀取第三方 yml配置
        • 二十二. 攔截器
        • 二十三. 頁面跳轉
      • 7?? SpringBoot常用技巧
        • 一. 獲取UUID的正確姿勢
        • 二. 全路徑名
        • 三. 頁面重定向
        • 四. 表格的畫法
        • 五. yml中相互引用
        • 六. 隨時獲取 ApplicationContext
        • 七. 網站圖標 favicon
        • 八. 跳過測試模塊
        • 九. 排除自動配置
        • 十. 查看 pom組件版本
        • 十一. 正確的項目創建流程
        • 十二. 離線創建SpringBoot程序
        • 十三. 快速制作程序模板
        • 十四. Tomcat替換成Jetty
        • 十五. 修改Banner
        • 十六. 測試中開啟服務器配置
        • 十七. 測試中開啟事務
        • 十八. 測試中的臨時屬性
        • 十九. @JsonIgnore
        • 二十. 項目打包構建
        • 二十一. IDEA隱藏文件
        • 二十二. jdk8單位類
      • 8?? SpringBoot不常用操作
        • 1. 修改配置文件名
        • 2. maven控制yml環境
        • 3. JDBC使用
        • 4. 熱部署
        • 5. 開啟 Bean校驗
        • 6. 代碼中編寫測試
        • 7. 測試用例中設置隨機數據
      • 9?? 整合第三方
        • 一. 整合Mybatis
        • 二. 整合MybatisPlus
        • 三. 整合Druid
      • 🔟 Spring Security
        • 一. 簡介
        • 二. 使用步驟
        • 三. 自定義登錄頁面與返回值
        • 四. 注銷登錄
        • 五. 加鹽 Salt
        • 六. 使用注解進行配置
        • 七. 持久層存儲:數據庫
        • 八. 令牌技術:token
        • 九. WebSocket
        • 十. Swagger2


1?? 簡介

一. 什么是 IoC 容器?

  • 簡介

    Inversion of Control 控制反轉,

    又稱為依賴注入 DI ——Dependency Injection。

  • 解決痛點

    大型程序之間的高耦合性與冗余性,共享組件、統一銷毀。

  • 底層原理

    XML解析、工廠模式、反射。

    IOC容器底層就是對象工廠

  • 意義

    ? 傳統的應用程序中,控制權在程序本身,程序的控制流程完全由開發者控制。在IoC模式下,控制權發生了反轉,即從應用程序轉移到了IoC容器,所有組件不再由應用程序自己創建和配置,而是由IoC容器負責,這樣,應用程序只需要直接使用已經創建好并且配置好的組件。為了能讓組件在IoC容器中被“裝配”出來,需要某種“注入”機制,其將組件的創建+配置與組件的使用相分離,并且,由IoC容器負責管理組件的生命周期。

    總結:Ioc意味著將你設計好的對象交給容器控制,而不是按照傳統在對象內部直接控制

  • 小點:

    • 在 Spring IoC程序中,我們把所有的組件統稱為 Java Bean。
    • Spring容器是通過讀取XML文件后使用反射完成的,其實所有的配置文件差不多都是這樣,Java的反射機制。
    • Spring容器就是 ApplicationContext,它是一個接口,有很多實現類,這里我們選擇 ClassPathXmlApplicationContext,表示它會自動從classpath中查找指定的XML配置文件。
    • Spring還提供了另外一種IoC容器:懶加載對象 BeanFactory。使用方法和 ApplicationContext一樣,但是懶加載主要是第一次獲取時才會加載指定的 Bean對象,而 ApplicationContext則會在創建時一次性加載所有的 Bean對象。
    // 從 ApplicationContext里面獲取 Bean UserMapper mapper=context.gerBean(UserMapper.class);
  • 二. AOP面向切面編程

  • 簡介:

    ? SpringBoot支持面向切面編程,其可以在不改動原代碼的動態添加代碼、動態刪去代碼。這在日志記錄、安全檢查和事務等方面很有用。AOP技術本質上就是一個動態代理,讓我們可以把一些常用功能如權限檢查、日志、事務從業務方法中剝離出來。

  • 題外話:

    ? Spring的 AOP實現基于 JVM的動態代理,所以我們有時候也會這樣子形容——AOP代理、AOP代理對象,意即AOP代理了本來的類對象。

  • 在 Java平臺上對于AOP的織入,一共有三種方式:

    • 編譯器:由編譯器把切面編譯進字節碼,使用aspect關鍵字。
    • 類加載器:利用一個特殊的類加載器,在目標類被裝載到JVM時,對目標類的字節碼文件進行重新加強。
    • 運行期:目標對象和切面都是普通的Java類,通過JVM的動態代理對象功能或者第三方庫實現運行期間動態織入。(最簡單的方式)
  • 原理解釋:

    ? Spring對接口類型使用JDK動態代理,對普通類使用CGLIB創建子類,在之后使用的也是它的子類,但對于用戶來說是無感的。如果一個Bean的class是final,Spring將無法為其創建子類。

    // 原類為 UserTest,打印出來可以看到被 Spring enhance // 并非原類,為其子類。 class com.thinkstu.test.UserTest$$EnhancerBySpringCGLIB$$217a2220
  • AOP:Aspect-Orinented Programing 面向切面編程。

  • OOP:Object-Oriented Programming面向對象編程,封裝、繼承、多態。

  • 常用術語:

  • AOP的使用:

    • 導包
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>
    • 切入:新定義類,并 @Aspect總開關注解,切入點注解。

      • @Around:環繞通知是所有通知里功能最為強大的注解,可以實現前直通知、后直通知、異常通知以及返回通知的功能。

      • @Pointcut解釋:

        @Pointcut("execution(* com.thinkstu.controller.*.*(..))")

    @Aspect //表示AOP @Component public class UsersAspect {@Pointcut("execution(* com.thinkstu.controller.*.*(..))")public void cut() {}@Before(value = "cut()")public void before(JoinPoint joinPoint) { // 返回方法名String name = joinPoint.getSignature().getName();System.out.println("before開始執行----" + name);}@After(value = "cut()")public void after(JoinPoint joinPoint) {System.out.println("after開始執行----");}@AfterReturning(value = "cut()", returning = "result")public void getResult(JoinPoint joinPoint, Object result) { // 方法返回值System.out.println("after開始執行----" + result);}@AfterThrowing(value = "cut()", throwing = "ex")public void afterThrowing(Exception ex) {System.out.println("發生異常------afterThrowing" + ex);}@Around(value = "cut()")public void around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("around優先執行的語句----------");pjp.proceed();System.out.println("around中方法已執行----------");} }
  • 三. SSM整合

    ? SSM整合指 Spring、SpringMVC、Mybatis的整合。

    四. HttpServletRequest

  • 說明

    ? 原生接口。當客戶端通過HTTP協議訪問服務器時,HTTP請求頭中的所有信息都封裝在這個對象中。

    通過 HttpServletRequest我們可以獲得很多信息。

  • 部分功能

    • headers:必須獲得全部的 key,而后才能遍歷出所有的 value。

    • getRemoteAddr:返回發出請求的客戶機的IP地址。

    • getParameter(“username”):獲取請求參數

  • 提示:

    獲取全部請求信息應該使用 RequestEntity,而不是HttpServletRequest。

    單純簡單獲取請求體應該使用 @RequestHeader注解,而不是HttpServletRequest。

    主要感覺 HttpServletRequest有點難用。

  • 五. HttpServletResponse

    ? 原生方式控制返回,但是一般不這樣。

  • 兩種響應方式
  • 六. Cookie 與 Session

  • Cookie與 Session的區別:Session比Cookie安全

    Cookie是客戶端技術,存儲在客戶端。Session是服務器端技術,存儲在服務端。

  • 使用原因

    ? HTTP 是無狀態協議,它不能以狀態來區分和管理請求和響應,也就是說服務器單從網絡連接上無從知道客戶身份。于是我們可以給客戶端頒發通行證,如此服務端便能識別客戶的身份,這就是 Cookie的工作原理。

  • 七. Cookie

  • 概念
  • ? Cookie是服務器存儲在本地機器上的一小段文本。是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,并隨著每次請求發送到服務器。

    ? Cookie會根據響應報文里的一個叫做Set-Cookie的首部字段信息,通知客戶端保存Cookie。當下次客戶端再向服務端發起請求時,客戶端會自動在請求報文中加入Cookie值之后發送出去。然后服務器端會根據記錄,得到之前的最后狀態信息。

  • set-cookie字段解釋
    • logcookie = 3qjj:設置 Cookie的 key、value值。
    • Expires:設置 cookie有效期,當省略 expires屬性時,Cookie在本次瀏覽器窗口關閉后失效。如果設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie依然有效直到超過設定的過期時間。
    • Max-age:如果你創建了一個cookie,并將他發送到瀏覽器,默認情況下它是一個會話級別的cookie:存儲在瀏覽器的內存中,用戶退出瀏覽器之后被刪除。如果 你希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,并給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該 cookie。
    • path:限制指定Cookie 的發送范圍的文件目錄,不過另有辦法可避開這項限制。
    • domain:domain屬性指定一級域名。比如,指定 domain是 thinkstu.com,那么只有從一級域名是 thinkstu.com網址發送過來的請求才有效。
    • secure:設置只有在HTTPS安全連接時,才可以發送Cookie。
    • HttpOnly:使 JavaScript 腳本無法獲得 Cookie。通過上述設置,通常從 Web 頁面內還可以對Cookie 進行讀取操作,但使用 JavaScript 的 document.cookie無法讀取附加 HttpOnly 屬性后的Cookie 的內容。
  • Max-age與 Expires的區別

    Expires和max-age都可以用來指定文檔的過期時間,但是二者有一些細微差別。

    Expires表示絕對時間,HTTP 1.0開始使用。Max-age表示相對時間,HTTP 1.1開始使用。

  • 限制情況

    單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能超過3K。

  • 八. Session

  • 思想

    ? 當用戶第一次訪問網站時,網站會為用戶生成唯一的 Session ID值,而后 Session會自動跟隨響應報文 set-Cookie返回給客戶端,所以可以說 Session的設置在一定程度上依賴于 Cookie。可以把Session ID 想象成一種用以區分不同用戶的唯一Id。

  • 強依賴 Cookie與弱依賴

    ? 當我們完全禁掉瀏覽器的cookie的時候,服務端的session可能不能正常使用。這取決于當前環境中 Session對 Cookie的依賴程度,通過規避寫法可以避免強依賴。比如當禁用 Cookie時,PHP會自動把Session ID附著在URL中,繼續正常使用。

  • 九. 轉發與重定向

  • 轉發:forward,客戶端只發送了一次請求,該請求沿著“轉發鏈”執行,所以可以通過request來共享數據。
  • 重定向:redirect,客戶端發送了兩次請求,相當于客戶端自己重新發送了一次請求,這是兩次不一樣的請求,不能通過request共享數據。
  • 十. Spring項目轉SpringBoot

  • 思想:SpringBoot是為了簡化 Spring項目而生的,其兩者在很大程度上兼容。
  • 大致步驟
    • 直接拷貝業務代碼、pom包(這里刪去Spring的依賴)
    • 按 XML編寫配置類 或者直接導入配置類:@Import、@ImportSource
  • 十一. Spring生命周期

    這是一個大工程。

    ? 在 Spring中,由于其生命周期過于復雜,所以 Spring沒有按慣例為所有階段單獨定義方法。

    ? 其使用事件監聽器,我們只需要監聽被干預的階段即可(繼承接口實現)。

    ? 優點表現:統一了管理事件流程,并用泛型區分階段。

  • 簡單實現
  • 生命周期示意圖

    CSDN鏈接

  • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3QSKrg0v-1651739102961)(https://tva1.sinaimg.cn/large/e6c9d24egy1h1m6y2cq40j20u00ufq76.jpg)]

    十二. 什么是 pom

  • POM:Project Object Model,項目對象模型
  • 簡介:**pom既是一個XML文件,也是 Maven 工程的基本工作單元。**其包含了項目的基本信息,用于描述項目如何構建、聲明項目依賴等。在運行項目時,Maven會在當前目錄中查找并讀取 POM,然后獲取所需的配置信息、執行目標。
  • POM 中可以指定以下配置:
    • 項目依賴
    • 插件
    • 執行目標
    • 項目構建 profile
    • 項目版本
    • 項目開發者列表
    • 相關郵件列表信息
  • **注意:**所有 POM 文件都需要 project 元素和三個必需字段 groupId、artifactId、version。
  • <project xmlns = "http://maven.apache.org/POM/4.0.0"xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.companyname.project-group</groupId><artifactId>project</artifactId><version>1.0</version></project>
  • pom包細究:

    ? 總體結構(四部分),此為阿里云下載的 SpringBoot程序結構,官方與此稍有不同。

  • 項目的總體信息

  • maven依賴庫

  • maven依賴庫設置

  • 構建插件

  • 十三. 為什么會返回JSON格式數據

  • 原因:
    • 使用了 @ResponseBody注解
    • 導入了 Jackson JSON數據格式解析器
  • 使用其他 JSON數據格式解析器:如:GSON、fastJSON
    • 排除 Jackson依賴并導入其他依賴
    • 配置新環境
  • <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></exclusion></exclusions> </dependency> <!--導入新依賴--> <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.80</version> </dependency>

    (Spring官方對 fastJSON的支持度很低,自行配置編碼格式等內容)

    @Configuration class MyFastJsonConfig {@BeanFastJsonHttpMessageConverter fastJsonHttpMessageConverter(){FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();FastJsonConfig config = new FastJsonConfig();config.setCharset(Charset.forName("UTF-8"));config.setDateFormat("yyyy-MM-dd");config.setSerializerFeatures(SerializerFeature.WriteClassName,SerializerFeature.WriteMapNullValue,SerializerFeature.PrettyFormat,SerializerFeature.WriteNullListAsEmpty,SerializerFeature.WriteNullStringAsEmpty);converter.setFastJsonConfig(config);return converter;} } server:port: 80servlet:encoding:force-response: true

    十四. 跨域請求 CORS

  • 簡介:

    ? CORS,Cross-Origin Resource Sharing,是由 W3C制定的一種跨域資源共享技術標準,其目的是為了解決前端的跨域請求。它允許瀏覽器向跨源服務器,發出 XMLHttpRequest請求,從而克服了 AJAX只能同源使用的限制。

  • 特征:

    • 其特征是瀏覽器在發送請求時會攜帶 Origin標識,因為“ 跨域 ”。
    • 服務器如果支持跨域請求,則會檢查 client所攜帶的 Origin正確性,作出相應回應。如果 oringin指定的域名在許可范圍內,服務器返回的相應數據則會多出幾個頭信息字段。

  • 2?? Spring基礎知識

    Spring全稱: Spring Framework

    一. 注解開發說明

    ? Annotation:基于注解的方式 @Component。當我們給類注解時,默認 Bean的命名空間為小寫開頭的全類名,如 UserMapper則為 userMapper,當然我們也可以指定 Bean命名空間。

    二. 配置 Bean

    ? 其實總的來說,配置 Bean的方式有很多種,在SpringBoot的學習過程中我知道起碼有七種。但是在日常的使用中普遍的也就兩種:@Component注解或者 @Bean注解。

  • 說明

    注解的方式需要事先開啟包掃描 @ComponentScan注解。

  • IDEA使用技巧

    當顯示這個小圖標表示注解已生效,點擊可跳轉至 @Autowired被注入的地方。

  • 注意:

    當 Bean被創建時,會首先默認調用其無參構造方法。

    當為餓漢模式時,運行即調用;當為懶漢模式時,使用時才調用。

  • SpringBoot如何設置在創建時調用有參構造方法?

    @Configuration + @Bean

  • 三. 配置第三方 Bean

    ? 采用配置類 @Configuration + @Bean的方式。第三個類可以指在所導入的 jar包中的類,它原來不是 Bean或者我們需要去配置它,但是我們并不能直接的去改寫它,因為繼承太過于麻煩、而且有時 jar中的類會被定義為 final無法繼承。

    @Configuration public class CustomConfig {@BeanRedisTemplate getRedisTemplate(){return new RedisTemplate();} }

    四. 單例與多實例

    ? 當我們創建 Bean時,默認會為我們創建單例 Singleton的實例:即容器初始化時創建 Bean,容器關閉前銷毀 Bean。

    ? Spring默認類型是 singleton,幾乎90%以上的業務使用單實例就可以。

    ? Singleton的優點是效率高;缺點是可能會引發單線程下的線程安全問題。

    ? Prototype的優點是不會觸發單線程安全問題;缺點是每次連接請求都會創建 bean實例,請求數越多性能越低。而且因為創建的實例導致頻繁垃圾回收,GC的時長也相應增加。(garbage cycle)

    多實例的創建:

  • @Scope: 硬編碼格式。
  • @Scope(value = "prototype") @Scope(value = "singleton") @Scope(value = "request") //一次http請求內有效 @Scope(value = "session") //一個用戶會話內有效 @Scope(value = "globalSession") //全局會話內有效

    五. @Autowired說明

    ? 自動注入本身屬性: require = true

    ? 實現功能:在注入時忽略報錯,有則加載、無則使用默認值。

    // 此處并不一定會加載 222,而是該 Bean不存在時才會加載 222,注意這種寫法。 @Autowired(required = false) User user = new User(222); 屬性說明
    @Autowired根據屬性類型自動裝配
    @Qualifier結合@ Autowired根據屬性名稱自動裝配
    @Resource可以根據屬性類型或屬性名稱進行注入
    @Value普通類型屬性注入

    (但是 Spring官方不推薦使用 @Resource,因為注解并非 Spring官方開發,而是屬于 Javax——Java擴展包之中的內容)

    簡單使用:

    ? 配置同類型不同名的 Bean對象。

    @Configuration public class CustomConfig {@Bean@Primary // 默認 BeanUserService get_01() {return new UserServiceImpl();}@Bean("other") // 需指定名稱才能導入UserService get_02() {return new UserServiceImpl();} }

    ? 利用 @Autowired + @Qualifier 進行指定Bean的注入。

    @Autowired @Qualifier("other") UserService service;

    六. Bean的生命周期

    ? Bean也含有生命周期,利用注解(于方法上)我們可以對其進行控制,分別在其創建后、銷毀前。

    ? @PostConstruct@PreDestroy

    @PostConstructvoid initial(){System.out.println("創建后"); }@PreDestroy void destroy(){System.out.println("銷毀前"); }

    七. 條件裝配:Bean加載控制

    ? 即 @Conditional(OnSmtpEnvCondition.class)的形式。

    ? 使用條件注解,使我們能夠更加靈活的裝載 Bean。

  • 簡介:
    • @Conditional注解可以放在方法和類上。
    • 放在方法上和 @Bean一起使用,表示如果 @Conditional注解的參數類 matches方法為true這創建這個 Bean實例,否則不創建。
    • 放在類上結合 @Configuration、@ComponentScan判斷被注解的類是否需要創建
    • 可以同時擁有多個 @Conditional,變式多樣。
  • 簡單使用
  • // 如果Spring中不存在 UsersController Bean,就加載配置 @Configuration @ConditionalOnMissingBean(Cat.class) public class Test {@Beanpublic Dog getMsg(){return new Dog();} } @ConditionalOnBean(name = "com.test.controller.UsersController") @Component("jerry") public class Cat { }

    ( 比如 @ConditionalOnMissingClass(com.pojo.yyoo) ,當不存在此類時,條件為真。)

    八. 為Bean內的變量賦值

    ? Spring在注入一對象時,對象里的變量是如何被賦值的呢?

    ? Spring會調用這些變量的 set___ ( ) 方法從而為這些變量賦值,我們可以控制此流程。

    九. Spring事務管理

  • 四大特性:原子性、隔離性、一致性、持久性
  • 底層原理:AOP面向切面編程
  • 未完待續。
  • 十. JdbcTemplate解釋

  • JDBC是Java操作數據庫的一套規范。
  • JdbcTemplate:**JDBC的模板 **,Spring封裝的 JDBC對象。
  • MyBatis是一個基于 Java的、封裝了 JDBC的持久層框架。
  • 十一. P命名空間

    ? 即存在于 XML配置文件中的擴展寫法(了解即可)。

    實現步驟:

  • 復制標準格式,改成名稱 P。

  • 直接使用

  • 十二. 關閉ApplicationContext

    ? 利用ApplicationContext獲取的對象,最后需要手動的去關閉它。

    兩種方法:

  • try-catch語句
  • 強轉 + close( ):原生的ApplicationContext中無close方法,所以這里需要強轉再 close。
  • 十三. 完全注解開發

  • 要求:創建配置類Configuration,代替XML配置文件
  • 舉個不太恰當的例子
  • 十四. 獲取 Bean

    ? Spring中擁有兩種方式(并非方法)。

  • 按 ID名字獲取

    在SpringBoot中,根據 @Autowired + @Qulifier 獲取

  • 按類型獲取

  • app.getBean("ByID"); app.getBean(___.class);

    十五. 導入其他配置項

    ? 兩種注解。

  • @Import:導入其他配置類。
  • @Import(ConfigUser.class)
  • @ImportResource:導入 XML文件。
  • 十六. Bean的分類

    JavaBean分為兩類:

    • 一類稱為實體類 Bean:專門存儲業務數據的,如 Student、User 等
    • 一類稱為業務類 Bean:指 Service 或 Dao 對象,專門用于處理業務邏輯和數據訪問。

    3?? Spring MVC基礎知識

    一. MVC簡介

  • 全稱:Model View Controller
  • 說明:MVC是模型(model) - 視圖(view) - 控制器(controller)的縮寫,其是一種軟件設計規范,是一種業務邏輯、數據、界面顯示,三者相互分離的方法。
  • 優點:數據層、邏輯層、界面層相互分離,其中邏輯層來負責整體的調用,降低了程序整體的耦合性,從而可以三個人同時開發互不沖突。同時由于擁有清晰的結構性,也便于后期的維護。
  • 二. 衍生的 Bean注解

    ? 這些衍生出來的注解都是同一種東西的不同表現形式,作用完全一樣、只是為了給程序員作區分使用。

    注解@標識為
    Component一般組件
    Controller控制器
    Service事件處理器
    Repository持久層處理器

    三. 路徑疊加

  • 其實說的是 @RequestMapping疊加的情況,此時路徑也會直接進行疊加。
  • @RequestMapping是 SpringMVC提供的注解,其包括 @GetMapping、@PostMapping等。
  • 以下訪問路徑實為:/role/get
  • 四. RESTful風格

  • 全稱:Representational State Transfer,表現形態轉換。

  • 分類(Spring共支持8種)

    GET(查詢)、POST(新增、保存)、PUT(修改)、DELETE(刪除)

  • 說明:

    • 當使用 RESTful風格時,就無路徑參數符號 ? 拼接參數。
    • 當然,RESTful風格只是一種規范,流行于前后端分離開發。
  • 路徑占位符

  • @GetMapping("/{name}/{pass}") void login(@PathVariable("name") String name){System.out.println("login"); }
  • 功能清單范例
  • 功能URL 地址請求方式
    訪問首頁/GET
    查詢全部數據/employeeGET
    刪除/employee/2DELETE
    跳轉到添加數據頁面/toAddGET
    執行保存/employeePOST
    跳轉到更新數據頁面/employee/2GET
    執行更新/employeePUT

    五. @RequestMapping詳解

    ? 該注解屬性有六種,分別為 value、method、produces、consumes、header、params。

    ? 其中注意 headers作用的是請求頭,而 params作用的則是請求參數。

  • value

    指定請求的實際地址。

  • method

    指定請求的method類型, GET、POST、PUT、DELETE等。

  • produces

    指定返回內容的類型,只有當 request請求頭中 Accept屬性包含該 produces指定的類型才能返回數據成功,例如:accept:text/xml。

  • cousumes

    指定request請求提交的內容類型(Content-Type),例如application/json, text/html等。

  • headers

    指定request請求中必須包含某些指定的請求頭header的值,才能讓該方法處理請求。

    例如:Host=127.0.0.1

    “header”:要求請求映射所匹配的請求必須攜帶header請求頭信息

    “!header”:要求請求映射所匹配的請求必須不能攜帶header請求頭信息

    “header=value”:要求請求映射所匹配的請求必須攜帶header請求頭信息且header=value

    “header!=value”:要求請求映射所匹配的請求必須攜帶header請求頭信息且header!=value

  • params

    指定request請求地址中必須包含某些參數值,方法才處理,否則拒絕處理。

    ----params = “key1”==:表示請求必須包含名為key1的請求參數;
    ----params = “!key1”:表示請求不能包含名為key1的請求參數;
    ----params = “key1 != value1”:表示請求必須包含名為key1的請求參數,但是其值不能是value1;
    ----params = {“key1 = value1”, “key2”}:==表示請求必須包含名為key1和key2兩個請求參數,且key1的值必須為value1;

  • params = {"username","password!=123456"}

    六. 路徑 ant風格

    ? SpringMVC支持 ant風格的路徑,即支持 ant風格的通配符,三種

    符號表意
    單個字符
    *0個或多個字符
    **一層或者多層目錄

    七. 非 RESTful風格說明

    ? 本節將展示當我們不采用 RESTful風格時的情況。

  • 一般使用(參數同名時)

    形參參數名應與瀏覽器傳過來的參數名一樣,并不使用 @PathVariable路徑參數注解。

    在該例中,瀏覽器會跳轉至 /static/uuu.html頁面(MVC自動解析跳轉)。

  • 可變長參數

    最后環節,使用數組接收可變長參數。

  • @RequestParam參數

    當形參參數名與瀏覽器傳過來的參數不一致時,使用注解來指定。

    required:是否必須

    name:名字

    defaultValue:當不存在時,則使用默認值。(結合 required = false 使用)

  • 八. 域共享對象

  • 實例:在 url的跳轉中實現數據的共享。

  • 要求:既要實現完整功能,又要范圍最小。

  • 5種方式

    • 原生 Servlet:request.setAttribute( key , value ) + EL表達式。
    • ModelAndView
    • ModelMap
    • HttpSession對象
    • Application對象

  • 九. ModelAndView

  • 說明

    ModelAndView 統一實現了 Model對象和 View對象的功能。

    Model 主要用于向請求域共享數據,其本身是 Map的子類,擁有相應功能。

    View 主要用于設置視圖實現頁面跳轉。

  • 注意

    ? 當未配置其他解析器或者為使用 @ResponseBody注解時,默認使用的是SpringMVC解析器,而SpringMVC解析器會返回 ModelAndView對象。

  • 實現原理

    ? 當控制器處理完請求后,通常控制器會將包含視圖名稱以及一些模型屬性的 ModelAndView對象返回給 DispatcherServlet。因此,在控制器中會構造一個 ModelAndView對象

  • 數據共享:直接使用方法。

  • addObject(String attributeName, Object attributeValue)
  • 頁面跳轉
  • @GetMapping ModelAndView get() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("uuu.html");return modelAndView; }

    十. 請求響應擴展

  • 簡介

    正式名稱:HttpMessageConverter 報文信息轉換器

    將請求報文轉換為Java對象,或將Java對象轉換為響應報文。

  • 四種類型:

  • @RequestBody

    ? 該注解加在Controller 的處理方法的形參上,作用是將json格式的數據轉為java對象

    ? 作用于 Post請求,獲取請求體。

    @RequestBody String requestBody @RequestBody User user_date
  • RequestEntity對象

    ? 獲取的是整個請求頭+請求體,getBody( ) 獲取請求體,getHeaders( )獲取請求頭。

    ? **需要理解的是,HttpServletRequest是 Servlet技術,而 RequestEntity是 SpringMVC技術。**使用 RequestEntity而不使用 HttpServletRequest。

    用法:只要控制器方法的形參中設置該類型,其就會自動賦值。

    public String test(RequestEntity reqEntity){// }
  • @ResponseBody

    ? 該注解使用在Controller 方法上的 。將方法的返回值通過適當的轉換器(如 Jackson)轉換為指定的格式之后,寫入到 response 對象的 body 區,通常用來給客戶端返回 JSON 數據或者是 XML 數據。

    ? 當方法上面沒有寫 ResponseBody 時,底層會將方法的返回值封裝為 ModelAndView 對象(原此);需要注意的是,在使用此注解之后不會再走試圖處理器,而是直接將數據寫入到輸入流中,他的效果等同于通過 response 對象輸出指定格式的數據。

  • ResponseEntity對象

    ? 可以定義返回的 HttpStatus(狀態碼)和 HttpHeaders(響應頭) 和響應體 body,當形參出現此時,ModelAndView失效、@ResponseBody注解也失效。

    @RequestMapping("/downExcel") @ResponseBody public String downExcel(HttpServletResponse response) {// response邏輯操作OutputStream os = response.getOutputStream();return "" }
  • 十一. MVC工作流程

    ? 用戶通過視圖層發送請求到服務器,在服務器中請求被Controller接收,Controller調用相應的Model層處理請求,處理完畢將結果返回到Controller,Controller再根據請求處理的結果找到相應的View視圖,渲染數據后最終響應給瀏覽器。

    十二. 文件下載

  • 本質:文件復制。
  • SpringMVC文件下載流程:
    • 先通過輸入流( 例如InputStream )將文件讀取到Java程序中。
    • 建立 byte[ ] 數組,將輸入流讀取到的所有數據都存儲到byte [ ] 數組。
    • 向客戶端響應byte[ ]數組或者類似 **ResponseEntity<byte[ ]>**的響應類型。
  • 文件下載必須要設置的請求頭(設置類型)
  • headers.add("Content-Disposition", "attachment;filename=1.jpg");
  • 使用 ResponseEntity實現下載文件的功能(未跑通)
  • @RequestMapping("/testDown") public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {ServletContext servletContext = session.getServletContext();//獲取服務器中文件的真實路徑String realPath = servletContext.getRealPath("/static/img/1.jpg");InputStream is = new FileInputStream(realPath);byte[] bytes = new byte[is.available()];//將流讀到字節數組中is.read(bytes);//創建HttpHeaders對象設置響應頭信息MultiValueMap<String, String> headers = new HttpHeaders();//設置要下載方式以及下載文件的名字headers.add("Content-Disposition", "attachment;filename=1.jpg");HttpStatus statusCode = HttpStatus.OK;ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);//關閉輸入流is.close();return responseEntity; }
  • 實踐:

    ? 以上代碼我在 IDEA與服務器上并未跑通,于是我嘗試了別的方法。

    ? 需要說明的是:所有資源都放在/resource/static/里。

    • IDEA跑通,服務器跑通。
    @RestController @RequestMapping("/download") public class DownloadController {@GetMapping("{fileName}")ResponseEntity down(@PathVariable("fileName") String fileName) throws Exception {InputStream file = ClassUtils.getDefaultClassLoader().getResourceAsStream("static/" + fileName);byte[] data = new byte[file.available()];file.read(data);HttpHeaders headers = new HttpHeaders();headers.add("Content-Disposition", "attachment;filename=" + fileName);ResponseEntity responseEntity = new ResponseEntity<>(data, headers, HttpStatus.OK);return responseEntity; }}
    • IDEA跑通,服務器未跑通。

      在路徑兩處多了感嘆號 ! ,暫時不明白原因是什么。

    String realPath =ResourceUtils.getURL("classpath:static/").getPath()+ fileName;

    十三. 文件上傳

  • 本質:文件復制。

  • 上傳功能必需請求頭:

    multipart/form-data,即標明為以二進制方式上傳數據,而不是key-value。

  • <form method="post" enctype="multipart/form-data" action="/upload">圖片:<input type="file"><input type="submit"> </form>
  • 上傳操作要導入額外的依賴包 Apache Commons FileUpload
  • <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version> </dependency>
  • 范例代碼
  • @RequestMapping("/testUp") public String testUp(MultipartFile photo, HttpSession session) throws IOException {//獲取上傳的文件的文件名String fileName = photo.getOriginalFilename();//處理文件重名問題,UUIDString hzName = fileName.substring(fileName.lastIndexOf("."));fileName = UUID.randomUUID().toString() + hzName;//獲取服務器中photo目錄的路徑ServletContext servletContext = session.getServletContext();String photoPath = servletContext.getRealPath("photo");File file = new File(photoPath);if(!file.exists()){file.mkdir();}String finalPath = photoPath + File.separator + fileName;//實現上傳功能photo.transferTo(new File(finalPath));return "success"; }
  • 簡單實踐

    該案例會將文件上傳至與當前項目總文件夾 平齊的文件夾。

  • @RestController @RequestMapping("/upload") public class UploadController {@PostMappingString upload(MultipartFile file, HttpSession session) throws IOException {String filename = file.getOriginalFilename(); String fileType = filename.substring(filename.lastIndexOf(".")); filename = filename.substring(0,filename.indexOf("."))+ "-" + UUID.randomUUID().toString()+fileType;String realPath = ResourceUtils.getURL("images").getPath(); File io_file=new File(realPath); if (!io_file.exists()){io_file.mkdirs(); }file.transferTo(new File(finalPath));return "success"; }}

    十四. 攔截、過濾、分發器總結

  • 英文名稱

    • 攔截器 interceptor:攔截Controller,分為前后攔截器。
    • 過濾器 Filter
    • 分發器 DispatcherServlet
  • 示意圖:

  • 十五. @RequestParam、@PathVariable區別

    ? @RequestParam,@PathVariable 之間的區別。

    ? @RequestParam 和 @PathVariable 注解都是用于從 request中接收請求,兩個都可以接收參數。關鍵點不同的是 @RequestParam 是從request里面拿取值,而 @PathVariable 是從一個 URI模板里面來填充。

    • 用@RequestParam:/login?name=uu&pass=123
      • defaultValue 如果本次請求沒有攜帶這個參數,或者參數為空,那么就會啟用默認值
      • name 綁定本次參數的名稱,要跟URL上面的一樣
      • required 這個參數是不是必須的
      • value 跟name一樣的作用,是name屬性的一個別名**(震驚)**
    • 用@PathVariable:/login/uu/123
      • name-要綁定到的路徑變量的名稱
      • required-指示路徑變量是否為必需
      • value 跟name一樣的作用,是name屬性的一個別名

    十六. 視圖解析器

  • 簡介:

    SpringMVC視圖的種類很多,默認有轉發視圖和重定向視圖。

    但這必須不能存在@ResponseBody注解。

    存在@ResponseBody注解時,就關乎SpringBoot下頁面的跳轉問題,具體使用 ModelAndView。

  • 關注點:Themleaf好像已經很少使用。

  • 轉發視圖

    ? SpringMVC中默認的轉發視圖是 InternalResourceView

    ? 當控制器方法中所設置的視圖名稱以"forward:"為前綴時,會創建InternalResourceView視圖,此時的視圖名稱不會被SpringMVC配置文件中所配置的視圖解析器解析,而是會將前綴"forward:"去掉,剩余部分作為最終路徑通過轉發的方式實現跳轉

  • @RequestMapping("/testForward") public String testForward(){return "forward:/testHello"; }
  • 重定向視圖

    ? SpringMVC中默認的重定向視圖是 RedirectView

    ? 當控制器方法中所設置的視圖名稱以"redirect:"為前綴時,創建RedirectView視圖,此時的視圖名稱不會被SpringMVC配置文件中所配置的視圖解析器解析,而是會將前綴"redirect:"去掉,剩余部分作為最終路徑通過重定向的方式實現跳轉

  • @RequestMapping("/testRedirect") public String testRedirect(){return "redirect:/testHello"; }

    十七. SpringMVC執行流程

    **前置知識:**SpringMVC常用組件

    • DispatcherServlet:前端控制器,不需要工程師開發,由框架提供

    作用:統一處理請求和響應,整個流程控制的中心,由它調用其它組件處理用戶的請求

    • HandlerMapping:處理器映射器,不需要工程師開發,由框架提供

    作用:根據請求的url、method等信息查找Handler,即控制器方法

    • Handler:處理器,需要工程師開發

    作用:在DispatcherServlet的控制下Handler對具體的用戶請求進行處理

    • HandlerAdapter:處理器適配器,不需要工程師開發,由框架提供

    作用:通過HandlerAdapter對處理器(控制器方法)進行執行

    • ViewResolver:視圖解析器,不需要工程師開發,由框架提供

    作用:進行視圖解析,得到相應的視圖,例如:ThymeleafView、InternalResourceView、RedirectView

    • View:視圖

    作用:將模型數據通過頁面展示給用戶

    SpringMVC的執行流程

  • 用戶向服務器發送請求,請求經過Filter后被 SpringMVC 前端控制器 DispatcherServlet捕獲。
  • DispatcherServlet對請求 URL進行解析,得到請求資源標識符 URI,判斷請求 URI對應的映射:

    不存在

    • 判斷是否配置了mvc:default-servlet-handler

      沒配置:則控制臺報映射查找不到,客戶端展示404錯誤

      有配置:則訪問目標資源(一般為靜態資源,如:JS,CSS,HTML),找不到客戶端也會展示404錯誤

    存在(此處的 Handler為 Controller的同一對象不同說法)

    • 根據該URI,調用HandlerMapping獲得該Handler配置的所有相關的對象(包括Handler對象以及Handler對象對應的攔截器),最后以 HandlerExecutionChain執行鏈對象的形式返回。

    • DispatcherServlet 根據獲得的 Handler,選擇一個合適的 HandlerAdapter。

    • 如果成功獲得 HandlerAdapter,此時將開始執行攔截器的 preHandler(…)方法【正向】

    • 提取 Request中的模型數據,填充Handler入參,開始執行 Handler方法,處理請求。在填充 Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:

      a) HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換為指定的響應信息

      b) 數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等

      c) 數據格式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等

      d) 數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中

  • Handler執行完成后,向DispatcherServlet 返回一個ModelAndView對象。

  • 此時將開始執行攔截器的postHandle(…)方法【逆向】。

  • 根據返回的ModelAndView(此時會判斷是否存在異常:如果存在異常,則執行HandlerExceptionResolver進行異常處理)選擇一個適合的ViewResolver進行視圖解析,根據Model和View,來渲染視圖。

  • 渲染視圖完畢執行攔截器的afterCompletion(…)方法【逆向】。

  • 將渲染結果返回給客戶端。

  • 十八. Thymeleaf說明

  • 簡介:

    • 在目前的企級應用開發中前后端分離是趨勢,但視圖層技術仍有一席之地。
    • Spring Boot 官方推薦使用的模板引擎是 Thymeleaf,Spring Boot 提供了 Thymeleaf自動配置解決方案,因而Spring Boot 中使用 Thymeleaf非常方便。
    • 如果開發者使用的是前后端分離技術,那么開發過程不需要整合視圖層技術。
  • 默認配置說明

    路徑:classpath/template/____,后綴 html。

  • 實現步驟:

    • 導pom start包
    • yml配置屬性
    • controller中使用
  • <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> spring:thymeleaf:prefix: classpath:/template/encoding: UTF-8suffix: .html
  • 實現說明:

    在 cotroller中使用后,會默認返回 ModelAndView對象。

    SpringMVC返回的也是 ModelAndView對象,兩者同為視圖解析器。


  • 4?? SpringBoot小知識點

  • **static與 template目錄:**static中的資源不受保護,可以直接通過 url定位來訪問,而templates中的資源是受保護的。

  • SpringBoot工程在IDEA下需要聯網進行。

  • SpringBoot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化Spring應用的初始搭建以及開發過程。

  • SpringBoot只是簡化Spring與SpringMVC的簡化開發,MybatisPlus也是在簡化Mybatis,本質還是SSM框架。

  • Spring Boot 不支持同時在配置中啟動 HTTP HTTPS 。

  • 一些專業名詞

    • 數據源:DruidDataSource
    • 持久化技術:Mybatis、MybatisPlus
    • 數據庫:MySQL
  • 三種內嵌的數據源

    數據源默認存在的,并不一定需要 Druid。

  • HikariCP(SpringBoot默認數據源)
  • Tomcat的 DataSource
  • Common的 DBCP
  • 三種內嵌數據庫(了解)

    不過到真正上線的時候還是要切換到正式數據庫,而且體驗并不是很好,棄用。

  • H2
  • HSQL
  • Derby
  • MyBatis是一個基于 Java的、封裝了 JDBC的持久層框架,其底層使用 JDBC來編寫。

  • JS等前端庫可通過 pom導入。

    <dependency><groupId>org.webjars</groupId><artifactId>vue</artifactId><version>2.6.14</version> </dependency>
  • Controller路徑命名規則:

    常用復數形式表示,如 users、employees等。

  • 配置文件放在哪?

    在Maven的結構下,配置文件均放在resource目錄里。

  • yml配置信息如何記?

  • 只需要你記得其中幾個關鍵字,然后在 IDEA中敲一敲就能知道個大概。
  • 未知編程思想

    當遇到陌生方法調用時,只需觀察其形參與返回值,在大多數情況下便可了解其用法。

  • html表單說明

    html中的 form表單只能發送 Get或者 Post請求,并不能發送其他請求。

  • Tomcat思想:萬物皆對象。

  • JSON數據格式說明:一共只有兩種格式。

  • - 對象:{ } - 數組:[ ]
  • 寶塔小坑

    • 阿里云與寶塔均存在端口攔截機制,需要在兩邊都打開才能訪問。
    • 即使我在寶塔里部署 SpringBoot項目時設置了隨機端口映射,寶塔也不會默認開啟端口。
  • 關于 long類型

  • **long類型**本身描述的時間單位為**毫秒ms**,熟記。

    5?? SpringBoot基礎知識

    一. 初始項目結構

    ├── HELP.md ├── README.md ├── catcat.iml ├── mvnw ├── mvnw.cmd ├── pom.xml └── src├── main│ ├── java│ │ └── com│ │ └── thinkstu│ │ └── catcat│ │ └── CatcatApplication.java│ └── resources│ ├── application.properties│ ├── static│ └── templates└── test└── java└── com└── thinkstu└── catcat└── CatcatApplicationTests.java

    二. delete、put請求說明

    ? 部分瀏覽器只支持發送 get和 post請求,那么在 SpringBoot中該如何發送 put和 delete請求呢?

    ? SpringMVC 提供了 HiddenHttpMethodFilter 幫助我們將 POST 請求轉換為 DELETE 或 PUT 請求,SpringBoot中默認存在此配置類。

    使用要求:

    • 瀏覽器的請求方式必須為post
    • 瀏覽器必須傳輸請求參數_method

    ? 滿足以上條件,HiddenHttpMethodFilter 過濾器就會將當前請求的請求方式轉換為請求參數_method的值,因此請求參數_method的值才是最終的請求方式。

    三. jar包與 war包的區別

  • 簡介:

    ? jar包和war包都可以看成壓縮文件,都可以用解壓軟件打開,jar包和war包都是為了項目的部署和發布,通常在打包部署的時候,會在里面加上部署的相關信息。

  • 簡單區別:

    • JAR(Java Archive,Java 歸檔文件),是一個完整的項目結構,以流行的 ZIP 文件格式為基礎,jar包本質上就是 zip包,只是額外附加了一些固定的描述文件。
    • war包不是一個完整的項目結構,需要按照傳統的方式去進行部署。war包是 Sun提出的一種 web應用程序格式,與 jar類似,是很多文件的壓縮包。
  • 根本區別:

    ? JAR文件的目的是把類和相關的資源封裝到壓縮的歸檔文件中,而對于WAR文件來說,一個WAR文件代表了一個Web應用程序,它可以包含 Servlet、HTML頁面、Java類、圖像文件,以及組成Web應用程序的其他資源,而不僅僅是類的歸檔文件。

  • 四. start 與 parent的區別

  • 說明:Start與 parent均在 pom文件中。
  • Start指定對應包。
  • parent指定具體版本。
  • <!-- Start示例 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId> </dependency><!-- 對應parent --> <jetty.version>9.4.35.v20201120</jetty.version>

    五. @SpringBootApplication說明

  • 簡介:

    位于主啟動程序上,負責配置主程序

    其實是一個 SpringBoot Configuration( SpringBoot Configuration下面是 @Configuration)。

  • @SpringBootApplication public class Test01Application {public static void main(String[] args) {SpringApplication.run(Test01Application.class, args);}}

    六. #{ }與 ${ }說明

  • 簡介:

    • #{ }用來獲取 Bean類的變量值。
    • ${ }用來獲取 yml文件中的變量值。
  • 范例:

    加載名為users的這個Bean的cycle屬性值

  • @Scheduled(cron = "0/#{users.cycle} * * * * ?") @Data @Component("users") public class Users{Integer cycle=10; }

    七. @ControllerAdvice說明

    ? @ControllerAdvice :全局數據處理,是@Controller 的加強版。

    ? @ControllerAdvice 主要用來處理全局數據,一般搭配@ExceptionHandler、@ModelAttribute 及@InitBinder 使用。而RESTControllerAdvice就是Restful風格的ControllerAdvice;

    八. 臨時配置說明

  • 臨時配置既可以在命令行中修改,也可以在代碼中提前寫好。
  • java -jar xxx.java --server.port 8080

  • 禁止臨時配置
  • 有時我們會為了安全,禁止其他人在運行我們的程序時添加臨時屬性。

    方式:阻止main主程序中的args參數傳到SpringApplication。

    九. yml格式說明

  • 說明:重數據、輕格式。
  • 基本語法格式:
    • 屬性 與 屬性值之間用冒號 : 分隔,屬性值之前要加空格

    • 大小寫敏感,禁止同名,#表注釋。

    • 多屬性值(數組)之間用**小橫桿-**分隔

    • 使用縮進表示層級關系,同層級左側對齊,只允許使用空格。

    • 屬性值支持轉義字符,但必須用雙引號括起來。如:name: "/t name /n"

  • 簡單書寫實例
  • #表示對象,多實例(數組)用 - 符號分隔 users:- name: zhangsanage: 22city: 北京- name: wangwuage: 23city: 海南 #或者 users:- name: zhangsanage: 22city: 北京- name: wangwuage: 23city: 海南#或者 (注:外層中括號表數組,里層大括號表具體對象) users: users2: [{name: zhangsan,age: 22},{name: wangwu,age: 23}]
  • yml格式中互相引用
  • name: duck users: ${name}
  • 特殊寫法
  • version: @project.version@

    表示獲取該程序的version屬性,@ @包裹、輸入會有提示。

    十. 松散綁定說明

  • 簡介:

    松散綁定是 Spring為了兼容各種編程愛好者而制定的規則。

    我們并不需要使用,但是要了解、知道它的存在,其有時會導致程序出現 error。

  • 注意點:

    • 部分支持、部分不支持,使用駝峰命名法永遠沒有錯。
    • @ConfigurationProperties支持松散綁定,@Value不支持。
  • 范例:

  • ? yml中寫的是 dataSource,但是在代碼中以下形式都能綁定上數據。

    @ConfigurationProperties(prefix = "datasource") @ConfigurationProperties(prefix = "Data_Source") @ConfigurationProperties(prefix = "Data-Source") // 羊肉串模式 //等等

    6?? SpringBoot常用操作

    一. 頁面跳轉

    ? 在 SpringBoot條件下,利用 ModelAndView實現。

    二. 注解方式獲取請求頭

    @RequestHeader,Spring中常用方式,非原生的方式。

    經過觀察,其注解的參數與 @RequestParam一樣。

    三. 注解方式獲取Cookie

    @CookieValue,Spring中常用方式,非原生的方式。

    @CookieValue注解一共有三個屬性:value、required、defaultValue,用法同@RequestParam

    四. 編碼格式修改

    ? SpringBoot默認的編碼格式是 UTF-8 (寫在底層源碼中)。

    有三種方式可以定制編碼格式。

  • yml配置

    直接查找 endoding就可以顯現所有的內容。

  • server:servlet:encoding:charset: UTF-8
  • Filter 過濾器配置

    原理:Filter是瀏覽器發送的請求接觸到的第一層服務器端應用。 (代碼省略)

  • 配置類 配置
  • 五. 發送郵件

  • 三個郵件協議

    • SMTP:simple mail transfer protocol 簡單郵件傳輸協議,發送郵件
    • POP3:post office protocol -Version 3 第3代郵局協議,接受郵件
    • IMAP:Internet mail access protocol 互聯網消息協議,用來替代IMAP,接受郵件

    POP3與IMAP的不同點:**首先要得知,**我在這里所說的采用郵件協議為,全部在第三方軟件中采用。采用POP3時,郵件刪除等操作不會同步,即使你在第三方郵件系統刪除了某封郵件,但是在原郵件系統中并不會執行刪除操作。而采用IMAP就是為了改進這一點,實現了同步的操作。

  • 簡單實現三步走:

    • 導包:spring-boot-starter-mail。
    • 配置信息(服務器host、賬號、授權碼等)
    • 代碼實現(自動注入JavaMailSender類)
  • 范例:

    發送簡單郵件

  • <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency> spring:mail:host: smtp.qq.comusername: you_email@qq.compassword: "Authorized code"default-encoding: UTF-8 @Autowired JavaMailSender sender;@Test void sendEmail(){SimpleMailMessage msg = new SimpleMailMessage();String from="Your email@qq.com";msg.setFrom(from+"(自定義發送昵稱)"); //小括號里有內容~msg.setTo("To email@qq.com");msg.setSubject("標題");msg.setText("內容");sender.send(msg); }

    ? **發送復雜郵件:**html格式、附件等

    • 將 SimpleMailMessage替換成 MimeMessage
    • 借助于 MimeMessageHelper創建郵件內容
    @Autowired JavaMailSender sender; @org.junit.jupiter.api.Test void sendEmail() throws MessagingException {MimeMessage msg= sender.createMimeMessage();MimeMessageHelper msgHelper=new MimeMessageHelper(msg,true);msgHelper.setFrom("Your email@qq.com(哇哇哇)");msgHelper.setTo("To email@qq.com");msgHelper.setText("<a href='http://baidu.com'>鏈接</a>",true);String file="src/main/resources/application.yml";msgHelper.addAttachment("application.yml", new File(file));sender.send(msg);}
  • 郵件中的SSL加密

    ? 發送郵件或者接受郵件時我們可以配置SSL加密,具體要去郵件提供商那邊獲取。

    ? 例如對于騰訊,SSL端口為465或者587,首先開啟 SSL然后再配置端口。

  • 六. Scheduled定時任務

  • 簡介:Spring注解整合的方式只適用于較簡單的情況,復雜業務使用 Quartz
  • 實現步驟:
    • 啟動類上開啟
    • 方法上調用
  • @EnableScheduling @Component public class Test {@Scheduled(cron = "0/5 * * * * ?")void print(){System.out.println("+----+--------+");} }
  • yml額外配置:task擁有兩組配置,我們選擇 sheduling
  • task:scheduling:pool:size: 10 #線程池數量,默認只為1。shutdown:await-termination: false #關閉時是否等待所有完成await-termination-period: 10s #最大等待時間
  • @Scheduled 注解可以利用 @Value形式從 yml中取值
  • @Scheduled(cron = "0/${a.b.c:10} * * * * ?")

    七. Cron格式編寫指南

  • 簡介:

    • 邏輯反人類
    • 在線驗證網站:鏈接
  • 簡單編寫思想

    調整的時間順序,思維應該順著從小到大

  • 編寫規則

    秒數:

    • 范圍 0~59 ,不允許為空值,若值不合法,調度器將拋出 SchedulerException異常
    • ***** 表每隔1秒鐘觸發;
    • , 表在指定的秒數觸發,比如"0,15,45"代表0秒、15秒和45秒時觸發任務
    • - 表在指定范圍內觸發,比如"25-45"代表從25秒開始觸發到45秒結束觸發,每隔1秒觸發1次
    • / 表觸發步進(step),**"/“前面的值代表初始值(”“等同"0”),后面的值代表偏移量。**比如"0/20"或者"/20"代表從0秒鐘開始,每隔20秒鐘觸發1次,即0秒觸發1次,20秒觸發1次,40秒觸發1次;"5/20"代表5秒觸發1次,25秒觸發1次,45秒觸發1次;"10-45/20"代表在[10,45]內步進20秒命中的時間點觸發,即10秒觸發1次,30秒觸發1次。

    純數字系列:

    基于系統時間,比如 5即代表當系統時間走到某分鐘05秒時觸發。

    每分鐘0秒觸發格式為 0 * * * * ? 或者 0 0/1 * * * ? 。

    最后的問號代表什么:

    其實最后一位代表星期幾。為避免與前面沖突,故使用 ? 來表示任意。

  • 八. SpringBootAdmin監控

  • 簡介:

    分布式監控程序,非 SpringBoot官方開發,使用時需導入與之對應的官方版本號,否則報錯。

  • 注意事項:

    子節點要開放什么內容全部由子節點規定,Server無權干涉。(安全性)

  • 實現流程:

    • 導包 admin + SpringBoot Web

    • yml配置主從客戶端

      配置Server,主程序上開啟 @EnableAdminServer注解, yml中配置端口。

      配置Client,yml中配置主服務器即可。

  • 簡單實現

    配置 Server:

  • 創建 SpringBoot程序時選擇 ops中的 Server與 SpringBoot Web項目
  • 配置 yml端口,這里我設置為80
  • 主程序上配置開啟Server
  • server: port: 80 @EnableAdminServer

    配置 Client:

  • 創建SpringBoot程序時選擇 ops中的Server與 SpringBoot Web項目(此處勾選 web純粹是為了能使 SpringBoot項目持續運行,實際生產中可以勾選別的,達到效果就可以)
  • 配置 yml:Server地址、開放的數據內容等
  • server:port: 8080spring:boot:admin:client:url: http://localhost #server路徑地址 management:endpoints:web:exposure:include: "*" #開放所有,即13個端點endpoint:health:show-details: always #展示細節,true。默認false
  • 界面預覽

    打開 Server主頁地址,可以看到許多的數據

  • info信息配置

    • info端點:在 Server中展示 client業務信息的端點,比如程序名、作者,初始值為空。
    # yml文件中添加以下配置 management:info:env:enabled: true #使能夠info info:author: ThinkStudes: "good program" #具體信息,純手工編寫yml
    • 上述配置的另一種實現方案:創建 Bean并繼承 InfoContributor 后編寫配置。
    @Component public class AppinfoContributor implements InfoContributor {@Overridepublic void contribute(Info.Builder builder) {builder.withDetail("msg","good");} }
  • 自定義Health健康狀況

    ? 比如 client程序中存在 Redis,那么就會顯示redis的健康狀況。

    四種狀態:

    ? up在線、down離線、unkown未知、outofservice失去服務。

    ? 我們可以利用四種狀態在編碼中寫一些自定義程序,然后為這些程序添加 health監控。

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yX3TLkw1-1651739102964)(https://tva1.sinaimg.cn/large/e6c9d24egy1h1o6xhkv8sj21xs0u0tcc.jpg)]

    @Component public class HealthConfig extends AbstractHealthIndicator {@Overrideprotected void doHealthCheck(Health.Builder builder){boolean check=true;if (check){builder.withDetail("runtime","xxx");builder.status(Status.UP);}else{builder.withDetail("error","系統運行失敗");builder.status(Status.DOWN);}} }

  • 結合郵件系統:郵件信息報警系統

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MBjnpfJ6-1651739102964)(https://tva1.sinaimg.cn/large/e6c9d24egy1h1o6xhb71xj21cm0man1y.jpg)]

  • 九. 消息中間件

  • 基礎概念:
    • MQ:Message Queue,消息隊列。
    • JMS:Java Message Service;一個規范,等同于JDBC,提供了與消息服務相關的API接口
    • AMQP: advanced message queue protocal,高級消息傳輸協議,一種協議,不一定要遵守。其解決了JMS中的數據格式不唯一的缺點,統一使用byte[ ]。
    • Kafka:大數據技術,可以用作消息中間件,但是主要功能不是此。其是一種高吞吐量的分布式發布訂閱消息系統,提供實時消息功能。
  • JMS規范簡介
    • JMS消息模型

      • Peer-to-peer:P2P,點對點模型,一對一。
      • publish-subscribe:發布訂閱模型,消息可以被多個消費者消費,生產者與消費者完全獨立,不需要告知對方自身的存在。
    • JMS消息種類

      TextMessage、MapMessage、ByteMessage、StreamMessage、ObjectMessage、Message

    • 實現JMS的技術

      ActiveMQ、Redis、RabbitMQ、RocketMQ(沒有完全實現)

  • AMQP協議簡介
    • 優點:

      具有跨平臺性,服務器、供應商、生產者消費者可以使用不同的語言來實現。

    • AMQP消息模型:

      direct exchange、fanout exchange、topic exchange、headers exchange、system exchange

    • AMQP消息種類:byte[ ]

    • AMQP實現:

      RabbitMQ、RockerMQ、StormMQ等

  • 四種消息中間件簡介

    ActiveMQ:Apache產品,社區已經不活躍。

    RabbitMQ:使用頻率較高,速度中等,數據直接寫在磁盤中,不易丟失。

    RocketMQ:阿里巴巴開源的消息中間件,Java語言開發,各方面也表現的比較優越,幾乎同時解決了Kafka和RabbitMQ它們兩個的缺點,速度介于兩者之間,數據不易丟失。

    Kafka:速度快,但數據寫在內存中、易丟失。

  • 實現暫略。

  • 十. 自定義錯誤頁

  • 簡介:

    • Spring Boot 中的錯誤默認由 BasicErrorController 類來處理
    • 如果開發者不需要向用戶展示詳細的錯誤信息,那么可以把錯誤信息定義成靜態頁面
    • 在resources/static 中創建 error目錄,然后導入錯誤展示頁面。
  • 原理:

    ? 當觸發錯誤頁面時,BasicErrorController類被調用。(其將會返回 JSON或 html格式的錯誤數據,具體由用戶請求方式而定)

    • JSON格式的 error得到解決,html格式的 error傳到下一步。
    • 觸發 DefaultErrorViewResolver類,開始在 error目錄查找 4__ 、5__格式的錯誤頁面。
    • **(還是找不到時觸發)**回到 errorHtml ( )方法,使用 error 作為默認的錯誤頁面視圖名,如果名 error的視圖也找不到,就會展示默認錯誤頁面。
  • 簡單實現
  • 獲取錯誤的靜態頁面,置于 /resource/static/error 目錄中。

    • 兩種形式:

      xx形式 與 具體的數字形式。4xx.html、5xx.html的優先級低于具體的數字權限,如404、503等,所以它們是可以同時的存在的。

  • 復雜實現(自由度很高)
  • @Component public class MyException extends DefaultErrorAttributes {@Overridepublic Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {Map<String ,Object> map=super.getErrorAttributes(webRequest, options);map.remove("error");map.put("msg","錯誤請求");return map;} }

    十一. Slf4j日志使用

  • 簡介:

    • Lombok包中提供的注解。
    • 針對類使用、打印類的日志。
    • 在開發中,應該盡量使用日志而不是打印 Print。
  • 簡單實現:

    • 注解實現
    @Slf4j @RestController @RequestMapping("/users") public class UsersController {@GetMapping()String getById(HttpServletResponse response) throws IOException {log.error("fashion");return "啊啊啊啊";} }
    • 原生創建
    Logger log= LoggerFactory.getLogger(UsersController.class);
  • 效果:
  • **從左至右:**日志記錄時間、級別、PID、所屬線程、類對象、信息。

    十二. 靜態資源訪問

  • 簡介

    • 在SpringMVC 中,對于所有的靜態資源都需要開發者手動配置資源過濾
    • Spring Boot簡化了靜態資源過濾配置
    • SpringBoot靜態資源自動化配置類: WebMvcAuto Configuration。
  • 位置說明

    SpringBoot默認會過濾所有的靜態資源,一共有5個位置

    開發者可以將靜態資源放在這5個位置中的任意一個,優先級依次降低

  • classpath:/META-INF/resource/ classpath:/resource/ classpath:/static/ classpath:/public/ /
  • 沖突說明
  • ? 如果將文件夾中存在同名文件,則只有第一個會生效。

    十三. 路徑映射

  • 簡介

    ? 正常情況,如果我們有靜態網頁會放在/static里,然后訪問的時候需要添加 .html后綴。如果不想添加.html后綴,則需要在 Controller中加一層轉發的操作。

    ? 但是我們有更簡單的方法,而且節省資源。

  • 效果:

    訪問 http://localhost/aaa

    相當于 http://localhost/aaa.html

  • 簡單實現:

    首先將文件置于/static下。

  • ? 然后編寫 @Configuration、配置 WebMvcConfigurer接口,實現跳轉。

    @Configuration public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/uuu").setViewName("/uuu.html");registry.addViewController("/ooo").setViewName("/ooo.html");} }

    十四. 服務器日志

  • 簡介:

    在服務器中使用日志。

    在正式業務上線后不能使用開發工具進行調試,我們需要日志系統。

  • 說明:

    保存到服務器上的日志數據,我們可以使用 IDEA打開(擁有格式)。

  • 簡單使用

  • logging:file:max-history: 10max-size: 10MBname: server.logpattern:rolling-file-name: server.%d{yyyy-MM-dd}.%i.log

    十五. 多環境開發 Profile

  • 簡介:

    SpringBoot約定在不同環境下配置文件的名稱規則為

    • application-{profile} .properties
    • application-{profile}.yml

    profile占位符表示當前環境的名稱。

  • 作用:

    解決在多環境開發下配置文件混亂的問題。

  • 版本限制說明:

    • SpringBoot 2.4之include
    • SpringBoot 2.4之group
    • 阿里云現在的是2.3.7版本
  • 簡單實現

    • 在主 yml配置文件以外,編寫多份 yml文件
      • application-dev
      • application-devDB
      • application-MVC
    • 在主 yml配置文件中選擇性的引入其他配置文件。

    十六. 優先執行的代碼

  • 簡介:

    ? 有一些特殊任務需要在系統啟動時執行(例如配置文件加載、數據庫初始化等),SpringBoot對此提供了兩種基本一樣的方案:CommandLineRunner類、ApplicationRunner類。

  • 兩種簡單實現:

    ? CommandLineRunner:Spring Boot 項目在啟動時會遍歷所有 CommandLineRunner的實現類,并調用其中的 run 方法,如果整個系統中有多個 CommandLineRunner 的實現類,那么可以使用 @Order注解對這些實現類的調用順序進行排序。Order值越小越優先執行,可為負數,負數最小。

  • @Component @Order(-100) public class StartPrint implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("優先啟動~");} }

    ? ApplicationRunner:幾乎同上。兩者 Order通用,計算執行順序的時候需要同時參考兩者。

    @Component @Order(-1000) public class Start03 implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {System.out.println("33333");} }

    十七. 異常處理器

  • 簡介:

    異常,指的是當正常訪問時服務器時發生的異常,并非指 404之類的異常。

  • 簡單實現

    ( utils包下的異常處理類)

  • // 攔截所有異常 @RestControllerAdvice public class ProjectExceptionAdvice {@ExceptionHandler(Exception.class)R allException(Exception ex) {ex.printStackTrace();return new R("服務器發生未知故障,請稍后重試...");} }

    十八. 配置日志等級

  • 簡介:

    在 yml中配置當前日志的打印等級,一共有兩種形式。

    • 按包名劃分
    • 按分組劃分
  • 簡單實現:

  • 按包名劃分

    logging:level:root: error # root是根路徑 / 的正式寫法com.test.controller: info

    分組劃分,先分組再劃定等級。

    logging:group:ebank_name: com.test.controller,com.test.mapperlevel:root: errorebank: info

    十九. 兼容xml配置文件

  • 簡介:

    ? 有時候我們需要改寫一些比較老的程序,或者作 xml文件配置。

    ? 雖然 SpringBoot不推薦使用 xml進行配置,但是如果開發者需要使用 xml配置,那么只需在 resources目錄下提供配置文件、然后在主程序上導入即可。

  • 說明:

    • @ImportResource:導入 XML配置文件。
    • @Import:導入其他配置類。
  • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yWRboVy5-1651739102965)(https://tva1.sinaimg.cn/large/e6c9d24egy1h1sq40ejyaj214a0aoabn.jpg)]

    二十. 讀取標準 yml配置

  • 簡介:

    ? yml 中編寫了眾多屬性,那么該入伙獲取呢?

  • 獲取方式分類:

    • 單個讀取
    • 全部讀取
    • 選擇讀取
  • 單個讀取:@Value注解

  • @Value("${users[0].name}") String name;@Value("${a.b.c:10}") // 讀取不到則加載默認值 String num;
  • 全部讀取:利用被 Spring封裝的 Enviroment對象,該對象中包含了所有的 yml文件屬性。
  • @Autowired Environment env;@Test void contextLoads() {env.getProperty("users[0].name"); }
  • 選擇讀取:既可以為 Spring原生 Bean注入屬性,也可以為第三方 Bean注入屬性。

    實現步驟:

    • yml存在數據

    • 創建屬性獲取 Bean( @Component + @Data + @ConfigurationProperties 注解)。

      在這一步 Spring可能會提示缺少相應包,按提示導入即可。

    • 注入該 Bean并使用

  • @Data @Component @ConfigurationProperties("users2") public class UsersConfiguration {String name;String age; } // 使用 @Autowired UsersConfiguration userConfig;

    二十一. 讀取第三方 yml配置

  • 簡介:

    ? 我懷疑此種方式存在Bug,單級可以識別,一旦遇到多級就不能識別我的文件。還應該注意的是,方法不止這一種,但這種比較直接。

  • 簡單實現:

    @PropertySource屬性引入第三方文件(得加上類全路徑名)

  • @Data @Configuration @PropertySource(value = "classpath:users.yml") public class CustomConfig {@Value("${users}")Object name; }

    二十二. 攔截器

    ? 所有的攔截器都必須實現 HandlerInterceptor接口。

    ? **攔截器( Interceptor)**同 Filter 過濾器一樣,都是面向切面編程 AOP 的具體實現。

  • 必須實現的三個方法。

    • preHandle:控制器方法執行之前執行 preHandle(),其 boolean類型的返回值表示是否攔截或放行,返回 true為放行,即調用控制器方法;返回 false表示攔截,即不調用控制器方法。當它返回 false 時,表示請求結束,
    • postHandle: 方法在當前請求處理完成之后,也就是 Controller 方法調用之后執行。但是它會在 DispatcherServlet 進行視圖返回渲染之前被調用,我們可以在這個方法中對 Controller 處理之后的 ModelAndView 對象進行操作。
    • afterComplation:該方法在整個請求結束之后,也就是在 DispatcherServlet 渲染了對應的視圖之后執行,主要用來進行資源清理。
    • 執行順序:preHandle ----> Controller ----> postHandle ----> afterComplation
  • 多個攔截器的執行順序

    • 攔截器的執行順序為鏈條
    • ==注意:==當某個攔截器方法返回值為 false時,后續的 Interceptor和 Controller都不會再執行,所以一般需要手寫為 true。
  • 實現步驟:

    • 繼承自 HandlerInterceptor,重寫方法
    • @Configuration中 注冊攔截器:將攔截器 Bean交由 SpringMVC攔截器類 WebMvcConfigurer管理。
  • 在這一步才能配置攔截的路徑,還可以配置排除的路徑 excludePathPatterns。

    二十三. 頁面跳轉

    原理:利用 ModelAndView對象。

    @GetMapping ModelAndView get() {ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("/uuu.html");return modelAndView; }

    7?? SpringBoot常用技巧

    一. 獲取UUID的正確姿勢

    二. 全路徑名

    ? 在 xml或者 yml文件中進行配置時,可以使用全路徑名縮寫形式:classpath:

    classpath:UserMapper.class # 相當于全路徑+UserMapper.class

    三. 頁面重定向

    ? 簡單的頁面重定向,頁面跳轉與重定向并不一樣。

    @GetMapping() String getById(HttpServletResponse response) throws IOException {response.sendRedirect("/cancel.html");return null; }

    四. 表格的畫法

    我是實在想不到,竟然還會有表格畫法這種教程。

    節點用+號碼表示,線條用-號表示,空格表示表中的待填項。

    System.out.println("+----+--------+"); System.out.println("+ | |"); System.out.println("+ | |"); System.out.println("+----+--------+");

    五. yml中相互引用

    ? dollar + 大括號

    username: kkyour_name: ${username}

    六. 隨時獲取 ApplicationContext

  • 為什么能夠實現?

    ? 理解 SpringBoot底層工作源碼,采取官方接口 ___Aware。

  • 簡單實現:

    只要繼承 ApplicationContextAware并實現 set方法即可。

    public class Demo01 implements ApplicationContextAware {ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext=applicationContext;} }

  • 七. 網站圖標 favicon

  • 簡介

    favicon,網站圖標。

    雖然在 html代碼中也可以添加,不過在此添加較為方便。

  • 簡單實現

    • 將普通圖片轉為 ico圖標文件,鏈接
    • 重命名為 favicon.ico ,置于 /resource/static/ 下。
  • 八. 跳過測試模塊

  • 問題簡介

    SpringBoot程序在打包的時候會默認先執行測試類 Test里面的方法。

    這是因為存在 Maven生命周期,后執行的必須先執行前面的所有內容。

  • 解決:maven設置跳過測試

    九. 排除自動配置

  • 簡介:

    手動排除 SpringBoot的自動配置。

  • 兩種實現方法:

    • 主程序上配置

    • yml中配置

    十. 查看 pom組件版本

  • 簡介:

    查看在 pom文件中導入的具體軟件版本(全部)。

    可以分為兩種,Spring官方 與 阿里云鏡像 所創建的 SpringBoot程序并不一樣。

  • Spring官方

    兩層點擊:spring-boot-starter-parentspring-boot-dependencies

  • 阿里云

    dependencyManagement下的與中,點擊查看。

  • 十一. 正確的項目創建流程

  • 簡介:

    有利于項目與項目之間的解耦合,促進開發。

  • 操作流程:

    • 創建空項目工程
    • 在空的項目工程中 添加 所需要的其他組件 module。
  • 十二. 離線創建SpringBoot程序

  • 簡介:

    在沒有網絡的計算機上創建 SpringBoot程序,過程離線。

    但事先需要在官網上把相應文件創建并下載。

  • 步驟:

    • 官網創建、下載
    • 將項目導入離線設備
  • 十三. 快速制作程序模板

  • 簡介:

    制作模板程序,可以在學習的過程中大量復制某份程序。

  • 制作模板步驟:

    • 選擇模板

    • 刪除項目結構的無用文件

    • 刪除pom文件兩行、一行(結束)

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-bh5Q4N9S-1651739102967)(https://tva1.sinaimg.cn/large/e6c9d24egy1h1p9wf9t2xj2144092q53.jpg)]

    使用步驟:

    通常都是在項目中直接將上面的模板當成組件module導入。

    • 再復制出一份模板。
    • 在pom文件中把改成新組件名。
    • IDEA中導入,注意此次選擇的是import module而不是new module
    • 設置使用的JDK版本。(結束)

    十四. Tomcat替換成Jetty

  • 簡介:

    排除 Tomcat依賴,可以換成其他任意服務器程序。

  • 步驟:

    • pom中排除 Tomcat依賴
    • pom中新增 Jetty依賴
  • <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions> </dependency> <!-------------分割線--------------> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId> </dependency>

    十五. 修改Banner

  • 簡介:

    修改控制臺打印出來的 Banner廣告位。

  • 兩種方法:

    • 純文字:/resource 中編寫 banner.txt文件,Banner在線生成網站

    • 文字或者圖片:yml中配置

  • #關閉banner spring:main:banner-mode: off#修改banner為指定圖片 spring:banner:image:location: WechatIMG96.jpeg

    十六. 測試中開啟服務器配置

  • 簡介:

    ? 我們在執行測試的時候,SpringBoot默認不開啟服務器、節省資源。但是現在由于業務需求,需要對其測試,采用 WebEnvironment Web環境。

  • @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) public class Test03 {@Testvoid test03(){} }

    webEnviroment參數說明:

  • SpringBootTest.WebEnvironment.NONE:默認值,不啟動服務器
  • SpringBootTest.WebEnvironment.DEFINED_PORT:使用定義的端口
  • SpringBootTest.WebEnvironment.RANDOM_PORT:使用隨機的端口
  • SpringBootTest.WebEnvironment.MOCK:欺騙idea
  • 十七. 測試中開啟事務

  • 簡介:

    ? 在測試中經常會有寫入數據庫操作,但我只想知道是否執行成功,不想污染數據庫。

  • 步驟:

    • SpringBoot程序中已經導入 mysql + mybatis的包,沒有則無法開啟事務
    • 開啟 @Transational 注解
  • @SpringBootTest @Transactional public class Test04 {@Testvoid test04(){} }

    十八. 測試中的臨時屬性

  • 簡介:

    ? 想要在測試用例中添加一些臨時屬性,在 @SpringBootTest 中使用參數屬性注入即可。

  • @SpringBootTest(properties = {"a=b","server.port=99999"}) public class Test02 {@Value("${a}")String msg1;@Value("${server.port}")String msg2;@Testvoid test02( ){System.out.println(msg1);System.out.println(msg2);} }

    十九. @JsonIgnore

  • 簡介:

    ? 使用 Jackson作為項目的序列化工具時,可以作用在屬性、方法或者類上面,用來規避不想要的序列化功能。

  • @JsonIgnore private String username;

    二十. 項目打包構建

  • 簡介:

    ? 我們在 SpringBoot項目中能夠打包是因為配置了 maven插件,該插件由 SpringBoot parent 中提供。但是其他公司可能不采用 SpringBoot parent 作為parent,此時就需要配置。

  • 示意圖:避免重復打包

  • 二十一. IDEA隱藏文件

  • 簡介:

    隱藏不想看見的文件,避免冗余。

    set up — Edit — File Type.

  • 注意事項

    在 IDEA 2022.01版本中,我遭遇了隱藏文件時產生的 Bug,需注意。

  • 二十二. jdk8單位類

  • 簡介:

    ? JDK8 提供了兩個單位類,用來規范單位的表達形式。

    分別為:

    • 時間單位:Duration
    • 容量大小單位:DataSize
  • //使用 1. Duration duration1=Duration.of(3, ChronoUnit.HOURS); 2. Duration duration2=Duration.ofHours(3);3. @DurationUnit(ChronoUnit.HOURS)Duration duration3;//DataSize同理,例如: DataSize dataSize=DataSize.ofGigabytes(2);

    8?? SpringBoot不常用操作

    1. 修改配置文件名

    修改配置文件名,然后在程序運行時再指定配置文件名

    雖然感覺這種方式比較愚蠢,但是暫時收錄

    2. maven控制yml環境

    maven是比 Spring更底層的存在,Spring建立在 maven的基礎之上。

    我們可以使用 maven來控制并改變 Spring運行的時的 yml文件配置。

    3. JDBC使用

    優勢闡述:

    ? Mybatis之類是基于JDBC開發的,可以說 jdbc是更加底層的存在。

    ? 安全性與底層效率要較其他框架高,銀行相關行業比較熱衷此。

    步驟:

  • 導pom包
  • 自動注入,直接使用
  • <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> @Autowired JdbcTemplate jdbcTemplate;

    4. 熱部署

    說明:

    • 只能夠在開發環境中使用,并不是生產環境,也就是只能在 IDEA中使用
    • 部署比直接運行run速度要快,因為部署是 restart而不是 reload整個工程。
    • 消耗的資源很多,不實用,謹慎開啟

    開啟流程:到pom包、idea設置中開啟。

    5. 開啟 Bean校驗

  • 利用validation(接口)與hibernate(實現類)結合實現。
  • **具體功能:**可對自定義的 Bean在運行時進行數據的校驗,比如最大值 max、最小值 min、范圍 range等的校驗,通過了才能繼續編譯。
  • **具體使用:**對于我,暫時還未想到。
  • <dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version> </dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>8.0.0.Alpha3</version> </dependency>

    6. 代碼中編寫測試

    有時候我們需要在代碼中編寫測試用例,而不使用 postman這類工具。

  • 簡單測試:
  • ? get請求訪問頁面,先開啟webEnviroment、AutoConfigureMockMVC,然后注入MOckMVC,最后執行操作

  • 后續放棄。
  • 7. 測試用例中設置隨機數據

    只是想在測試的時候加載一些隨機數據,應該把以下內容用Profile思想來編寫:即多份yml文件。

  • 編寫yml數據,里面是dollar大括號加上隨機函數random
  • testData:name: ${random.uuid}age: ${random.int(6,100)}id: ${random.value} #MD5加密,32位
  • 代碼中配置(注入即可,之前使用過)
  • @Data @Component @ConfigurationProperties( "testdata") public class TestDataConfig {String name;Integer age;String id; }
  • 使用:直接 @Autowired 即可使用

  • 9?? 整合第三方

    此章節需要日積月累。

    一. 整合Mybatis

  • 導包或者勾選包
  • 配置 yml
  • 編寫 Mapper接口
  • spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/adult?serverTimezone=UTCusername: rootpassword: "$Now2022" @Mapper public interface UsersMapper {@Select("select * from users where id = #{id}")List<Users> getById(Integer id); } @Autowired UsersMapper mapper;
  • 開啟 Mybatis運行日志
  • mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    二. 整合MybatisPlus

  • 將Mybatis包換成MybatisPlus包
  • Mapper接口繼承BaseMapper< T >
  • 修改ID自增長策略,逐漸增長而不是雪花算法增長
  • 整合業務層 Iservice與 ServiceImpl
  • 開啟 Mybatis運行日志(非 MybatisPlus功能)
  • @Mapper public interface UsersMapper extends BaseMapper<Users> {@Select("select * from users;")List<Users> getAll(); } public class UsersServiceImpl extends ServiceImpl<UsersMapper,Users> implements UsersService , IService<Users> { } mybatis-plus:global-config:db-config:id-type: autoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    三. 整合Druid

  • 導 pom包
  • Yml配置文件加上一行
  • spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/adult?serverTimezone=UTCusername: rootpassword: "$Now2022"

    🔟 Spring Security

    一門登錄技術, 學會不易。

    一. 簡介

  • Spring Security是基于內存級別的認證,不是數據庫。

  • SpringBoot為 SpringSecurity提供了很好的支持。

  • 導包之后,SpringSecurity為我們提供了一個默認頁面登錄頁面(未登錄時攔截了所有的請求!),默認賬號為user,密碼見控制臺。如果對初始的賬號密碼不滿意,可以在yml中修改。

    spring:security:user:name: adminpassword: adminroles: ADMIN #此處是區分大小寫的,需特別注意
  • 二. 使用步驟

  • 導包

  • yml簡單配置

  • 代碼中正式配置

    配置說明:

    • 訪問/admin/** 需要 ADMIN角色權限

    • 訪問/user/ ** 需要 CAT或者 USER角色權限。

    • 訪問其他任意資源都要先登錄。

    • 默認登錄頁面是 /login。

    • permitAll作用于 /login ,表示和登錄相關的接口都不需要認證即可訪問。

    • csrf( ).disable( )表示關閉 csrf,防止服務器被 csrf攻擊。

      (csrf攻擊:Cross Site Request Forgery,跨站請求偽造。)

  • @Configuration public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").access("hasAnyRole('CAT','USER')").anyRequest().authenticated().and().formLogin().loginProcessingUrl("/login").permitAll().and().csrf().disable();} }
  • Basic認證:添加 Basic認證能夠讓 Postman可訪問。
  • .and().httpBasic()

    三. 自定義登錄頁面與返回值

  • 簡介:

    ? 目前為止我們使用的還都是 Spring Security默認提供的登錄頁面。

    ? 在前后端分離的開發中,我們需要自定義登錄頁面與返回的 JSON格式數據

  • 思想:

    • 雖然新登錄地址是/login_new,但是最終的數據提交地址還是/login。
    • 對于傳輸過程中的參數 usename與 password可以自定義而不必固定。
    • 可以設置登錄成功、失敗返回的數據。
  • 簡單實現(配置):

  • .and() .formLogin() .loginPage("/login_page") .loginProcessingUrl("/login") .usernameParameter("name") .passwordParameter("pass") .successHandler((req, resp, auth) -> {Object principal = auth.getPrincipal();System.out.println(principal + "-------principle"); resp.setContentType("application/json;charset=utf-8");PrintWriter writer = resp.getWriter();Map<String, Object> map = new HashMap<>(16);map.put("status", "200");map.put("msg", principal);ObjectMapper om = new ObjectMapper();writer.write(om.writeValueAsString(map));writer.flush();writer.close(); }) .failureHandler((req, resp, exception) -> { resp.setContentType("application/json;charset=utf-8");PrintWriter writer = resp.getWriter();resp.setStatus(401);Map<String, Object> map = new HashMap<>(16);if (exception instanceof LockedException){map.put("msg","賬戶凍結");}else if (exception instanceof BadCredentialsException){map.put("msg","賬號密碼錯誤,請重新輸入");}else {map.put("msg","登錄失敗");}ObjectMapper om = new ObjectMapper();writer.write(om.writeValueAsString(map));writer.flush();writer.close(); }) .permitAll() .and() .csrf() .disable();

    四. 注銷登錄

  • 簡介:

    ? 默認訪問 /logout即可注銷。

    ? 但是在這里我遇到問題,可能是這種方式已經失效。

  • 簡單實現:
  • .and() .logout() .logoutUrl("/logout") .clearAuthentication(true) .invalidateHttpSession(true) .addLogoutHandler((req, resp, authentication) -> { }) .logoutSuccessHandler((req, resp, authentication) -> {try {resp.sendRedirect("/login_page");} catch (IOException e) {e.printStackTrace();} })

    五. 加鹽 Salt

  • 簡介:

    ? 所謂加鹽就是一種加密形式,其既可以是隨機數、也可以是用戶名。

    ? 加鹽之后原本密碼相同的用戶所生成的最終密碼也不會相同,可以有效防止跑庫破解密碼。

  • 傳統加鹽方式:需要在數據庫中記錄用戶的鹽值。

  • Spring Security加鹽

    ? Spring Security提供了多種加鹽方案。

    ? 官方推薦使用BCryptPasswordEncoder,其使用了 BCrypt 強哈希函數,開發者在使用時可以選擇提供 strength 和 SecureRandom 實例 ,strengh越大,密鑰的迭代次數越多,迭代次數為2的strength次方。(strength 取值在4~31 之間,默認為 10)

    @Configuration public class PasswordEncoderConfig {@BeanPasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder(10);} }
  • 簡單使用:

    • 寫 service
    • 注冊時將 encrypt傳到數據庫(代碼編寫)

  • 六. 使用注解進行配置

  • 簡介:

    ? 上面都是使用 Java類來進行Spring Security配置,現在采用注解的形式。

    ? 配置內容:訪問路徑(或者方法)需要授權。

  • 使用步驟:

    • 開啟注解形式
    • 類或者方法上面使用

  • 七. 持久層存儲:數據庫

  • 簡介:

    ? 將 Spring Security基于內存級別的登錄驗證信息存儲到數據庫。

  • 遺憾:暫時未能成功實現。

  • 實現步驟:

    • 創建數據庫對應表:首先得創建三張數據庫用戶表
    • 代碼中實現注冊與登錄等相關業務
  • 建表語句范例:

  • drop table if exists user; drop table if exists role; drop table if exists user_role; create table user(id int primary key auto_increment,username varchar(32),password varbinary(255),enabled tinyint(1),locker tinyint(1) );create table role(id int,name varchar(32),nameZh varchar(32) );create table user_role(id int(11),uid int(11),rid int(11) )

    八. 令牌技術:token

  • 簡介:

    ? 本節基于 OAuth2框架,該框架的使用與實現賬號密碼登錄不沖突。

  • 遺憾:暫時未能成功實現。

  • 令牌技術說明:

    ? 令牌技術的優勢在于可以只授權部分權限給第三方,從而避免了密碼直接泄露的可能性。第三方拿著令牌可以訪問一些基礎資源,如:頭像、用戶名等。很多第三方也只支持 token而不支持 Cookie(如:微信小程序)。

  • 交互流程(三次):

  • OAuth授權模式說明

    ? OAuth具有多種授權模式,其各有千秋、按需選擇。

  • 九. WebSocket

  • 簡介:一種 HTTP即時通信技術,目前流行。
  • 暫無。
  • 十. Swagger2

  • 簡介:

    ? 一種可以將 代碼編寫 和 需求文檔編寫 融為一體的技術(暫時無該需要)。

  • 簡單實現

  • 總結

    以上是生活随笔為你收集整理的SpringBoot笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。