繁体   English   中英

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

[英]How do annotation-configured frameworks (ie. Tomcat, Hibernate) scan all classes in the classpath for 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(或你上面提到的框架)的方法很糟糕,你会怎么做?
  • 有没有更好的方法来构建这个整体?

注意: 使用自定义注释扫描类路径以查找类很好,但如果可能的话,我很乐意使用标准Java 7。

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

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

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM