[英]Spring annotation based caching
My Spring应用程序包含两个上下文xml配置文件,第一个root-context.xml仅扫描非@Controller
注释bean:
<beans ...>
<context:component-scan base-package="com.myapp.test">
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
</beans>
第二个servlet-context.xml包含所有spring-mvc设置并扫描@Controller
注释bean
<beans:beans xmlns="http://www.springframework.org/schema/mvc" ...>
<annotation-driven />
<context:component-scan base-package="com.myapp.test">
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
...
</beans:beans>
web.xml上的DispatcherServlet配置如下所示
<web-app ...>
...
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
...
</web-app>
我想尝试基于注释的缓存,所以我将以下bean定义添加到root-context.xml
<cache:annotation-driven/>
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="foo"/>
</set>
</property>
</bean>
并使用@Service
注释类对其进行测试,该类应由root-context.xml扫描
@Service
public FooService {
@Cacheable("foo")
public int getFoo() {
System.out.println("cache miss");
return new Random().nextInt(50);
}
}
但getFoo()
方法调用永远不会被缓存,我总是每次都得到随机数。
但是,如果我在servlet-context.xml上扫描了所有bean并重新定位了我的缓存bean定义,那么它可以工作。
可能是什么原因导致的 关于缓存注释肯定还有一些我还不了解的东西。
在servlet-controller.xml中,在执行context:component-scan
时不会排除@Component
bean context:component-scan
<context:component-scan base-package="com.myapp.test">
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
你应该添加use-default-filters="false"
<context:component-scan base-package="com.myapp.test" use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
避免豆影。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.