乾貨|app自動化測試之Appium 原理 與 JsonWP 協議分析
阿新 • • 發佈:2022-05-25
SpringBoot學習筆記
SpringBOOt概念
SpringBoot提供了一種快速使用Spring的方式,基於約定大於配置的思想,讓開發人員專注於邏輯業務,從而提高開發效率
SpringBoot功能
- 自動配置
SpringBoot自動配置是一個執行時(應用啟動時)的過程,自動決定Spring配置應該用哪個。 - 起步依賴
起步依賴本質上是一個maven專案物件模型(Project Object Model, POM),定義了對其他庫的傳遞依賴,將具備某種功能的座標打包到一起,並提供一些預設的功能 - 輔助功能
提供了一些大型專案中常見的非功能特性,如嵌入式伺服器、安全、指標、健康檢測、外部配置等
SpringBoot並不是對Spring功能上的增強,而是提供一種快速使用Spring的方式
SpringBoot快速入門
需求
搭建SpringBoot工程,定義HelloChontroller.hello()方法,返回“Hello SpringBoot”
步驟
- 建立Meaven專案
- 匯入SpringBoot起步依賴
- 定義Controller
- 編寫引導類
- 啟動測試
小節
- SpringBoot在建立專案時,使用jar打包
- SpringBoot的引導類是整個專案的入口,執行main方法即可啟動
- 使用SpringBoot和Spring構建的專案,業務程式碼方式完全一樣
SpringBoot配置
配置檔案分類
SpringBoot是基於約定的,很多配置有預設值,可以使用application.properties和application.yaml(yml)進行自定義配置
- properties:
server.port=8080
- yml:
server:
port: 8080
小節
- SpringBoot提供了2種配置檔案型別:properties和yml/yaml
- 配置檔名稱必須是application
- 在同一級目錄下的優先順序順序:properties>yml>yaml
yaml
yaml是一種能夠直觀的被電腦識別的資料序列化格式,並且更容易被人類閱讀,其檔案的副檔名可以使用.yml或者.yaml
- yaml格式
server:
port: 8080
address: 127.0.0.1
簡潔,以資料為核心
yaml基本語法
- 大小寫敏感
- 資料值前必須含有空格作為分隔符
- 使用縮排表示層級關係
- 縮排不允許使用Tab鍵,只允許使用空格
- 縮排的空格數目不重要,只要相同層級的元素左側對齊即可
- #表示註釋
yaml資料格式
- 物件(map):鍵值對的集合
person:
name: zhangsan
#行內寫法
person: {name: zhangsan}
- 陣列
address:
- beijing
- shanghai
# 行內寫法
address: [beijing,shanghai]
- 純量:單個值,不可再分
msg1: 'hello \n world' # 單引號忽略轉義字元
msg2: "hello \n world" # 雙引號識別轉義字元
yaml引數引用
name: zhangsan
person:
name: ${name}
讀取配置內容
- @value
@Value("${name}")
private String name;
- Enviroment
@Autowired
private Environment environment;
System.out.println(environment.getProperty("person.name"));
- @ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "person")
public class Person{}
profile
SpringBoot開發的應用通常會被安裝到不同的環境(開發、測試、生產),其中資料庫地址、伺服器埠等等配置需要在打包時進行修改。profile能夠對配置環境進行動態切換。
profile配置方式
- 多profile檔案方式(建立多個profile檔案如application-dev.properties/application-pro.properties/application-test.properties)
- yml多文件方式(利用
---
將文件分割)
---
server:
port: 8083
spring:
config:
activate:
on-profile: test
---
profile啟用方式
- 配置檔案
spring:
profiles:
active: dev #dev/pro/test
- 虛擬機器引數:
-Dspring.profiles.active=test
- 命令列引數:
--spring.profiles.active=pro
內部配置載入順序
SpringBoot程式啟動時,會從以下為主載入配置檔案:
-
file:./config/
: 當前目錄下的/config目錄下 -
file:./
: 當前專案的根目錄 -
classpath:/config/
: classpath的/config目錄 -
classpa:/
: classpath的根目錄
載入順序為上文的排列熟悉怒,高優先順序配置的屬性會生效
外部配置載入順序
SpringBoot整合其他框架
整合Junit
- 引入start-test依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- 新增測試註解
- @RunWith(SpringRunner.class)
- @SpringBootTest(classes=啟動類.class)
@SpringBootTest(classes = SpringBootStudyApplication.class)
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void test(){
userService.add();
}
}
整合redis
- 引入redis起步依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置redis屬性
spring:
redis:
host:127.0.0.1
port:6379
- 注入RedisTemplate模板
@Autowired
private RedisTemplate redistemplate;
整合mybatis
- 引入mybatis起步依賴,新增mysql驅動
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- 編寫DataSource和MyBatis相關配置
# datasource
spring:
datasource:
url: jdbc:mysql:///test_db
username: root
password:
driver-class-name: com.mysql.cj.jdbc.Driver
# mybatis
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
type-aliases-package: com.rsk.springboot1.entity
- 註解開發
@Mapper
public interface UserMapper {
public List<User> findAll();
}
@Autowired
private UserMapper userMapper;
SpringBoot原理分析
自動配置機制
Condition
Condition是Spring4.0增加的條件判斷功能,可實現選擇性的Bean建立,可自定義擴充套件
- 自定義擴充套件步驟:
- 實現Condition介面(MyCondition.class)
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(ConditionOnClass.class.getName());
//獲取註解傳入的元資料中的鍵值對map
String[] value = (String[]) annotationAttributes.get("value");
//自定義條件判斷函式
if (value[0].equals("0")){
return true;
}
return false;
}
}
- 自定義註解(ConditionOnClass)
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyCondition.class)
public @interface ConditionOnClass {
String[] value();
}
- Spring配置類中呼叫註解(UserConfig.class)
@Configuration
public class UserConfig {
@Bean
@ConditionOnClass(value = "1")
public User user(){
return new User();
}
}
- SpringBoot提供的常用條件註解:
- ConditionOnProperty:判斷配置檔案是否有對應屬性和值後才初始化Bean
- ConditionOnClass:判斷環境中是否有對應位元組碼檔案才初始化Bean
- ConditionOnMissingBean:判斷環境中沒有對應的Bean才初始化Bean
@Enable*註解
@Enable*註解用於動態啟動某些功能,底層原理是使用@Import註解匯入一些配置類,實現Bean的動態載入
@Import註解
@Enable*底層依賴@Import註解匯入所需要的類,使用@Import註解匯入的類會被Spring容器載入到IOC容器中,以下有4種用法:
- 匯入Bean
- 匯入配置類
- 匯入ImportSelector實現類,一般用於載入配置檔案中的類
- 匯入ImportBeanDefinitionRegistrar實現類
@EnableAutoConfiguration註解
- @EnableAutoConfiguration註解內部使用
@Import({AutoConfigurationImportSelector.class})
來載入配置類 - 配置檔案位置:\META-INF\spring.factories,該配置檔案中定義了大量的配置類,當SpringBoot啟動時會自動載入這些配置類,初始化Bean
- 不是所有Bean都會被初始化,在配置類中使用@Configuration註解來載入滿足條件的Bean
自定義starter
需求:(自定義redis-starter,要求匯入該座標時,SpringBoot能夠自動建立Bean)
步驟:
- 建立redis-spring-boot-autoconfigure模組
- 建立redis-spring-boot-starter模組,依賴前者
- 在redis-spring-boot-autoconfigure中初始化Jedis的Bean,並定義META-INF/spring.factories檔案
- 在測試模組中引入自定義的redis-starter依賴,測試獲取Jedis的Bean,操作redis