用Spring組合自定義的註釋 - mscharhag

banq發表於2020-03-01

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

假設我們有一組經常一起使用的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 {
    ...
}

 

相關文章