在我的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'并在你需要的方法中实现你的缓存。 –