Springcache не работает только с конфигурацией XML - PullRequest
0 голосов
/ 25 марта 2019

Я внедряю Springcache с конфигурацией XML и хочу избавиться от всех аннотаций. Я просто хочу заменить аннотации в файле applicationContext.xml. Вот мой код -

//DummyBean.java
package com.spring.example;
interface DummyBean {
    public String getCity();
}

//DummyBeanImpl.java
package com.spring.example;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.EnableCaching;

@EnableCaching
@CacheConfig(cacheNames={"myCache"})
public class DummyBeanImpl implements DummyBean {

    private String city = "New York";

    @Cacheable()
    public String getCity() {
        System.out.println("DummyBean.getCity() called!");
        return city;
    }
}

SpringAwareAnnotationXMLConfig.java

package com.spring.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class SpringAwareAnnotationXMLConfig {

  public static void main(String[] args) throws Exception {
    AbstractApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");

    DummyBean personService = (DummyBean) context.getBean("myBean");
    System.out.println(personService.getCity());
    System.out.println(personService.getCity());
    System.out.println(personService.getCity());

    ((AbstractApplicationContext) context).close();
  }
}

applicationContext.xml

<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:cache="http://www.springframework.org/schema/cache"
           xmlns:c="http://www.springframework.org/schema/c"
           xmlns:p="http://www.springframework.org/schema/p"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
                               http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.2.xsd
                               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd>


  <context:annotation-config/>
  <cache:annotation-driven cache-manager="cacheManager"/>
  <context:component-scan base-package="com.spring"/>

  <bean id="myBean" class="com.spring.example.DummyBeanImpl"/>

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

  <cache:advice id="cacheAdvice" cache-manager="cacheManager">
    <cache:caching cache="myCache">
      <cache:cacheable method="getCity"/>
    </cache:caching>
  </cache:advice>
</beans>

Как вы можете видеть, если я сохраняю аннотации @EnableCaching, @CacheConfig, @Cacheable в коде Java, то кэширование работает нормально, и я получаю следующий вывод -

DummyBean.getCity() called!
New York
New York
New York

Но если я уберу аннотации, то получу следующий вывод -

DummyBean.getCity() called!
New York
DummyBean.getCity() called!
New York
DummyBean.getCity() called!
New York

Это означает, что кэширование не сработало!

Но я ожидаю, что в файле applicationContext.xml я уже включил кэш с помощью <cache:annotation-driven cache-manager="cacheManager"/>, я уже упомянул cachename и уже настроил кэш с именами методов, в которых должно быть реализовано кэширование. Поэтому, если я опущу аннотации, я должен получить желаемый результат. Но почему я не получаю?

Спасибо Nirmalya

1 Ответ

1 голос
/ 25 марта 2019

При использовании аспектов, сконфигурированных в формате XML, вам также необходимо добавить раздел aop:config, чтобы применить аспект.

<aop:config>
    <aop:advisor advice-ref="cacheAdvice" pointcut="execution(* com.spring.example.DummyBean+.*(..))"/>
</aop:config>

Предполагая, что DummyBean является интерфейсом, реализованным com.spring.example.DummyBeanImpl, это должно сработать. Это означает, что вы хотите применить cacheAdvice (аспект) к компоненту, соответствующему выражению.

См. Также справочное руководство

...