Настройка на основе Java для кэширования на основе Ehcache не работает - PullRequest
2 голосов
/ 27 декабря 2011

Я использую конфигурацию на основе Java-аннотаций для инициализации кэширования на основе ehcache в Spring 3.1.

Вот пример кода ...

@Configuration
@EnableCaching
public class EhcacheConfig implements CachingConfigurer {

    .....

    @Bean
    public CacheManager cacheManager() {
        .....
        EhCacheManagerFactoryBean bean = new EhCacheManagerFactoryBean();
        bean.setCacheManagerName(CACHE_MANAGER);
        bean.setShared(Boolean.TRUE);
        File file = new File(property + Constants.Slash + EHCACHE_XML);
        bean.setConfigLocation(new FileSystemResource(file));

        try {
            bean.afterPropertiesSet();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        EhCacheCacheManager cm = new EhCacheCacheManager();
        cm.setCacheManager(bean.getObject());
        return cm;
    }

    public KeyGenerator keyGenerator() {
        return new DefaultKeyGenerator();
    }
}

Существует допустимый файл ehcache.xmlс объявленным в нем 1 кешем.

Это все настройки, которые у меня есть для инициализации ehcache с помощью Spring.В приложении отсутствует инициализация на основе XML.

Во время выполнения я заметил, что cacheManager () инициализируется, как и ожидалось.После успешного выполнения код не может завершить инициализацию, допустив ошибку в:

CachingInterceptor.afterPropertiesSet () ->

if (this.cacheManager == null) {
    throw new IllegalStateException("'cacheManager' is required");
}

Я провел некоторое исследование.

Кажется, что проблема возникает, когда CachingInterceptor инициализируется ProxyCachingConfiguration.

ProxyCachingConfiguration является производным от AbstractCachingConfiguration.

AbstractCachingConfiguration имеет метод с именем:

@PostConstruct
protected void reconcileCacheManager()

Этот методне вызывается.Если бы он был вызван, cacheManager, созданный в EhcacheConfig.cacheManger (), был бы правильно настроен для использования CacheInterceptor.afterPropertiesSet ().

Я не понимаю причину, по которой reconcileCacheManager () не вызывается до CacheInterceptor.afterPropertiesSet () вызывается.

Я что-то упустил?Может ли кто-нибудь помочь мне с проблемой, с которой я столкнулся?

Спасибо.

1 Ответ

3 голосов
/ 27 декабря 2011

Во-первых, вы можете рассмотреть возможность извлечения инициализации EhCacheManagerFactoryBean для его собственного метода @Bean.

Таким образом, вы можете просто создать экземпляр, сконфигурировать и вернуть FactoryBean, не вызывая afterPropertiesSet () самостоятельно.Это гарантирует, что объект является правильно управляемым компонентом Spring и что он может получать любые другие обратные вызовы, которые могут регистрироваться (например, DisposableBean # destroy ()) в этом конкретном случае.

Предполагается, что новый метод @Beanс именем "ecmfb" вы можете просто вызвать ecmfb (). getObject () из вашего метода cacheManager (), и в этот момент вам будет гарантировано, что контракт FactoryBean (то есть afterPropertiesSet ()) был выполнен.

Во-вторых, вам может быть важно знать, что ваши методы @Bean могут генерировать любые исключения, которые вам нравятся.Так, например, если вы не выбрали извлечение FactoryBean, как я предлагал выше, вы все равно можете упростить ситуацию, объявив предложение throws Exception в вашем методе cacheManager @Bean.Это избавит вас от текущего шума try / catch.

Наконец, чтобы выяснить, почему метод @PostConstruct не вызывается, позвольте мне спросить, как вы загружаете контейнер Spring.Если вы работаете с AnnotationConfig (Web) ApplicationContext, CommonAnnotationBeanPostProcessor должен быть зарегистрирован по умолчанию.То же самое верно, если вы используете или.CABPP отвечает за обнаружение и обработку аннотаций, таких как @PostConstruct, @PreDestroy и других.Пожалуйста, предоставьте немного больше информации о вашем подходе к начальной загрузке, и мы пойдем оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...