在我的Spring應用程序中,我有使用Spring的緩存機制的組件。每個@Cacheable
批註指定要使用的緩存。我想自動發現啓動時需要的所有緩存,以便它們可以自動配置。發現帶註釋的方法
最簡單的方法似乎是創建一個標記接口(例如:CacheUser
)由每個緩存組件一起使用:
@Component
public class ComponentA implements CacheUser {
@Cacheable("dictionaryCache")
public String getDefinition(String word) {
...
}
}
我將不得不春自動發現該接口的所有的實現,並將它們自動裝配到在配置緩存管理器時可以使用的配置列表。這工作。
@Autowired
private Optional<List<CacheUser>> cacheUsers;
我的計劃是把每發現的一類,並找到@Cacheable
註釋的所有方法。從那裏我將訪問註解的屬性並獲取緩存名稱。我正在使用AnnotationUtils.findAnnotation()
來獲取註釋聲明。
這就是計劃分崩離析的地方。 Spring實際上是連接代理而不是原始組件,並且註釋不會被複制到代理的方法中。我發現的唯一的解決方法利用了一個事實,即代理實現Advised
它提供了訪問代理的類:
((Advised)proxy).getTargetSource().getTargetClass().getMethods()
從那裏我能得到原來的註釋,但這種做法顯然是脆。
所以兩個問題,真正做到:
- 有沒有更好的辦法去通過代理的類中定義的註釋嗎?
- 你可以建議任何其他方式來發現我項目中
@Cacheable
的所有用途嗎?我喜歡沒有標記界面。
謝謝!
爲什麼你需要一個自定義接口。實現'BeanPostProcessor'實現'postProcessAfterInitialization'並使用'AopUtils'來獲取實際的目標類並檢查註釋。你可以看看JMS支持如何工作(https://github.com/spring-projects/spring-framework/blob/master/spring-jms/src/main/java/org/springframework/jms/annotation/ JmsListenerAnnotationBeanPostProcessor.java#L195),然後使用'SmartInitializingSingleton'並在你需要的方法中實現你的緩存。 –