<mvc:resources> - 它是否缓存到内存? Spring 4.0.5 </mvc:resources>

时间:2015-01-09 08:06:23

标签: java spring

让以下内容:

<mvc:resources mapping="/resources/**" location="/resources/" />

并说2000个请求来

/resources/script/app/myhax.js

如果我没有配置任何内容,myhax.js以某种方式缓存到RAM中,其余的请求是从那里提供的,还是从文件的真实路径(通常是HDD)提供的所有2000个请求?可以将Spring配置为在将该文件直接从内存请求以供将来服务后将其保留在RAM中吗?

1 个答案:

答案 0 :(得分:2)

Spring没有资源。但是有可能为了允许缓存资源。

您可以指定cache-period(以发送具有给定最大年龄值的缓存标头)例如

<resources mapping="/resources/**" location="/resources/" cache-period="3600"/>

OR

mvc:resourcesResourceHttpRequestHandler支持,因此您可以创建自己的扩展ResourceHttpRequestHandler的子类,并通过覆盖适当的方法来实现缓存逻辑,例如writeContent(注意,您可以参考到文档或源代码以找出可用方法的列表)并在spring config中使用这个新的子类。

E.g。

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

public class CacheResourceHandler extends ResourceHttpRequestHandler {

        private Map<URL, byte[]> cache = new HashMap<>();

        @Override
        protected void writeContent(HttpServletResponse resp, Resource rsc) throws IOException {
            byte[] buff = cache.get(rsc.getURL());

            //if not in cache
            if (buff == null) {
                //add to cache
                buff = StreamUtils.copyToByteArray(rsc.getInputStream());
                cache.put(rsc.getURL(), buff);
            }

            //return cache version
            StreamUtils.copy(buff, resp.getOutputStream());
        }

    }

Xml配置

我们需要注释掉或删除以前的资源映射

 <!--<resources mapping="/resources/**" location="/resources/" />--> 

接下来我们需要声明我们的缓存处理程序bean

  <bean id="staticResources" class="CacheResourceHandler">
          <property name="locations" value="/resources/"/> 
    </bean>

最后,我们将使用上面声明的SimpleUrlHandlerMapping来实现HandlerMapping接口,以便从URLS映射到请求处理程序bean。我们所需要的只是传递我们的bean进行映射

   <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          <property name="mappings">
                 <value>/resources/**=staticResources</value>
          </property>
   </bean>