首页 / JAVA / java – 发现带注释的方法
java – 发现带注释的方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 发现带注释的方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2396字,纯文字阅读大概需要4分钟。
内容图文
在我的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的所有用途?我喜欢没有标记界面.
谢谢!
解决方法:
Spring有许多基础设施接口,可以帮助您利用容器和/或bean的生命周期.为了您的目的,您想使用BeanPostProcessor和SmartInitializingSingleton.
BeanPostProcessor将为所有构造的bean获取回调,您只需要实现postProcessAfterInitialization方法.您可以在该方法中检测注释并填充缓存列表.
然后在SmartInitializingSingletons afterSingletonsInstantiated方法中使用此列表来引导/初始化您的缓存.
像下面的东西(它是未经测试但应该给你一个想法).
public class CacheInitialingProcessor implements BeanPostProcessor, SmartInitializingSingleton {
private final Set<String> caches = new HashSet<String>();
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
Class<?> targetClass = AopUtils.getTargetClass(bean);
ReflectionUtils.doWithMethods(targetClass, new ReflectionUtils.MethodCallback() {
@Override
public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException {
Cacheable cacheable = AnnotationUtils.getAnnotation(method, Cacheable.class);
if (cacheable != null) {
caches.addAll(Arrays.asList(cacheable.cacheNames()));
}
}
});
return bean;
}
@Override
public void afterSingletonsInstantiated() {
for (String cache : caches) {
// inti caches.
}
}
}
内容总结
以上是互联网集市为您收集整理的java – 发现带注释的方法全部内容,希望文章能够帮你解决java – 发现带注释的方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。