7.2. 注入嵌入式缓存

设置 CDI Bean 以注入嵌入式缓存。

流程

  1. 创建缓存限定符注解。

    ...
    import javax.inject.Qualifier;
    
    @Qualifier
    @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface GreetingCache { 1
    }
    1
    创建一个 @GreetingCache 限定符。
  2. 添加定义缓存配置的制作者方法。

    ...
    import org.infinispan.configuration.cache.Configuration;
    import org.infinispan.configuration.cache.ConfigurationBuilder;
    import org.infinispan.cdi.ConfigureCache;
    import javax.enterprise.inject.Produces;
    
    public class Config {
    
        @ConfigureCache("mygreetingcache") 1
        @GreetingCache 2
        @Produces
        public Configuration greetingCacheConfiguration() {
            return new ConfigurationBuilder()
                        .memory()
                            .size(1000)
                        .build();
        }
    }
    1
    要注入的缓存的名称。
    2
    添加缓存限定符。
  3. 如果需要,添加创建集群缓存管理器的制作者方法

    ...
    package org.infinispan.configuration.global.GlobalConfigurationBuilder;
    
    public class Config {
    
        @GreetingCache 1
        @Produces
        @ApplicationScoped 2
        public EmbeddedCacheManager defaultClusteredCacheManager() { 3
          return new DefaultCacheManager(
            new GlobalConfigurationBuilder().transport().defaultTransport().build();
       }
    }
    1
    添加缓存限定符。
    2
    为应用创建 bean 一次。创建缓存管理器的制作者应始终包含 @ApplicationScoped 注释,以避免创建多个缓存管理器。
    3
    创建新的 DefaultCacheManager 实例,该实例绑定到 @GreetingCache qualifier。
    注意

    缓存管理器具有重度的权重对象。在应用程序中运行多个缓存管理器可能会降低性能。在注入多个缓存时,可以将每个缓存的限定符添加到缓存管理器制作者方法中,或者不添加任何限定符。

  4. @GreetingCache 限定符添加到您的缓存注入点。

    ...
    import javax.inject.Inject;
    
    public class GreetingService {
    
        @Inject @GreetingCache
        private Cache<String, String> cache;
    
        public String greet(String user) {
            String cachedValue = cache.get(user);
            if (cachedValue == null) {
                cachedValue = "Hello " + user;
                cache.put(user, cachedValue);
            }
            return cachedValue;
        }
    }