Conditional相關注解 assert斷言的使用
Conditional相關注解
@ConditionalOnClass(KafkaTemplate.class)
就是說只有在classpath下能找到kafkaTemplate類才會構建這個bean。
這句程式碼可以標註在類上面,表示該類下面的所有@Bean都會啟用配置,也可以標註在方法上面,只是對該方法啟用配置。
@ConditionalOnBean(僅僅在當前上下文中存在某個物件時,才會例項化一個Bean)
@ConditionalOnClass(某個class位於類路徑上,才會例項化一個Bean)
@ConditionalOnExpression(當表示式為true的時候,才會例項化一個Bean)
@ConditionalOnMissingBean(僅僅在當前上下文中不存在某個物件時,才會例項化一個Bean)
@ConditionalOnMissingClass(某個class類路徑上不存在的時候,才會例項化一個Bean)
@ConditionalOnNotWebApplication(不是web應用)
ConditionalOnProperty
@ConditionalOnProperty(prefix = “rest”, name = “auth-open”, havingValue = “true”, matchIfMissing = true)
prefix application.properties配置的字首
havingValue 配置讀取的屬性值跟havingValue做比較,如果一樣則返回true;否則返回false。
如果返回值為false,則該configuration不生效;為true則生效
matchIfMissing = true表示如果沒有在application.properties設定該屬性,則預設為條件符合
- rest:
- auth-open: true
注意
有點要注意的,就是一旦使用@Autowired
那就預設代表當前Bean一定是已經存在的,如果為null,會報錯。所以這裡要修改下@Autowired(required=false) //required=false 的意思就是允許當前的Bean物件為null。
基於Spring Data的AuditorAware審計功能的示例程式碼
websocket啟用
spring boot在執行測試類Error creating bean with name ‘serverEndpointExporter’ defined…問題解決方案
解決的方式有兩種:
第一種方式:去掉測試類的**@RunWith(SpringRunner.class),**去掉即可,但是這種方式會有侷限,比如下方你要@Authwired一個類的時候會報錯,我這裡不可以,根據你的程式碼情況。
第二種方式:在SpringBootTest後加上:**webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,**意思是建立Web應用程式上下文(基於響應或基於servlet),原因:websocket是需要依賴tomcat等容器的啟動。所以在測試過程中我們要真正的啟動一個tomcat作為容器。
斷言使用
說明
java斷言assert是jdk1.4引入的。
jvm斷言預設是關閉的。
斷言可以區域性開啟的,如:父類禁止斷言,而子類開啟斷言,所以一般說“斷言不具有繼承性”。
斷言只適用複雜的調式過程。
斷言一般用於程式執行結構的判斷,千萬不要讓斷言處理業務流程。
eclipse 中開啟和關閉斷言
選擇選單:run --> run Configurations
開啟斷言:-ea
關閉斷言:-da,或者刪除-ea
/**
* 斷言的使用方法一
*/
public static void useAssertExt1() {
boolean isOk = 1 > 2;
assert isOk;
System.out.println("程式正常");
}
#顯然isOk為false,所以丟擲AssertionError
/**
* 斷言的第一個例子
*/
public static void useAssertExt2() {
boolean isOk = 1 > 2;
try {
assert isOk : "程式錯誤";
System.out.println("程式正常");
} catch (AssertionError err) {
System.out.println(err.getMessage());
}
}
assert後面跟個冒號表示式。如果冒煙前為true,則冒號後面的被忽略,否則丟擲AssertionError,錯誤內容為冒號後面的內容。
按F3檢視原始碼,如下,可以看到AssertionError是繼承自Error,而不是Exception,所以catch部分用Exception是不能捕捉到AssertionError資訊的。
有關斷言的更多引數:
-ea java -ea 開啟所有使用者類的assertion
-da java -da 關閉所有使用者類的assertion
-ea: java -ea:MyClass1 開啟MyClass1的assertion
-da: java -da: MyClass1 關閉MyClass1的assertion
-ea: java -ea:pkg1 開啟pkg1包的assertion
-da: java -da:pkg1 關閉pkg1包的assertion
-ea:… java -ea:… 開啟預設包(無名包)的assertion
-da:… java -da:… 關閉預設包(無名包)的assertion
-ea:… java -ea:pkg1… 開啟pkg1包和其子包的assertion
-da:… java -da:pkg1… 關閉pkg1包和其子包的assertion
-esa java -esa 開啟系統類的assertion
-dsa java -dsa 關閉系統類的assertion
綜合使用 java -dsa:MyClass1:pkg1 關閉MyClass1和pkg1包的assertion