缓存提供者CachingProvider
缓存提供者是Java缓存API的一个核心概念,它的作用是通过一个CachingProvider,开发者获得CacheManager,并通过CacheManager和缓存交互。
通过CachingProvider可以:
●获取默认的CacheManager实例。
●通过唯一确定的URI为标识,创建CacheManager实例。
例如一个实现可能要求CacheManager声明一个类路径中指定的配置文件,据此允许实现通过路径装载资源。
cachingProvider.getCacheManager(“/sample/ConfigurationFile.xml”); |
●通过URI和ClassLoader的范围界定管理CacheManager实例。
●关闭和释放指定的CacheManager或相关CacheManager的集合。
●查询CachingProvider实现的功能,包括对可选功能的支持。
CacheManager的标识和配置
CacheManager在逻辑上由URI标识,被用来在一个CachingProvider的范围内创建这些CacheManager。而应用程序通常使用默认的URI作为定义的标识,并通过CachingProvider获取CacheManager,应用程序也可以使用特定的URI以支持CacheManagers的高级配置。
例如一个实现允许URI被用作定义配置文件的位置,通常用于预配置缓存。
cachingProvider.getCacheManager(“/sample/ConfigurationFile.xml”); |
应用程序部署中以相同URI定义的两个或两个以上的CacheManager,在逻辑上是等同的,在实现上可以管理相同的缓存。
例如支持分布式缓存拓扑结构的两个应用程序,使用相同URI可以在逻辑上共享同一缓存的名称和内容。在这种情况下,在一个应用程序中更改缓存条目可能对其他应用程序是可见的。
但与只支持本地缓存拓扑结构的两个应用程序,使用相同的URI可以使得它们使用同一个缓存名称,但不会共享缓存的内容。在这种情况下,一个应用程序中更改缓存条目对其他应用程序是不可见的。
下表概述了CacheManage的URI针对同一名称的使用如何影响到缓存,仅支持本地(非共享)对比分布式(或共享)的缓存拓扑。
CacheManager URI | 本地(非共享) 缓存拓扑 | 分布式/ 共享缓存拓扑 |
相同 | 缓存使用相同的配置。 | 缓存使用相同的配置。 |
不同 | 缓存可能拥有不同的配置。 可能拥有不同的条目。 | 缓存可能拥有不同的配置。 可能拥有不同的条目。 |
CachingProvider接口定义如下:
public interface CachingProvider extends Closeable { CacheManager getCacheManager(URI uri, ClassLoader classLoader, Properties properties); ClassLoader getDefaultClassLoader(); URI getDefaultURI(); Properties getDefaultProperties(); CacheManager getCacheManager(URI uri, ClassLoader classLoader); CacheManager getCacheManager(); void close(); void close(ClassLoader classLoader); void close(URI uri, ClassLoader classLoader); boolean isSupported(OptionalFeature optionalFeature); } |
尽管可选,在Java SE环境中获取CachingProvider实例的主要手段是使用Caching引导类。
Caching引导类提供了三种机制,以便定位和实例化一个或多个CachingProvider:
●假定实现中被定义为一个服务,并通过使用一个java.util.ServiceLoader来解析它。
●允许开发人员通过设置javax.cache.CachingProvider的 Java系统属性定义所需的CachingProvider的完全限定类名来指定默认的实现。
●允许应用程序使用完全限定类名显式地定义CachingProvider。
虽然开发人员可以选择使用和具体技术相关的实现获取CachingProvider,但这样做能会降低CachingProvider实现之间的应用程序的可移植性。
在Java EE环境中,CachingProvider在内部使用,用以管理CacheManager,被用来注入所需的缓存到应用程序中。
CachingProvider的实现会由缓存引导类java.util.ServiceLoader自动定位,应用程序实现的CachingProvider必须依照JAR文件规范,在META-INF/services/javax.cache.spi.CachingProvider配置文件中定义CachingProvider的完全限定类名。
该javax.cache.spi.CachingProvider配置文件用于定义特定的CachingProvider缓存引导类的实现类,从而使其能够自动定位,加载,并为应用程序提供实例化请求。
javax.cache.spi.CachingProvider配置文件的内容简单地包含一个或多个完全限定类名,每一个单独的行中,指定一个可用的CachingProvider实现类名称。
例如:
一个Java缓存API实现者,ACME的缓存产品,附带一个名为acme.jar的JAR,里面包含了CachingProvider的实现。该JAR的内容中既包括CachingProvider实现类,又包含javax.cache.spi.CachingProvider配置文件。
META-INF/services/javax.cache.spi.CachingProvider com/acme/cache/ACMECachingProvider.class ... |
文件META-INF/services/javax.cache.spi.CachingProvider的内容仅仅包含下面一行实现类的名称:
com.acme.cache.ACMECachingProvider |
应用程序可以使用多个CachingProvider实现,只要正确配置META-INF/services/javax.cache.spi.CachingProvider文件。当在多个CachingProviders的情况下,从缓存引导类要求返回默认的CachingProvider会导致抛出异常。
Caching缓存引导类方法定义如下:
public final class Caching { public static ClassLoader getDefaultClassLoader() public void setDefaultClassLoader(ClassLoader classLoader) public static CachingProvider getCachingProvider() public static CachingProvider getCachingProvider(ClassLoader classLoader) public static Iterable<CachingProvider> getCachingProviders() public static Iterable<CachingProvider> getCachingProviders( ClassLoader classLoader) public static CachingProvider getCachingProvider(String fullyQualifiedClassName) public static CachingProvider getCachingProvider( String fullyQualifiedClassName, ClassLoader classLoader) } |