Когда вызывается функция, когда есть bean-компонент ее класса?

Я хочу настроить кеширование в 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


person Daniel    schedule 22.01.2019    source источник


Ответы (1)


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

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

person Stephane Nicoll    schedule 29.01.2019