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

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

Кеш предназначен для ACL Spring Security. В конце мне нужен AclCache.

Я настроил эти компоненты в классе приложения.

@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 ответ

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

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

Другие вопросы по тегам