2012-02-04 88 views
8

这很难解释我真正想要的。我有一个接口,它有一个方法getRuntimeInfo(),它为我提供了一个类的变量的所有运行时调试信息。我想看看实现这个接口的所有类的列表。我正在使用Java和Spring。 我可以做到这一点的一种方法是从Spring上下文中获取所有bean,并使用instanceof运算符进行检查。但我不希望这样做,因为明显的性能影响。我有其他的选择吗?跟踪所有实现特定接口的类吗?

回答

13

这个怎么样的解决方案:

@Component 
public class WithAllMyInterfaceImpls { 

    @Autowire 
    List<MyInterface> allBeansThatImplementTheMyInterface; 

} 

列表中只填入一次(在启动时),因此它不应该在“正常”运行时性能有显著的影响。


评论:

你能解释一下你的代码

你知道春天是一个IOC容器。 @Component告诉Spring它应该创建这个类的一个实例(所谓的Spring Managed Bean)。 IOC还意味着Container负责将引用注入其他实例(Spring Managed Beans)。 @Autowire(以及@Resource@Inject - 都是这样做)就是这样一个注释,它告诉Spring这个字段应该被Spring填充。 Spring本身试图找出该字段应该填充的实例。 Spring使用的默认技术是by type这意味着Spring检查字段的类型并搜索匹配的bean。在你的情况下,它是一个通用列表 - 这有点特别。在这种情况下,Spring使用列表填充字段,其中元素是与泛型类型匹配的所有bean。

+0

是正常的春天autowiring功能,没有什么特别的。它只是弹簧的核心功能 – Ralph 2012-02-05 10:23:18

+0

@ user1117398:我扩展了我的答案来解释一下。 - 看起来你应该阅读Spring 3.0!或3.1教程。 – Ralph 2012-02-05 11:47:36

相关问题