手寫Spring組合自定義的註釋

 

在本文中,我們將介紹一個非常有用的Spring功能,該功能允許我們基於一個或多個Spring註釋創建自己的註釋。

package com.mars.framework.annotation;
import java.lang.annotation.*;
/**
* @author 
* @since 2019/11/6 12:38
*/
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MarsRequestParam {
String value() default "";
}

假設我們有一組經常一起使用的Spring註釋。一個常見的示例是@Service和@Transactional的組合:

@Service

@Transactional(rollbackFor = Exception.class, timeout = 5)

public class UserService {

...

}

如果希望在所有服務類上用這兩個註釋,現在不必一遍又一遍地重複註釋了,我們可以創建一個新註釋包含這兩個註釋。創建我們自己的註釋非常簡單,如下所示:

@Service

@Transactional(rollbackFor = Exception.class, timeout = 5)

@Retention(RetentionPolicy.RUNTIME)

public @interface MyService {}

註釋是使用@interface關鍵字定義的(而不是類或接口)。標準Java註釋@Retention用於指示註釋應在運行時可處理。我們還將兩個Spring註釋都添加到了註釋中。

現在,我們可以使用自己的@MyService批註來批註我們的服務:

@MyService

public class UserService {

...

}

Spring現在檢測到@MyService被@Service和@Transactional註釋,並提供與前面的示例UserService相同的行爲。

請注意,這是Spring註釋處理方式的功能,而不是一般的Java功能。

自定義註釋可以在各種情況下使用,以提高代碼的可讀性。這是另外兩個可能派上用場的例子。

也許我們在代碼的各個位置都需要一個屬性值。通常使用Spring的@Value註釋注入屬性:

// injects configuration properties my.api.key

@Value("${my.api.key}")

private String apiKey;

在這種情況下,我們可以將屬性表達式從代碼中移到單獨的註釋中:

@Value("${my.api.key}")

@Retention(RetentionPolicy.RUNTIME)

public @interface ApiKey {}

現在,在我們的代碼中,我們可以使用@ApiKey而不是在各處重複屬性表達式:

@ApiKey

private String apiKey;

另一個例子是集成測試。在測試中,通常使用各種Spring批註來定義測試設置。可以使用自定義註釋將這些註釋分組在一起。例如,我們可以創建一個@MockMvcTest註釋,該註釋定義模擬mvc測試的Spring設置:

@SpringBootTest

@AutoConfigureMockMvc(secure = false)

@TestPropertySource(locations = "classpath:test.properties")

@ExtendWith(SpringExtension.class)

@Retention(RetentionPolicy.RUNTIME)

public @interface MockMvcTest {}

現在,我們的測試定義看起來更加清晰。我們只需要添加@MockMvcTest即可獲得完整的測試設置:

@MockMvcTest

public class MyTest {

...

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章