Кэш Spring 5 не работает для @Cachable (CacheInterceptor не находится в стеке вызовов)? - PullRequest
0 голосов
/ 25 апреля 2018

Я включаю кэширование для публичного метода, добавив аннотацию @Cachable следующим образом:

@Cacheable(cacheNames = "saas_setting", //
        key = "#key")
public Setting get(String key) { ... }

В другой руке я добавляю компонент cacheManager:

<bean id="cacheManager"
    class="org.springframework.cache.support.SimpleCacheManager">
    <property name="caches">
        <set>
            <bean
                class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
                name="saas_setting" />
        </set>
    </property>
</bean>

Я включаю AOP:

<aop:aspectj-autoproxy 
    proxy-target-class="true"/>

Затем включите кэш:

<cache:annotation-driven 
    mode="aspectj"
    proxy-target-class="true"/>

Как бы то ни было, результат не кэшируется, и метод вызывается, когда когда-либо вызывается из другой части системы.

Я установил точку останова в методе и проверил стек вызовов: в стеке нет CachInterceptor?!


РЕДАКТИРОВАТЬ:

Это полный файл конфигурации:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:cache="http://www.springframework.org/schema/cache"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/cache
        http://www.springframework.org/schema/cache/spring-cache-4.3.xsd">

    <!-- Enable AspectJ style of Spring AOP -->
    <aop:aspectj-autoproxy 
        proxy-target-class="true"/>

    <!-- Enable cache -->
    <cache:annotation-driven 
        mode="aspectj"
        proxy-target-class="true"/>


    <bean id="cacheManager"
        class="org.springframework.cache.support.SimpleCacheManager">
        <property name="caches">
            <set>
                <bean
                    class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
                    name="saas_setting" />
            </set>
        </property>
    </bean>

    <bean name="applicationProperties"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreResourceNotFound" value="false" />
        <property name="locations">
            <list>
                <value>resources/server.properties</value>
                <value>resources/modules/*.properties</value>
                <value>resources/jetty/*.properties</value>
                <value>resources/db/#{systemProperties['db.dialect']}.properties
                </value>
                <value>resources/db/#{systemProperties['db.orm']}.properties</value>
            </list>
        </property>
    </bean>
    <import resource="../context/beans-*.xml" />
</beans>

РЕДАКТИРОВАТЬ:

Документация Baed on Spring:

Режим рекомендации по умолчанию для обработки аннотаций кэширования - «прокси», который позволяет перехватывать вызовы черезтолько прокси;местные вызовы внутри одного класса не могут быть перехвачены таким образом.Для более продвинутого режима перехвата рассмотрите возможность переключения в режим «aspectj» в сочетании с ткачеством во время компиляции или во время загрузки.

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

1 Ответ

0 голосов
/ 25 апреля 2018

Поскольку вы используете режим кеширования aspectJ, вам нужен spring-aspect.jar в вашем classpath.Непонятно, почему вы хотите использовать прокси-сервер aspectj вместо используемого по умолчанию.

, так как вы используете режим аспекта для прокси, вам также нужно настроить время загрузки.

Время загрузкиткачество можно включить, используя:

<context:load-time-weaver/>

Также метод, который вы используете, должен быть из конкретного класса, так как вы используете proxy-target-class="true"

...