我不明白java如何知道任何规范的实现..
例如,我有一个带有JSF的Spring应用程序,如果我将Mojarra jar放在类路径上应用程序正常工作,但我没有做任何事情,只是将它添加到类路径,所有没有配置
如果我取出Mojarra jar,那么我的应用程序就不起作用了。
甚至,它如何在没有任何变化的情况下区分Mojarra或MyFaces?
我只是想知道Java如何找到实现,而不是为什么如果我取出罐子它不起作用;)
答案 0 :(得分:2)
通常,Java规范类分为两部分:
上面的一个示例是JDBC:javax.sql.*
类由sun/oracle
提供,但实现是在每个数据库供应商提供的JDBC驱动程序中完成的。在这种情况下,需要某种配置才能将API“映射”到其实现中,因为您只使用API
类。
JSF
的示例略有不同,Mojarra
和MyFaces
包含来自API
包的javax.faces.*
类,基本上有不同的类同名。因此不需要配置,这两个类在两个库中都具有相同的名称,并且在需要时从Mojarra
或MyFaces
jar中加载类加载器,无论哪个类都在类路径上。
答案 1 :(得分:0)
我找到了JSF的MyFaces和Mojarra Implementation。我已经意识到两者都具有相同的pachage结构,因此它意味着所有都符合JSF规范。换句话说,哪个实现jar被赋予classpath类路径加载器将处理它。
关于JVM的Java Class Loader机制。您可以在Java Class Loaders
中找到详细的讨论以下是JSF实现包结构的图片。
答案 2 :(得分:0)
我见过mojarra jar(JSF Reference Implementation),我发现它使用了Service Loader API,因为它放置了javax.servlet.ServletContainerInitializer,javax.enterprise.inject.spi.Extension和com.sun。 face.spi.injectionprovider位于javax.faces-2.2.0.jar中的/ META-INF / services文件夹中。
这是java区分实现和另一个(mojarra或myfaces)的方式。