2016-04-26 55 views
1

我在Spring框架中看到了註釋。我想知道我怎樣才能做出註釋。我們使用了許多註釋(例如@Controller,@ Autowired,@RequestMapping等)。使用這種註釋,我們不用反射代碼。但是我找不到反省的註釋教程。在所有的教程中,作者通過反思來展示註釋。如何在Spring中進行註釋?

如果我不使用反射,我不能做註釋?

+1

問題是一個註釋做什麼? (您的問題可能是X/Y問題) – 2016-04-26 06:11:42

+0

@RC。感謝您的關注。當我使用spring的註釋時,我不需要使用反射。但是當我使用客戶的註釋時,我必須使用反思。有什麼不同? –

+2

@blank_popup因爲註釋是由Spring開發人員完成的,所以他們還創建了處理註釋的代碼(通過反射或字節碼編織)。例如'@ Transactional'註解由'org.springframework.transaction.interceptor.TransactionInterceptor'處理。 – Kayaman

回答

2

當然,您可以使註釋而不使用反射。 你只是無法將它用於任何事情。一個註釋本身沒有邏輯,它只是一個依賴於代碼的標記,它會看到註釋,然後執行一些操作。演示這種代碼的最簡單方法是使用反射。

+0

註釋可以有邏輯。 –

+0

@PeterRader謹慎地闡述這一點?向我展示一個自定義註釋,它將執行某些操作,而不用其他代碼使用反射來檢查註釋是否存在。 – Kayaman

+0

對不起沒有代碼,我在火車上用方便的方式回答。那麼你可以繼承一個枚舉併爲一個用作默認值的值創建一個構造函數。在構造函數中你寫'System.out.println(「我存在」)' –

0

您可以從JDK5和更好的版本編寫註釋。但只有反射(x和靜態範圍)可以讀取註釋!

註解是xdoclet標籤的替代品,它們是Javadoc的一部分,所以你的問題就像「我可以寫文檔」 - 是的。

有一個關於內存的笑話,只能寫但不能被讀取,WOM(write-only-memory)

如果不喜歡使用反射,第三方庫可以通過反射爲您讀取註釋。

你可以做的是註釋你的註釋。

例子:

@Autowired(required=false) 
private MyService service; 

可以通過自定義的註釋被縮短這樣的:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
@Autowired(required=false) 
public @interface MyOptional { 
} 

現在,您可以更改代碼以

@MyOptional 
private MyService service; 

你看,你可以使用不帶反射代碼的自定義註釋。

+0

謝謝你的選擇。我因爲你而發現了很多事情! –