1. 程式人生 > 其它 >Conditional相關注解 assert斷言的使用

Conditional相關注解 assert斷言的使用

技術標籤:雜記java

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配置的字首

name 屬性是從application.properties配置檔案中讀取屬性值
havingValue 配置讀取的屬性值跟havingValue做比較,如果一樣則返回true;否則返回false。
如果返回值為false,則該configuration不生效;為true則生效
matchIfMissing = true表示如果沒有在application.properties設定該屬性,則預設為條件符合

  1. rest:
  2. auth-open: true
  1. 注意有點要注意的,就是一旦使用@Autowired那就預設代表當前Bean一定是已經存在的,如果為null,會報錯。所以這裡要修改下

@Autowired(required=false) //required=false 的意思就是允許當前的Bean物件為null。

參見:@ConditionalOnClass註解分析

基於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初步使用:斷言開啟、斷言使用

說明

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