導(dǎo)航
[React 從零實(shí)踐01-后臺(tái)] 代碼分割
[React 從零實(shí)踐02-后臺(tái)] 權(quán)限控制
[React 從零實(shí)踐03-后臺(tái)] 自定義hooks
[React 從零實(shí)踐04-后臺(tái)] docker-compose 部署react+egg+nginx+mysql
[React 從零實(shí)踐05-后臺(tái)] Gitlab-CI使用Docker自動(dòng)化部署
[源碼-webpack01-前置知識(shí)] AST抽象語法樹
[源碼-webpack02-前置知識(shí)] Tapable
[源碼-webpack03] 手寫webpack - compiler簡(jiǎn)單編譯流程
[源碼] Redux React-Redux01
[源碼] axios
[源碼] vuex
[源碼-vue01] data響應(yīng)式 和 初始化渲染
[源碼-vue02] computed 響應(yīng)式 - 初始化痢毒,訪問塔嬉,更新過程
[源碼-vue03] watch 偵聽屬性 - 初始化和更新
[源碼-vue04] Vue.set 和 vm.$set
[源碼-vue05] Vue.extend
[源碼-vue06] Vue.nextTick 和 vm.$nextTick
[部署01] Nginx
[部署02] Docker 部署vue項(xiàng)目
[部署03] gitlab-CI
[數(shù)據(jù)結(jié)構(gòu)和算法01] 二分查找和排序
[深入01] 執(zhí)行上下文
[深入02] 原型鏈
[深入03] 繼承
[深入04] 事件循環(huán)
[深入05] 柯里化 偏函數(shù) 函數(shù)記憶
[深入06] 隱式轉(zhuǎn)換 和 運(yùn)算符
[深入07] 瀏覽器緩存機(jī)制(http緩存機(jī)制)
[深入08] 前端安全
[深入09] 深淺拷貝
[深入10] Debounce Throttle
[深入11] 前端路由
[深入12] 前端模塊化
[深入13] 觀察者模式 發(fā)布訂閱模式 雙向數(shù)據(jù)綁定
[深入14] canvas
[深入15] webSocket
[深入16] webpack
[深入17] http 和 https
[深入18] CSS-interview
[深入19] 手寫Promise
[深入20] 手寫函數(shù)
[深入21] 數(shù)據(jù)結(jié)構(gòu)和算法 - 二分查找和排序
[深入22] js和v8垃圾回收機(jī)制
[深入23] JS設(shè)計(jì)模式 - 代理渗蟹,策略,單例
[前端學(xué)java01-SpringBoot實(shí)戰(zhàn)] 環(huán)境配置和HelloWorld服務(wù)
[前端學(xué)java02-SpringBoot實(shí)戰(zhàn)] mybatis + mysql 實(shí)現(xiàn)歌曲增刪改查
[前端學(xué)java03-SpringBoot實(shí)戰(zhàn)] lombok奕枝,日志,部署
[前端學(xué)java04-SpringBoot實(shí)戰(zhàn)] 靜態(tài)資源 + 攔截器 + 前后端文件上傳
[前端學(xué)java05-SpringBoot實(shí)戰(zhàn)] 常用注解 + redis實(shí)現(xiàn)統(tǒng)計(jì)功能
[前端學(xué)java06-SpringBoot實(shí)戰(zhàn)] 注入 + Swagger2 3.0 + 單元測(cè)試JUnit5
(一) 前置知識(shí)
(1) 一些單詞
condition 條件 // conditional 條件的 adj
camel 駱駝
swagger 大搖大擺 虛張聲勢(shì)
contact 接觸 聯(lián)系
implicit 隱藏 隱式
assertions 斷言
qualifier 限定符 修飾符
(二) Swagger2 3.0
(1) 安裝Swagger2 maven 依賴場(chǎng)景啟動(dòng)器starter
pom.xml
-------
<!-- Swagger -->
<!-- 自動(dòng)生成 ( 接口文檔 ) 及 ( 自測(cè)工具 ) -->
<!-- Swagger2 3.0 只需要 ( springfox-boot-starter ) 就可以了 -->
<!-- Swagger2 2.x 則需要 ( springfox-swagger2 ) 和 ( springfox-swagger-ui )-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<!-- (1) springfox-swagger2 -->
<!--<dependency>-->
<!--<groupId>io.springfox</groupId>-->
<!--<artifactId>springfox-swagger2</artifactId>-->
<!--<version>3.0.0</version>-->
<!--</dependency>-->
<!-- (2) springfox-swagger-ui -->
<!--dependency>-->
<!--<groupId>io.springfox</groupId>-->
<!--<artifactId>springfox-swagger-ui</artifactId>-->
<!--<version>3.0.0</version>-->
<!--</dependency>-->
(2) 編寫 Swagger2 的配置類
src/main/java/com.example.demo/config/Swagger2Config.java
-------
@Configuration // 標(biāo)注當(dāng)前類是一個(gè)啟動(dòng)類瓶堕,即項(xiàng)目啟動(dòng)時(shí)就要去加載了
@EnableSwagger2 // 開啟 Swagger2 的配置
public class Swagger2Config {
@Bean // 把該組件添加到IOC容器中
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
// Swagger2進(jìn)行包掃描隘道,掃描 controller,這里填寫 controller 的文件夾全路徑
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
// 標(biāo)題
.title("react-admin-java-api 使用Swagger2構(gòu)建RESTful APIs")
// 描述
.description("react-admin-java-api Swagger2的接口文檔")
// 作者信息
.contact(new Contact("woow_wu7", "https://github.com/woow-wu7/7-react-admin-java", "woow_wu7@gmail.com"))
// 服務(wù)網(wǎng)址
.termsOfServiceUrl("http://120.53.220.141:81/admin-home")
.version("1.0")
.build();
}
}
(3) 訪問 http://localhost:7777/swagger-ui/index.html
- 如果是遠(yuǎn)程部署后訪問地址:
服務(wù)器地址/swagger-ui/index.html
(4) 相關(guān)注解
-
controller
-
@Api
用在請(qǐng)求的類上,該注解最好不要設(shè)置谭梗,中文不是很好 -
@ApiOperation
用于controller類的方法上忘晤,說明方法的用途和作用 -
@ApiParam
用于請(qǐng)求方法的參數(shù) => 個(gè)人感覺侵入性太強(qiáng),嚴(yán)重影響了閱讀默辨,混入業(yè)務(wù)代碼很亂 -
@ApiImplicitParams
用于請(qǐng)求方法上 => 主要用于post請(qǐng)求 -
@ApiImplicitParam
用于@ApiImplicitParams參數(shù)中
-
-
models => bean || model || dto
@ApiModel
@ApiModelProperty
// 查
@GetMapping("/getMusicListTest")
@ApiOperation(value = "查詢歌曲列表") // Swagger2
public PaginationTestDTO getMusicList(
@RequestParam(value = "current", defaultValue = "1")
@ApiParam(name = "current", value = "當(dāng)前頁", defaultValue = "1", required = false) Integer current,
@RequestParam(value = "pageSize", defaultValue = "10")
@ApiParam(name = "pageSize", value = "每頁數(shù)量", defaultValue = "10", required = false) Integer pageSize,
@RequestParam(value = "searchKey", defaultValue = "")
@ApiParam(name = "searchKey", value = "搜索框", defaultValue = "", required = false) String searchKey
) {
return musicTestService.getMusicList(current, pageSize, searchKey);
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("歌曲")
public class MusicTestBean {
@ApiModelProperty(name = "name", value = "歌名")
private String name; // 歌名
@ApiModelProperty(name = "album", value = "專輯")
private String album; // 專輯
@ApiModelProperty(name = "singer", value = "歌手")
private String singer; // 歌手
private Integer id;
private String startTime;
private String endTime;
}
(三) 單元測(cè)試 JUnit5
- SpringBoot已經(jīng)集成了JUint5
- 使用非常簡(jiǎn)單
- 編寫測(cè)試方法德频,并用
@Test來標(biāo)注 (unit5版本)
- JUnit的測(cè)試類具有spring的功能
- 比如可以使用 @Autowired 來自動(dòng)引入IOC中的組件
- 比如可以使用 @Transactional 來標(biāo)注測(cè)試方法,測(cè)試完成后自動(dòng)回滾缩幸,事務(wù)
- 編寫測(cè)試方法德频,并用
- 官方文檔
(1) 引入maven場(chǎng)景啟動(dòng)器
pom.xml
-------
<!-- spring-boot-starter-test -->
<!-- 單元測(cè)試 場(chǎng)景啟動(dòng)器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
(2) 單元測(cè)試常用注解
- @Test 表示該方法是測(cè)試方法
- @ParameterizedTest 表示該方法是參數(shù)測(cè)試
- @RepeatedTest 表示方法可重復(fù)執(zhí)行
- @DisplayName 為測(cè)試類或測(cè)試方法設(shè)置展示名稱
- @BeforeEach 表示在每個(gè)單元測(cè)試前執(zhí)行
- @AfterEach
- @BeforeAll 在所有單元測(cè)試前執(zhí)行
- @AfterAll
- @Tag 單元測(cè)試類別
- @Disabled 表示測(cè)試類或測(cè)試方法不執(zhí)行
- @Timeout 測(cè)試方法超過定時(shí)后將返回錯(cuò)誤
- @ExtendWith 為測(cè)試類或測(cè)試方法提供擴(kuò)展類引用
-
@BeforeAll 和 @BeforeEach 的區(qū)別
@BeforEach在每個(gè)測(cè)試方法執(zhí)行前都會(huì)執(zhí)行壹置,一個(gè)測(cè)試類中可能有多個(gè)測(cè)試方法,因此@BeforeEach可能會(huì)多次執(zhí)行
@BeforeAll在所有測(cè)試方法執(zhí)行前執(zhí)行表谊,也就是說一個(gè)測(cè)試類中@BeforeAll只會(huì)執(zhí)行一次
src/test/java/com.example.demo/Junit5Test.java
-------
/**
* @SpringBootTest 是下面這些注解的復(fù)合注解
* @BootstrapWith(SpringBootTestContextBootstrapper.class)
* @ExtendWith(SpringExtension.class) => @ExtendWith
*/
@SpringBootTest
@DisplayName("JUnit5功能測(cè)試")
public class Junit5Test {
@Test
@DisplayName("測(cè)試方法1 @DisplayName 注解")
public void testDisplayName1() {
System.out.println("@DisplayName1");
}
@Test
@DisplayName("測(cè)試方法2 @DisplayName 注解")
public void testDisplayName2() {
System.out.println("@DisplayName2");
}
@Test
@Disabled // 禁用
@DisplayName("測(cè)試方法 @Disabled 注解")
public void testDisabled() {
System.out.println("@Disabled");
}
@Test
@RepeatedTest(5) // 重復(fù)測(cè)試5次
@DisplayName("測(cè)試方法 @RepeatedTest 注解")
public void testRepeatedTest() {
System.out.println("@RepeatedTest -----5");
}
@Test
@Timeout(value = 1000, unit = TimeUnit.MILLISECONDS) // 超出時(shí)間報(bào)錯(cuò)
public void testTimeout() throws InterruptedException {
Thread.sleep(1200);
System.out.println("@Timeout");
}
@BeforeEach
public void testBeforeEach() {
System.out.println("@BeforeEach");
}
@AfterEach
public void testAfterEach() {
System.out.println("@AfterEach");
}
@BeforeAll
static public void testBeforeAll() {
// 注意: @BeforeAll 和 @AfterAl 標(biāo)注的方法必須是 ( 靜態(tài)方法 )
System.out.println("@BeforeAll");
}
@AfterAll
static public void testAfterAll() {
System.out.println("@AfterAll");
}
}
(3) 斷言 assertions
- 所有的測(cè)試運(yùn)行結(jié)束后钞护,會(huì)有一個(gè)詳細(xì)的測(cè)試報(bào)告
(3-1) 簡(jiǎn)單斷言
- Assertions.assertEquals
- Assertions.assertSame
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;
@SpringBootTest
public class Junit5Test2 {
int cal(int i, int j) {
return i+j;
}
// (一) 斷言:如果前面的斷言失敗,后面的代碼就都不會(huì)執(zhí)行
@Test
@DisplayName("測(cè)試簡(jiǎn)單斷言 assertions")
void testSimpleAssertions() {
int cal = cal(2,3);
// (1) assertEquals => 斷言相等
assertEquals(5, cal, "兩個(gè)值不相等"); // ( expected期望值 和 actual真實(shí)計(jì)算的值 ) 是否相等
// (2) assertSame => 斷言是不是同一個(gè)對(duì)象
Object obj1 = new Object();
Object obj2 = obj1;
assertSame(obj1, obj2, "是不是同i個(gè)對(duì)象 => 不是同一個(gè)對(duì)象"); // 第三個(gè)參數(shù)表示 斷言失敗后會(huì)顯示的信息
}
}
(3-2) 數(shù)組斷言
- Assertions.assertArrayEquals
@Test
@DisplayName("測(cè)試數(shù)組斷言1 assertArrayEquals")
public void testAssertArrayEquals1() {
assertArrayEquals(new int[]{1, 2}, new int[]{1, 2}, "數(shù)據(jù)內(nèi)容不相等");
}
@Test
@DisplayName("測(cè)試數(shù)組斷言2 assertArrayEquals")
public void testAssertArrayEquals2() {
assertArrayEquals(new int[]{1, 2, 3}, new int[]{1, 2}, "數(shù)據(jù)內(nèi)容不相等");
}
(3-3) 組合斷言
- Assertion.assertAll
- 有三個(gè)assertion爆办,分別是a b c难咕,要顯現(xiàn)a斷言要在b和c都成功后才成功
@Test
@DisplayName("測(cè)試組合斷言 assertAll")
public void all() {
assertAll("test",
() -> assertTrue(true && true, "不是true"),
() -> assertEquals(1, 2, "不相等")
);
System.out.println("Assertion.assertAll只有斷言都成功,該log才會(huì)打印");
}
(四) Spring IOC 注入 ----- 注意是Spring不是SpringBoot
- 分為 (
手動(dòng)注入
) 和 (自動(dòng)注入
)
(1) 手動(dòng)注入
-
set方法注入
- 1.屬性字段提供set方法
- 2.在xml配置文件中通過 bean標(biāo)簽的子標(biāo)簽property標(biāo)簽指定屬性
- 3.這樣在向IOC添加組件時(shí)距辆,就會(huì)自動(dòng)的調(diào)用set注入到IOC中
-
構(gòu)造器注入 - 和set類似
(2) 自動(dòng)注入
@Resource
@Autowired
(2-1) 自動(dòng)注入環(huán)境配置
src/main/resources/bean.xml
-------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--手動(dòng)注入-->
<!-- id: 表示組件在容器中的名字余佃,隨便取 -->
<!-- class: 表示bean對(duì)象的全路徑 -->
<!-- property: 表示bean對(duì)象中的屬性 -->
<!-- name: 表示具體的屬性名 -->
<!-- ref: 表示容器中的組建名,即bean標(biāo)簽的中id屬性 -->
<!--<bean id="userService" class="org.example.UserService">-->
<!--property name="userBean" ref="userBean"/>-->
<!--</bean>-->
<!--<bean id="userBean" class="org.example.UserBean"></bean>-->
<!--自動(dòng)注入-->
<!--1. 自動(dòng)注入配置需要添加 beans => xmlns:context="http://www.springframework.org/schema/context" -->
<!--2. 自動(dòng)注入配置需要添加 beans => xsi:schemaLocation也要添加一些內(nèi)容跨算,如上 -->
<!--3. 自動(dòng)注入配置需要添加 <context:annotation-config/> 如下 -->
<!--4. 注意自動(dòng)注入和手動(dòng)注入xml配置除了123還有一個(gè)區(qū)別:UserService中要使用userBean爆土,自動(dòng)注入不需要使用 property -->
<context:annotation-config/>
<bean id="userService" class="org.example.UserService"></bean>
<bean id="userBean" class="org.example.UserBean"></bean>
</beans>
(2-2) @Resource 注解的使用
/**
* 手動(dòng)注入
* set 方法注入
* 1. 屬性字段提供set方法
* 2. 在xml配置文件中通過 bean標(biāo)簽的子標(biāo)簽property標(biāo)簽指定屬性
* 3. 這樣在向IOC添加組件時(shí),就會(huì)自動(dòng)的調(diào)用set注入到IOC中
*/
/**
* 自動(dòng)注入
*
* @Resource 可以實(shí)現(xiàn)自動(dòng)注入诸蚕,通過反射類實(shí)現(xiàn)
* 1. 默認(rèn)通過 ( 屬性字段名稱 ) 來查找對(duì)應(yīng)的 ( bean對(duì)象 ) => ( 屬性名 ) 和 ( bean標(biāo)簽 id ) 保持一致
* 2. 如果 ( 屬性名 ) 和 ( bean標(biāo)簽id ) 不一致步势,則會(huì)通過 ( bean標(biāo)簽的class ) 去查找
* 3. 可以提供set,也可以不提供set
* 4. 可以標(biāo)注在 ( 屬性上 ) 或者 ( set方法 ) 上
* 5. 可以設(shè)置name屬性背犯,但需要和bean標(biāo)簽的id保持一致坏瘩, @Resource(name="userBean")
* 6. 6.1 當(dāng)注入接口時(shí),如果接口只有一個(gè)實(shí)現(xiàn)類漠魏,則正常實(shí)例化
* 6.2 如果接口有多個(gè)實(shí)現(xiàn)類倔矾,需要通過參數(shù)name來指定具體的實(shí)現(xiàn)類,參數(shù)就是xml配置文件中bean標(biāo)簽的id
*/
public class UserService {
// 手動(dòng)實(shí)例話
// UserBean userBean = new UserBean();
// JavaBean對(duì)象
@Resource(name = "userBean")
private UserBean userBean;
@Resource(name = "userImplements")
// 該接口有兩個(gè)實(shí)現(xiàn)類 ( UserImplements ) 和 ( UserImplements2)
// 此時(shí)需要通過 @Resource(name = "xml配置文件中bean標(biāo)簽的id")
private UserInterface userInterface;
public void test() {
userBean.getName2();
userInterface.getName3();
}
}
(2-3) @Autowired + @Qualifier
-
@AutoWired
默認(rèn)是按照xml中的bean標(biāo)簽的class
屬性去查找的 - 屬性字段可以提供set方法柱锹,也可以不提供set方法
- @Autowire可以寫在set方法上哪自,也可以寫在屬性上
- 如果想要通過指定名稱查找bean對(duì)象,需要結(jié)合
@Qualifier
注解 -
@Qualifier(value = "autowiredBean2")
中的value的值和xml中bean標(biāo)簽的id
屬性一一對(duì)應(yīng)
src/main/resources/bean.xml
-------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--手動(dòng)注入-->
<!-- id: 表示組件在容器中的名字奕纫,隨便取 -->
<!-- class: 表示bean對(duì)象的全路徑 -->
<!-- property: 表示bean對(duì)象中的屬性 -->
<!-- name: 表示具體的屬性名 -->
<!-- ref: 表示容器中的組建名提陶,即bean標(biāo)簽的中id屬性 -->
<!--<bean id="userService" class="org.example.UserService">-->
<!--property name="userBean" ref="userBean"/>-->
<!--</bean>-->
<!--<bean id="userBean" class="org.example.UserBean"></bean>-->
<!--自動(dòng)注入-->
<!--1. 自動(dòng)注入配置需要添加 beans => xmlns:context="http://www.springframework.org/schema/context" -->
<!--2. 自動(dòng)注入配置需要添加 beans => xsi:schemaLocation也要添加一些內(nèi)容,如上 -->
<!--3. 自動(dòng)注入配置需要添加 <context:annotation-config/> 如下 -->
<!--4. 注意自動(dòng)注入和手動(dòng)注入xml配置除了123還有一個(gè)區(qū)別:UserService中要使用userBean匹层,自動(dòng)注入不需要使用 property -->
<context:annotation-config/>
<bean id="userService" class="org.example.UserService"></bean>
<bean id="userBean" class="org.example.UserBean"></bean>
<bean id="userImplements" class="org.example.UserImplements"></bean>
<bean id="userImplements2" class="org.example.UserImplements2"></bean>
<bean id="autowiredBean2" class="org.example.AutowiredBean"></bean>
</beans>
src/main/java/org.example/UserService.java
-------
/**
* 手動(dòng)注入
* set 方法注入
* 1. 屬性字段提供set方法
* 2. 在xml配置文件中通過 bean標(biāo)簽的子標(biāo)簽property標(biāo)簽指定屬性
* 3. 這樣在向IOC添加組件時(shí)隙笆,就會(huì)自動(dòng)的調(diào)用set注入到IOC中
*/
/**
* 自動(dòng)注入
*
* @Resource 可以實(shí)現(xiàn)自動(dòng)注入锌蓄,通過反射類實(shí)現(xiàn)
* 1. 默認(rèn)通過 ( 屬性字段名稱 ) 來查找對(duì)應(yīng)的 ( bean對(duì)象 ) => ( 屬性名 ) 和 ( bean標(biāo)簽 id ) 保持一致
* 2. 如果 ( 屬性名 ) 和 ( bean標(biāo)簽id ) 不一致,則會(huì)通過 ( bean標(biāo)簽的class ) 去查找
* 3. 可以提供set撑柔,也可以不提供set
* 4. 可以標(biāo)注在 ( 屬性上 ) 或者 ( set方法 ) 上
* 5. 可以設(shè)置name屬性瘸爽,但需要和bean標(biāo)簽的id保持一致, @Resource(name="userBean")
* 6. 6.1 當(dāng)注入接口時(shí)铅忿,如果接口只有一個(gè)實(shí)現(xiàn)類剪决,則正常實(shí)例化
* 6.2 如果接口有多個(gè)實(shí)現(xiàn)類,需要通過參數(shù)name來指定具體的實(shí)現(xiàn)類檀训,參數(shù)就是xml配置文件中bean標(biāo)簽的id
*/
/**
* 自動(dòng)注入
*
* @Autowired 可以實(shí)現(xiàn)自動(dòng)注入柑潦,通過反射類實(shí)現(xiàn)
* 1. @Autowired注解模式是通過 xml配置文件中的bean標(biāo)簽的class屬性去查找bean對(duì)象的,與屬性字段沒有關(guān)系
* 2. 可以提供set峻凫,也可以不提供set
* 3. 可以標(biāo)注在 ( 屬性上 ) 或者 ( set方法 ) 上
* 4. 如果想要通過指定名稱查找bean對(duì)象渗鬼,需要結(jié)合 @Qualifier注解
*/
public class UserService {
// 手動(dòng)實(shí)例話
// UserBean userBean = new UserBean();
// JavaBean對(duì)象
@Resource(name = "userBean")
private UserBean userBean;
@Resource(name = "userImplements")
// 該接口有兩個(gè)實(shí)現(xiàn)類 ( UserImplements ) 和 ( UserImplements2)
// 此時(shí)需要通過 @Resource(name = "xml配置文件中bean標(biāo)簽的id")
private UserInterface userInterface;
@Qualifier(value = "autowiredBean2")
@Autowired
AutowiredBean autowiredBean;
public void test() {
userBean.getName2();
userInterface.getName3();
autowiredBean.testAutowired();
}
}
項(xiàng)目源碼
資料
- Swagger配置教程 https://juejin.cn/post/6844903589031182344
- Swagger注解1 https://blog.csdn.net/ThinkWon/article/details/107477801
- Swagger注解2 https://zhuanlan.zhihu.com/p/49996147