当有其类的bean时,何时调用该函数?

时间:2019-01-22 21:34:15

标签: java spring spring-cache ehcache-3

我想使用EhCache 3和Spring Caching在Spring Boot中设置缓存。如何设置缓存创建?在什么情况下调用JCacheManagerCustomizer的{​​{1}}方法?

缓存用于Spring Security ACL。最后,我需要一个AclCache。

我在应用程序类中配置了这些bean。

@Bean
public AclCache aclCache(Cache cache, PermissionGrantingStrategy permissionGrantingStrategy, AclAuthorizationStrategy aclAuthorizationStrategy) {
    return new SpringCacheBasedAclCache(cache, permissionGrantingStrategy, aclAuthorizationStrategy);
}

@Bean
public LookupStrategy lookupStrategy(DataSource dataSource, AclCache aclCache, AclAuthorizationStrategy aclAuthorizationStrategy, PermissionGrantingStrategy permissionGrantingStrategy) {
    return new BasicLookupStrategy(dataSource, aclCache, aclAuthorizationStrategy, permissionGrantingStrategy);
}

@Bean
public JdbcMutableAclService jdbcMutableAclService(DataSource dataSource, LookupStrategy lookupStrategy, AclCache aclCache) {
    return new JdbcMutableAclService(dataSource, lookupStrategy, aclCache);
}

在一个单独的课程中,我得到了这些豆:

@Configuration
@EnableCaching
public class CacheConfiguration {
    @Bean
    public CacheManager cacheManager() {
        return new JCacheCacheManager(Caching.getCachingProvider().getCacheManager());
    }

    @Bean
    public Cache cache(CacheManager cacheManager, JCacheManagerCustomizer cacheManagerCustomizer) {
        Cache cache = cacheManager.getCache("aclCache");
        return cache;
    }

    @Bean
    public JCacheManagerCustomizer cacheManagerCustomizer() {
        return new JCacheManagerCustomizer() {
            @Override
            public void customize(javax.cache.CacheManager cacheManager) {
                org.ehcache.config.CacheConfiguration<Object, Object> config = CacheConfigurationBuilder
                        .newCacheConfigurationBuilder(Object.class, Object.class,
                                ResourcePoolsBuilder.newResourcePoolsBuilder()
                                        .heap(100, EntryUnit.ENTRIES))
                        .withExpiry(ExpiryPolicy.NO_EXPIRY)
                        .build();
                cacheManager.createCache("aclCache", Eh107Configuration.fromEhcacheCacheConfiguration(config));
            }
        };
    }
}

现在应该创建缓存aclCache,但不是。根据此示例[1]应该如此。在customize()方法中放置一个断点表明没有命中。不过会调用JCacheManagerCustomizer。

[1] https://github.com/spring-petclinic/spring-petclinic-reactjs/blob/master/src/main/java/org/springframework/samples/petclinic/config/CacheConfig.java

1 个答案:

答案 0 :(得分:0)

您要自行配置所有内容,以便有效地绕过自动配置(由于您提供了自己的配置,因此Spring Boot不会做任何事情)。

目前还不清楚您对那些暴露为bean的Cache所做的事情,因为它们不会被缓存管理器接收。无论如何,由于您是自己创建的,因此只需从创建CacheManager的第一个方法中调用该代码即可。