前言#
寫這個是為了記錄自己入門學習 SpringBoot 框架的入門文章,並沒有看源碼之類的,哪些後面再看。
學習 SpringBoot 框架總計用了 9 個小時。
學會了基礎的使用和 redis,mysql 的配置使用。
還有記錄遇到的坑之類的
參數及註釋和坑#
入口參數#
@SpringBootApplication(scanBasePackages = "com.example")
// 引用mybatis plus 同時掃描mapper包
@MapperScan("com.example.springbootlearn.mapper")
這兩個註釋我通常放在入口處。
SpringBootApplication 內的掃描包,可以自動掃描裡面的組件及其他
MapperScan 則是掃描 mapper,則不需要繼承的函數使用 @Mapper 的重複註釋
關於網址請求#
@RestController
這個是路由的控制層,是 @Controller @ResponseBody 合併一起的簡易方式
@GetMapping("/get/{id}/test/{name}")
public Map<String, Object> GetPathController(
@PathVariable("id") Integer id,
@PathVariable Map<String, String> PathMap,
@RequestHeader("User-Agent") String Agent,
@RequestHeader Map<String, String> HeaderMap,
@RequestParam("age") Integer age,
@RequestParam Map<String, String> ParamMap,
@CookieValue("test") String test
) {
@PathVariable 獲取請求路徑對應的值
還可以使用Map接收傳來的所有值,如Map<String,String>
@RequestHeader 獲取請求的頭部參數,User-Agent 表示獲取請求的瀏覽器標識
還可以使用Map接收傳來的所有值,如Map<String,String>
@RequestParam 獲取請求的Param值,如Get的/get/test?age=10&name="Test"
@CookieValue 獲取請求的Cookie值
@RequestAttribute 獲取域屬性
@RequestBody 獲取post請求的Json值 會自動序列化
其中的 GetMapping 則是網址請求的簡易寫法,PostMapping 則是 Post 請求的寫法。
@RequestMapping(value = "Name", method = RequestMethod.POST)
關於網址響應#
@ResponseBody // 響應body
則需要在方法上加上這個註釋,我們想要響應 xml 和 json 形式則是需要導入兩個插件庫
// 引用響應json庫
implementation 'org.springframework.boot:spring-boot-starter-json'
// 引用響應xml庫
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'
SpringBoot 會自動根據 accpet 的請求來自動判斷返回 xml 還是 json 數據,其中需要開啟配置。
# accept
spring.mvc.contentnegotiation.favor-parameter=true
自定義組件#
@Component
使用這個註釋就完事,同時還可以自定義,往裡面加指定的類就行
@Import({AsyncAppender.class})
@Bean("PetConfig")
這個註釋則是聲明容器組件的指定 ID,相當於名字。
還有一種過濾參數:
// 設置當容器中有該組件,此配置類代碼才生效,進行組件注入,談過沒有指定組件,註釋下面的代碼全部無法使用
// 如:此配置類沒有PetConfig的組件,則MyConfig全部無法使用,若在方法前面加上該註釋,沒有滿足條件則會該方法無法使用
@ConditionalOnBean(name = "PetConfig")
當我們需要判斷其中的組件是否使用,或者查看使用哪些組件,可以在 SpringBoot 的入口處查看:
// ConfigurableApplicationContext run = SpringApplication.run(SpringBootLearnApplication.class, args);
// 查看框架使用的組件
// String[] GetSpringBootName = run.getBeanDefinitionNames();
// for (String Name : GetSpringBootName) {
// System.out.println(Name);
// }
// // 獲取指定組件
// Pet pet = run.getBean("PetConfig", Pet.class);
// System.out.println(pet);
// 獲取容器中有沒有指定組件
// boolean Pet = run.containsBean("PetConfig");
// System.out.println(Pet);
如何自定義讀取配置 yaml#
// 獲取配置文件信息,由於是有前綴的形式,所以需要使用此函數
@PropertySource(value = "classpath:application.yaml")
@ConfigurationProperties(prefix = "database")
// 使用註釋自行注入setter和getter 方法,雖然可以自動生成,但是還是可以用lombok方法
@Data
這裡表示的註釋在 yaml 的表示為:
@Data 是 lombok 庫的方法,這個庫更多的是提供 private 變量的 setter 和 getter 方法,自動生成
// lombok 簡易開發庫 自動注入就用 annotationProcessor導入
annotationProcessor 'org.projectlombok:lombok'
// 同時導入build時的包
compileOnly 'org.projectlombok:lombok'
如何使用 mybatis plus#
-
定義一個包含數據表參數的類
@Data public class User { private Long id; private String name; private Integer age; private String email; }
-
使用接口繼承 mybatis plus 的類
@Component public interface UserMapper extends BaseMapper<User> { }
需要使用的庫的配置:
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
// 使用數據庫管理池 阿里的,又一個kpl項目 需要指定版本
// implementation 'com.alibaba:druid:1.2.15' 使用spring框架官方版
implementation 'com.alibaba:druid-spring-boot-starter:1.2.15'
// 引用java mysql 驅動
implementation 'mysql:mysql-connector-java'
// 引用mybatis
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.1'
// 引用mybatis-plus https://baomidou.com/pages/24112f/#%E6%94%AF%E6%8C%81%E6%95%B0%E6%8D%AE%E5%BA%93
implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.3.1'
之所以展示出來配置,是因為部分情況可能找錯包,這裡對應一下。
想要使用 SpringBoot 和 Mybatis plus 的測試包,配置則是需要寫入:
// 引用SpringBoot測試庫
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// 引用mybatis plus 測試庫
testImplementation 'com.baomidou:mybatis-plus-boot-starter-test:3.5.3.1'
這樣差不多就入門了,剩下的我去看項目源碼。
測試註釋#
/*
測試常用註釋
● @Test :表示方法是測試方法。但是與JUnit4的@Test不同,他的職責非常單一不能聲明任何屬性,拓展的測試將會由Jupiter提供額外測試
● @ParameterizedTest :表示方法是參數化測試,下方會有詳細介紹
● @RepeatedTest :表示方法可重複執行,下方會有詳細介紹
● @DisplayName :為測試類或者測試方法設置展示名稱
● @BeforeEach :表示在每個單元測試之前執行
● @AfterEach :表示在每個單元測試之後執行
● @BeforeAll :表示在所有單元測試之前執行
● @AfterAll :表示在所有單元測試之後執行
● @Tag :表示單元測試類別,類似於JUnit4中的@Categories
● @Disabled :表示測試類或測試方法不執行,類似於JUnit4中的@Ignore
● @Timeout :表示測試方法運行如果超過了指定時間將會返回錯誤
● @ExtendWith :為測試類或測試方法提供擴展類引用
*/
// 可通過assertions類進行斷言
/*
往測試裡面注入參數
@ValueSource: 為參數化測試指定入參來源,支持八大基礎類以及String類型,Class類型
@NullSource: 表示為參數化測試提供一個null的入參
@EnumSource: 表示為參數化測試提供一個枚舉入參
@CsvFileSource:表示讀取指定CSV文件內容作為參數化測試入參
@MethodSource:表示讀取指定方法的返回值作為參數化測試入參(注意方法返回需要是一個流)
*/
// 使用測試