【发布时间】:2015-10-26 23:44:34
【问题描述】:
在我的 Spring 应用程序中,我有使用 Spring 缓存机制的组件。每个@Cacheable 注释都指定要使用的缓存。我想自动发现启动时需要的所有缓存,以便自动配置它们。
最简单的方法似乎是创建一个标记接口(例如:CacheUser)供每个缓存组件使用:
@Component
public class ComponentA implements CacheUser {
@Cacheable("dictionaryCache")
public String getDefinition(String word) {
...
}
}
然后,我将让 Spring 自动发现该接口的所有实现,并将它们自动连接到配置列表中,该列表可以在配置缓存管理器时使用。这行得通。
@Autowired
private Optional<List<CacheUser>> cacheUsers;
我的计划是获取每个发现的类并找到所有用@Cacheable 注释的方法。从那里我将访问注释的属性并获取缓存名称。我使用AnnotationUtils.findAnnotation() 来获取注解声明。
这就是计划失败的地方。 Spring 实际上连接代理而不是原始组件,并且注释不会复制到代理的方法中。我发现的唯一解决方法是利用代理实现Advised 提供对代理类的访问这一事实:
((Advised)proxy).getTargetSource().getTargetClass().getMethods()
从那里我可以得到原始注释,但是这种方法显然很脆弱。
所以两个问题,真的:
- 有没有更好的方法来获取代理类定义的注释?
- 您能否建议任何其他方式来发现我的项目中
@Cacheable的所有用途?我希望没有标记界面。
谢谢!
【问题讨论】:
-
为什么需要自定义界面。实现
BeanPostProcessor实现postProcessAfterInitialization并使用AopUtils获取实际的目标类并检查注释。您可以查看 JMS 支持的工作原理 (github.com/spring-projects/spring-framework/blob/master/…),然后还可以使用SmartInitializingSingleton并在您需要实现初始化缓存的方法中。
标签: java spring proxy annotations