2015-03-12 4 views
3

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

В настоящее время я реализует Spring Apache CXF основе (версия 4.1.5) веб-службы конечных точек с помощью контракт 1-й подход. Здесь я наблюдаю при аннотации общедоступного метода в моем классе веб-сервисов, аннотации кэш-памяти Spring «@Cachable» игнорируются каждый раз, когда я вызываю этот метод самозаверенным способом внутри одного и того же компонента. Это можно было проверить, если посмотреть в репозиторий кеша (через JMX) основного поставщика кеша (здесь: EhCache). Там никакого заполнения кеша не происходит.

После взглянуть на текущей документации Spring ниже Enable caching annotations и The dispatcher servlet Я предполагаю, что это может быть связано с тем, что:

<cache:annotation-driven/> выглядит только для @ Cacheable/@ CachePut/@ CacheEvict/@ Кэширование по бобам в том же контексте приложения, в котором оно определено. Это означает, что если вы введете WebApplicationContext для DispatcherServlet, он проверяет только бобы в ваших контроллерах, а не ваши службы. Для получения дополнительной информации см. Раздел 17.2 «Диспетчерский набор».

В настоящее время, Апачи CXF «CXFServlet» зарегистрирован в «web.xml» дескриптора развертывания начинает Весеннюю WebApplicationContext с помощью «CXF-servlet.xml» Spring приложения файл контекста по умолчанию. Там находится <cache:annotation-driven/>.

Возможно, это связано с тем, что я вызываю аннотированный метод @Cacheable из одного и того же Spring-компонента, чтобы сгенерированный прокси-сервер Spring был обойден? Подробности можно найти в главе «Прокси-механизмы» (9.6) весенней документации.

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

ответ

4

Dear Spring сообщество,

Я нашел важное замечание в рамках Spring documentation, который утверждает мое предположение:

В режиме прокси (который по умолчанию), только внешний метод вызывает приход через прокси-сервер перехватываются. Это означает, что самоисключение, по сути, метод в целевом объекте, вызывающий другой метод целевого объекта, не приведет к фактическому кэшированию во время выполнения, даже если вызываемый метод отмечен с помощью @Cacheable - учитывая использование режима aspectj в Это дело. Кроме того, прокси-сервер должен быть полностью инициализирован для обеспечения ожидаемого поведения, поэтому вам не следует полагаться на эту функцию в вашем коде инициализации, то есть на @PostConstruct.

В результате это означает, рефакторинга кода, когда опираясь на Spring AOP и его технику в режиме прокси или переключения режима с «прокси» на «AspectJ» <cache:annotation-driven mode="aspectj"/>. Это позволяет использовать самозапускаемые методы в том же классе, что и AOP, статичное, соответственно динамическое ткачество, и поэтому непосредственно манипулирует байтовым кодом.