gpt4 book ai didi

java - 基于 Spring 注解的缓存

转载 作者:搜寻专家 更新时间:2023-11-01 02:26:30 26 4
gpt4 key购买 nike

我的 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>

我想尝试基于注释的缓存,所以我将以下 beans 定义添加到 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

<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>

避免 bean 阴影。

关于java - 基于 Spring 注解的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21620842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com