2020/3/8
認(rèn)識(shí)SpringBoot
SpringBoot的優(yōu)點(diǎn)
- 創(chuàng)建獨(dú)立的Spring應(yīng)用程序
- 嵌入TomCat,無需部署WAR文件
- 無代碼生成,無xml配置要求
StringBoot 的 Hello World
pom文件依賴配置
<?xml version="1.0" encoding="UTF-8"?>
<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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>com.first</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- spring Boot 依賴-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<!-- web場(chǎng)景依賴啟動(dòng)器,引入springMVC的相關(guān)依賴-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
- spring-boot-starter-parent作用
它提供依賴管理(類比Android的話窃蹋,作用類似于ben-manes.versions插件鳄哭?破镰?)引入之后来破,聲明其管理范圍內(nèi)的依賴時(shí)不在需要填版本了
-
spring-boot-starter-web作用
- spring-boot-starter-web:
默認(rèn)使用嵌套式的TomCat作為Web容器對(duì)開開發(fā)HTTP服務(wù)
- spring-boot-starter:
SpringBoot場(chǎng)景啟動(dòng)器,幫我們導(dǎo)入了web模塊支出運(yùn)行的組件
Spring Boot將所有的功能場(chǎng)景都抽取出來货岭,做成一個(gè)個(gè)的starters(啟動(dòng)器)路操,只需要在項(xiàng)目里面 引入這些starter相關(guān)場(chǎng)景的所有依賴都會(huì)導(dǎo)入進(jìn)來。要用什么功能就導(dǎo)入什么場(chǎng)景的啟動(dòng)器
Application&Controller
//Application
/**標(biāo)記為主程序啟動(dòng)類**/
@SpringBootApplication
public class ManualChaptApplication {
public static void main(String[] args) {
SpringApplication.run(ManualChaptApplication.class);
}
}
/**
*Controller
* 該注解為組合注解
* @ResponseBody+Controller
*/
@RestController
public class HelloController {
/**
*GetMapping:相當(dāng)于@RequestMapping(value=”/hello“千贯,RequestMethod.Get)
*/
@GetMapping("/hello")
public String hello() {
return "hello World";
}
}
注解的意思:
- @SpringBootApplication:
標(biāo)注在某個(gè)類上屯仗,說明此類為SpringBoot的主配置類,SpringBoot運(yùn)行此類的Main方法來啟動(dòng)StringBoot應(yīng)用搔谴,會(huì)將主配置類(@SpringBootApplication標(biāo)注的類)的所在包及下面所有子包里面的所有組件掃描到 Spring容器魁袜; - @RestController
此注解為組合注解,意味著這個(gè)controller上的所有方法上都加了@ResponseBody
單元測(cè)試
@SpringBootTest
class DemoApplicationTests {
@Autowired
private HelloController helloController;
@Test
void contextLoads() {
String hello = helloController.hello();
System.out.println("print: " + hello);
}
}
注解的意思:
- @SpringBootTest:
標(biāo)記springBoot單元測(cè)試敦第,并加載項(xiàng)目的applicationContext的上下文環(huán)境 - @Autowired
它可以對(duì)類成員變量峰弹、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作芜果。
SpringBoot執(zhí)行流程
- 開始
- 初始化Spring Application的實(shí)例
- 判斷當(dāng)前項(xiàng)目的類型
- 應(yīng)用的初始化設(shè)置
- 應(yīng)用的監(jiān)聽設(shè)置
- 設(shè)置項(xiàng)目的啟動(dòng)類
- 初始化Spring Boot項(xiàng)目的啟動(dòng)
- 獲取并運(yùn)行監(jiān)聽器
- 準(zhǔn)備項(xiàng)目運(yùn)行環(huán)境
- 應(yīng)用上下文裝配
- 啟動(dòng)上下文
- 運(yùn)行自定義執(zhí)行器
- 持續(xù)運(yùn)行上下文
- 結(jié)束
2020/3/9
使用kotlin的注意事項(xiàng)
- 因?yàn)榈讓訂栴}鞠呈,所以部分類型的聲明需要注意對(duì)Java的兼容
@JvmOverloads
@GetMapping("/spica")
fun spica() = "spica 27"
@GetMapping("/spica/{name}")
fun spica(
@PathVariable(name = "name")
name: String? = "spica") = "<h1>name=${name.toString()}</h1>"
以下是今天碰見的問題:
- 重寫方法加@JvmOverloads注解
- 類型聲明要加?允許為null,如上直接使用String類型會(huì)報(bào)java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
單元測(cè)試·JUnit4與JUnit 5對(duì)比
常用注解及其作用對(duì)比:
JUnit4 | JUnit5 | 說明 |
---|---|---|
@Test | @Test | 表示該方法是一個(gè)測(cè)試方法右钾。JUnit5與JUnit 4的@Test注解不同的是蚁吝,它沒有聲明任何屬性旱爆,因?yàn)镴Unit Jupiter中的測(cè)試擴(kuò)展是基于它們自己的專用注解來完成的。這樣的方法會(huì)被繼承灭将,除非它們被覆蓋 |
@BeforeClass | @BeforeAll | 表示使用了該注解的方法應(yīng)該在當(dāng)前類中所有使用了@Test @RepeatedTest疼鸟、@ParameterizedTest或者@TestFactory注解的方法之前 執(zhí)行; |
@AfterClass | @AfterAll | 表示使用了該注解的方法應(yīng)該在當(dāng)前類中所有使用了@Test庙曙、@RepeatedTest、@ParameterizedTest或者@TestFactory注解的方法之后執(zhí)行浩淘; |
@Before | @BeforeEach | 表示使用了該注解的方法應(yīng)該在當(dāng)前類中每一個(gè)使用了@Test捌朴、@RepeatedTest、@ParameterizedTest或者@TestFactory注解的方法之前 執(zhí)行 |
@After | @AfterEach | 表示使用了該注解的方法應(yīng)該在當(dāng)前類中每一個(gè)使用了@Test张抄、@RepeatedTest砂蔽、@ParameterizedTest或者@TestFactory注解的方法之后 執(zhí)行 |
@Ignore | @Disabled | 用于禁用一個(gè)測(cè)試類或測(cè)試方法 |
@Category | @Tag | 用于聲明過濾測(cè)試的tags,該注解可以用在方法或類上署惯;類似于TesgNG的測(cè)試組或JUnit 4的分類左驾。 |
@Parameters | @ParameterizedTest | 表示該方法是一個(gè)參數(shù)化測(cè)試 |
@RunWith | @ExtendWith | @Runwith就是放在測(cè)試類名之前,用來確定這個(gè)類怎么運(yùn)行的 |
@Rule | @ExtendWith | Rule是一組實(shí)現(xiàn)了TestRule接口的共享類极谊,提供了驗(yàn)證诡右、監(jiān)視TestCase和外部資源管理等能力 |
@ClassRule | @ExtendWith | @ClassRule用于測(cè)試類中的靜態(tài)變量,必須是TestRule接口的實(shí)例轻猖,且訪問修飾符必須為public帆吻。 |
Maven的格式
- 依賴配置
- groupId:標(biāo)識(shí)符
- artifactId :?jiǎn)为?dú)的項(xiàng)目標(biāo)識(shí)符
- version:版本號(hào)
- scope:任務(wù)的類路徑及其如何限制依賴關(guān)系的傳遞性
- exclusions:包含一個(gè)或多個(gè)排除元素,每個(gè)排除元素都包含一個(gè)表示要排除的依賴關(guān)系的 groupId 和 artifactId咙边。與可選項(xiàng)不同猜煮,可能或可能不會(huì)安裝和使用,排除主動(dòng)從依賴關(guān)系樹中刪除自己败许。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.0</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
...
</dependencies>
- build配置
- plugins 插件
- plugin
- extensions:是否加載此插件的擴(kuò)展名王带。
- dependencies :插件本身需要的依賴
- plugin
- plugins 插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
... ...
</plugins>
</build>
配置文件
- properties
- yaml
- 基本格式要求:
- YAML大小寫敏感;
- 使用縮進(jìn)代表層級(jí)關(guān)系
- 縮進(jìn)只能使用空格市殷,不能使用TAB愕撰,不要求空格個(gè)數(shù),只需要相同層級(jí)左對(duì)齊(一般2個(gè)或4個(gè)空格)
- 值的寫法
- 普通的值:k:v
- 對(duì)象被丧,Map:鍵值對(duì)
- k: v:在下一行寫對(duì)象的屬性和值的關(guān)系盟戏;注意縮進(jìn)
- 行內(nèi)寫法
man:
name: jelly
age: 20
man: {name: jelly,age: 18}
,
3. 數(shù)組(List Set)
一個(gè)短橫代表一個(gè)數(shù)組項(xiàng)
people:
- chengkeyu
- zhaoqian
- guzhaoyuan
- yangweizhi
行內(nèi)寫法
people:[chengkeyu,zhaoqian,guzhaoyuan,yangweizhi]
隨機(jī)值的使用
${random.value}
隨機(jī)生成一個(gè)32位的字符串,如:b21d56d2f10d74f84608dfff01b25552
${random.int}
隨機(jī)生成一個(gè)int范圍的隨機(jī)數(shù)甥桂,如:-386223791
${random.long}
隨機(jī)生成一個(gè)long范圍的隨機(jī)數(shù)柿究,如:2404587442488649534
${random.int(10)}
隨機(jī)生一個(gè)[0,10]之間的隨機(jī)數(shù),如:8
${random.int[1024,65536]}
隨機(jī)生成一個(gè)[1024,65536]之間的隨機(jī)數(shù)黄选,如:63856
${user.userName}
獲取配置文件中已經(jīng)配置好的屬性值蝇摸,不存在時(shí)直接返回整個(gè)“${user.userName}”
${user.width:hello}
獲取配置文件中已經(jīng)配置好的屬性值婶肩,不存在時(shí)則用"hello"返回
示例
user:
lastName: hello
age: 18
boss: false
birth: 2017/12/12
maps: {qq: 1000 , mobile: 13811002233}
lists: []
dog:
name: jelly
age: 18
address: 上海${random.value}
person.last-name=hello${user.lastName}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.aa=v1
person.maps.bb=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15
指定bean對(duì)象(Java)
// 指定配置文件
@PropertySource(value = {"classpath:application.yaml"})
//放入容器
@Component
//綁定
@ConfigurationProperties(prefix = "user")
public class User {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Dog dog;
get...
seting..
}
指定bean對(duì)象(Kotlin)
@PropertySource(value = ["classpath:application.yaml"])
@Component
@ConfigurationProperties(prefix = "user")
class User {
var lastName: String? = null
var age: Int? = null
var isBoss = false
var birth: Date? = null
var maps: Map<String, Any>? = null
var lists: List<Any>? = null
var dog: Dog? = null
}
需要注意注解格式變化和添加?允許為空
Profile環(huán)境切換
多profile
我們?cè)谥髋渲梦募帉懙臅r(shí)候貌夕,文件名可以是 application-{profile}.properties/yml 默認(rèn)使用application.properties的配置律歼;
例如:
application-dev.properties:開發(fā)環(huán)境 application-test.properties:測(cè)試環(huán)境 application-prod.properties:生產(chǎn)環(huán)境
激活指定profile
- 在配置文件中指定 spring.profiles.active=dev
- 命令行: java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;可以直接在測(cè)試的時(shí)候啡专,配置傳入命令行參數(shù)
- 虛擬機(jī)參數(shù)险毁; -Dspring.profiles.active=dev
2020/2/15
Bean:在計(jì)算機(jī)英語中有可重用組件的意思
JavaBean>=實(shí)體類
JavaBean:用java語言編寫的可重用組件