注释配置的框架(即Tomcat,Hibernate)如何扫描类路径中的所有类以进行注释?

时间:2013-11-10 10:46:59

标签: java tomcat frameworks annotations

我正在开发一个传递消息的小应用程序,它们是POJO。我想构建一个可以处理的消息类型的注册表。我最初计划将它们粘贴在枚举类型中,如下所示。

public enum Message
{
    INIT( InitMessage.class, "init" ),
    REFRESH( RefreshMessage.class, "refresh" );

    private Message( Class<?> messageClass, String messageCode )
    // etc..
}

我不喜欢这种方法,因为我必须维护一个中心枚举类型来管理允许的类。我更愿意注释POJO。

@MessageDefinition( "init" )
public class InitMessage
{
    // .. some properties with appropriate getters and setters
}

我从Subversion检查了Tomcat源代码,甚至在IDE的帮助下,我花了很长时间来浏览抽象层次并得到一些粗暴的代码,告诉我它是如何扫描的webapp中的类搜索注释类以注册@WebServlet,@ WebListener等。更令人反感的是,我只能在测试类中看到对这些注释的引用。

我的问题是注释驱动框架如何扫描注释?很难知道你希望扫描哪些类,甚至更多,在它们被类加载器加载之前。我在想这种方法可能是查找以.class扩展名结尾的所有文件,加载它们并检查注释。然而,这种方法听起来很讨厌。

所以我猜它归结为:

  • Tomcat如何找到带注释的类? (或您熟悉的任何其他框架)
  • 如果Tomcat(或你上面提到的框架)方法很糟糕,你会怎么做?
  • 我有更好的方法来构建这个整体吗?

注意:Scan the classpath for classes with custom annotation很棒,但如果可能,我很乐意使用标准Java 7。

更新: 反思不合适。它有大量的依赖关系,更糟糕的是,它依赖于旧版本的库 - 尤其是每个版本都弃用了几十个特性并快速发布的图书馆。

我正在考虑遵循本指南并尽可能使用ASM: http://bill.burkecentral.com/2008/01/14/scanning-java-annotations-at-runtime/

1 个答案:

答案 0 :(得分:2)

Tomcat使用缩减扫描注释(因此只有Tomcat需要的位),并重命名包(因此,如果Web应用程序随BCEL一起提供,它也不会发生冲突)Apache Commons BCEL版本。它查找每个.class文件,读取字节代码并提取注释。

有关详细信息,您可以查看源代码。从这个文件的第1130行开始: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?annotate=1537835

另一个流行的做这种事情的库是ASM。