Когда вызывается функция, когда есть бин ее класса? - PullRequest
0 голосов
/ 23 января 2019

Я хочу настроить кэширование в Spring Boot с использованием EhCache 3 и Spring Caching. Как настроить создание кэша? При каких обстоятельствах вызывается customize() метод JCacheManagerCustomizer?

Кэш предназначен для ACL Spring Security. В конце мне нужен 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 голосов
/ 30 января 2019

Вы настраиваете все самостоятельно, так что вы эффективно обходите автоконфигурацию (Spring Boot ничего не сделает, так как вы указали свою собственную конфигурацию).

Непонятно, что вы делаете с этими Cache выставлено в виде бобов, так как они не будут собраны вашим менеджером кэшаНезависимо от этого, просто вызовите этот код из первого метода, который создает CacheManager, так как вы создаете его самостоятельно.

...