[英]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扩展名结尾的所有文件,加载它们并检查注释。 然而,这种方法听起来很讨厌。
所以我猜它归结为:
注意: 使用自定义注释扫描类路径以查找类很好,但如果可能的话,我很乐意使用标准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.