配置spring-mvc + simple-spring-memcached


原創文章,請尊重作者辛勤勞動

運行環境:spring3.2.1 + simple-spring-memcached3.1.0(以下簡稱SSM)

1. 所需jar包,spring的包到spring官網下載,ssm所需包在這里下載,我下載的是3.1.0版本

注:解壓simple-spring-memcached-3.1.0-dist.zip,復制lib目錄中所有jar到工程lib中,如果有相同的jar,保留版本高的,刪除版本低的。復制dist目錄中除了帶有test的之外所有jar到工程的lib中。最終lib包如下:

2. 配置項目的web.xml文件,因為本人項目用的是spring-mvc,所以代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3.0.xsd" 
    id="WebApp_ID" > 
<!-- ############################################################################## -->
    <!-- 字符集過濾器 --> 
    <filter>  
        <filter-name>characterEncodingFilter</filter-name>  
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
        <init-param>  
            <param-name>encoding</param-name>  
            <param-value>UTF-8</param-value>  
        </init-param>  
    </filter>  
    <filter-mapping>  
        <filter-name>characterEncodingFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping> 
<!-- ############################################################################## -->    
    <!-- spring-mvc 控制器 上下文Spring監聽器 -->
    <display-name>Spring3MVC</display-name>
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    <!-- 激活靜態資源的默認配置,解決Rest風格兼容 
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>     
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.gif</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    -->
<!-- ############################################################################## -->
    <!-- 歡迎頁面 -->
    <welcome-file-list>
        <welcome-file>startLogin.action</welcome-file>
    </welcome-file-list>
<!-- ############################################################################## -->
    <!-- tomcat多項目啟動 -->
    <context-param>
      <param-name>webAppRootKey</param-name>
      <param-value>web.lxyy_spring.root</param-value>
    </context-param>
    
<!-- ############################################################################## -->
  <!-- google的驗證碼插件 -->
  <servlet> 
        <servlet-name>Kaptcha</servlet-name> 
        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
        <!-- 全都要數字 -->
        <init-param>     
            <param-name>kaptcha.textproducer.char.string</param-name>     
            <param-value>0123456789</param-value>     
        </init-param> 
        
        <!-- 去掉干擾線 -->
        <init-param>
            <param-name>kaptcha.noise.impl</param-name>
            <param-value>com.google.code.kaptcha.impl.NoNoise </param-value>
        </init-param>
        <init-param>
            <param-name>kaptcha.border</param-name>
            <param-value>no</param-value>
        </init-param>
        <init-param>
            <param-name>kaptcha.image.width</param-name>
            <param-value>65</param-value>
        </init-param>
        <init-param>
            <param-name>kaptcha.image.height</param-name>
            <param-value>30</param-value>
        </init-param>
         
         <init-param>     
            <param-name>kaptcha.textproducer.char.length</param-name>     
            <param-value>4</param-value>     
        </init-param>
        <init-param>  
            <param-name>kaptcha.textproducer.font.size</param-name>  
            <param-value>25</param-value>  
        </init-param>
        <init-param>
            <param-name>kaptcha.obscurificator.impl</param-name>
            <param-value>com.google.code.kaptcha.impl.ShadowGimpy</param-value>
        </init-param>
          </servlet>

       <servlet-mapping>
           <servlet-name>Kaptcha</servlet-name>
           <url-pattern>/kaptcha.jpg</url-pattern> 
       </servlet-mapping>
    <!-- ############################################################################## -->   
    
    <context-param> 
      <param-name>log4jConfigLocation</param-name> 
      <param-value>classpath:log4j.properties</param-value> 
   </context-param> 
   <context-param> 
      <param-name>log4jRefreshInterval</param-name> 
      <param-value>6000</param-value> 
   </context-param>  
    <!-- request監聽 -->
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>
    
</web-app>

3. spring配置文件如下

注:需要解壓simple-spring-memcached-3.1.0.jar,找到simplesm-context.xml放到src目錄下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:cache="http://www.springframework.org/schema/cache"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
           http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd
            http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
            http://www.springframework.org/schema/mvc
             http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
            
    
    <!-- 引入jdbc配置文件 -->
    <context:property-placeholder location="classpath*:jdbc.properties"/>
    <!--創建jdbc數據源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${driverClass}"/>
        <property name="jdbcUrl" value="${jdbcUrl}"/>
        <property name="user" value="${user}"/>
        <property name="password" value="${password}"/>
        <!--初始化時獲取的連接數,取值應在minPoolSize與maxPoolSize之間。-->
        <property name="initialPoolSize" value="${initialPoolSize}"/>
        <!--連接池中保留的最小連接數。-->
        <property name="minPoolSize" value="${minPoolSize}"/>    
        <!--連接池中保留的最大連接數。-->
        <property name="maxPoolSize" value="${maxPoolSize}"/>
        <!--最大空閑時間,60秒內未使用則連接被丟棄。若為0則永不丟棄。-->
        <property name="maxIdleTime" value="${maxIdleTime}"/>    
        <!--當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。-->
        <property name="acquireIncrement" value="${acquireIncrement}"/>    
        <!--每60秒檢查所有連接池中的空閑連接。-->
        <property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}"/>
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 可通過注解控制事務 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    
    <!-- 自動掃描bean,把作了注解的類轉換為bean -->
    <context:component-scan base-package="com.dsideal" />
    <!-- 加載組裝所以配置文件 context:component-scan注冊后可以省略當前配置
    <context:annotation-config />     
    -->
    
    <!-- 通過注解,把URL映射到Controller上,該標簽默認注冊RequestMappingHandlerMapping和RequestMappingHandlerAdapter -->
    <mvc:annotation-driven />
    
      <!-- 啟動Spring MVC的注解功能,完成請求和注解POJO的映射 -->     
    <!--Spring3.1開始的注解 HandlerMapping 
    <bean 
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    -->
    <!--Spring3.1開始的注解 HandlerAdapter 
    <bean
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
     -->
    
    
    <!-- 啟用緩存注解 -->
    <cache:annotation-driven cache-manager="cacheManager"/>
    <bean id="cacheManager" class="org.springframework.cache.concurrent.ConcurrentMapCacheManager" />
    
    <!-- 視圖解析器 InternalResourceViewResolver:支持jsp和jstl解析器 -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 使用JSP頁面進行輸出 -->
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <!-- 指定了表示層的前綴 -->
        <property name="prefix" value="/WEB-INF/bizroot/" />
        <!-- 指定了表示層的后綴 -->
        <property name="suffix" value=".jsp" />
    </bean>
    
     <!-- 處理文件上傳處理  maxUploadSize:最大上傳限制 uploadTempDir:上傳臨時路徑,文件上傳完成后,臨時目錄中的臨時文件會被自動清楚 -->
    <bean id="multipartResolver"     
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver"     
          p:defaultEncoding="UTF-8" 
          p:maxUploadSize="5242880"
          p:uploadTempDir="upload/temp">   
    </bean>
    
    <!-- 攔截器 
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.dsideal.common.SysInteceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
    -->
    
<!-- ***********************  simple-spring-memcache ******************************* -->
    <!-- ssm 配置文件,主要用來加載組件核心的Advice,供程序調度使用;封裝在 simple-spring-memcached-3.1.0.jar 文件中-->
    <import resource="simplesm-context.xml" /> 
    <!-- 讓代理機制起到作用,simple-spring-memcached主要是基於AOP的代理  -->
    <aop:aspectj-autoproxy />    
    <!-- com.google.code.ssm.CacheFactory是一個FactoryBean,會返回Cache(高速緩存)實體供Advice使用 -->
    <!-- FactoryBean解決的是如何創建無法直接通過new運算符創建的Bean,並注入到其他的bean中。也就是說FactoryBean是創建或者管理其他被注入和管理Bean的工廠Bean -->
    <bean name="defaultMemcachedClient" class="com.google.code.ssm.CacheFactory">
        <property name="cacheClientFactory">
            <!-- xmemcached配置方法 -->
            <bean name="cacheClientFactory" class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl" />
            <!--  spymemcached配置方法
            <bean name="cacheClientFactory" class="com.google.code.ssm.providers.spymemcached.MemcacheClientFactoryImpl" />
            -->
        </property>
        <!-- 定義了緩存節點的IP地址和端口號 -->
        <property name="addressProvider">
            <bean class="com.google.code.ssm.config.DefaultAddressProvider">
                <property name="address" value="127.0.0.1:11211" />
            </bean>
        </property>
        <!-- 定義了緩存節點的查找方法 -->
        <property name="configuration">
            <bean class="com.google.code.ssm.providers.CacheConfiguration">
                <property name="consistentHashing" value="true" />
            </bean>
        </property>
    </bean>
<!-- ***********************  simple-spring-memcache ******************************* -->
    
</beans>

4. Controller 類文件

package com.dsideal.sys.action;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.dsideal.sys.bean.SysLoginPersonBean;
import com.dsideal.sys.service.ISysMemcachedTestService;

@Controller
public class SysLoginpersonController{
    
       @Resource
       private ISysMemcachedTestService iSysMemcachedTestService;
       
    /**
     * <p>功能:登錄</p>
     * @author 周楓
     * @date 2013-3-7
     * @param 
     * @return void
     */
       @RequestMapping(value="/login",method=RequestMethod.POST)
    public void login(HttpServletRequest request,HttpServletResponse response,@RequestParam("yzm") String yzm,SysLoginPersonBean loginPerson)
       {
           try
           {
               //save person_id to memcached
               //loginPerson.setPerson_id("8BEFBA28-627D-4A37-BAF9-E33FC0F44169");
               //iSysMemcachedTestService.saveLoginPerson(loginPerson);
               
               //get person_id from memcached
//               SysLoginPersonBean lpBean = new SysLoginPersonBean();
//               lpBean = iSysMemcachedTestService.getByPersonId("8BEFBA28-627D-4A37-BAF9-E33FC0F44169");
//               System.out.print(lpBean.getLogin_name());
               
               //delete person_id from memcached
               iSysMemcachedTestService.deletePerson("8BEFBA28-627D-4A37-BAF9-E33FC0F44169");
               
           }
           catch (Exception e) {
            e.printStackTrace();
        }           
       }
}

5. service文件:

package com.dsideal.sys.service;

import com.dsideal.sys.bean.SysLoginPersonBean;
import com.google.code.ssm.api.ParameterDataUpdateContent;
import com.google.code.ssm.api.ParameterValueKeyProvider;

public interface ISysMemcachedTestService {
    public void saveLoginPerson(SysLoginPersonBean lpBean);
    
    public SysLoginPersonBean getByPersonId(@ParameterValueKeyProvider String personId);
    
    public void updatePerson(@ParameterValueKeyProvider @ParameterDataUpdateContent SysLoginPersonBean lpBean);
    
    public void deletePerson(@ParameterValueKeyProvider String personId);
}

6. serviceimpl文件:

解:組件所提供的切入點主要包括以下幾種:
ReadThroughSingleCache、ReadThroughMultiCache、ReadThroughAssignCache
當遇到查詢方法聲明這些切入點時,組件首先會從緩存中讀取數據,取到數據則跳過查詢方法,直接返回。
取不到數據在執行查詢方法,並將查詢結果放入緩存,以便下一次獲取。
InvalidateSingleCache、InvalidateMultiCache、InvalidateAssignCache
當遇到刪除方法聲明這些切入點時,組件會刪除緩存中的對應實體
UpdateSingleCache、UpdateMultiCache、UpdateAssignCache
當遇到更新方法聲明這些切入點是,組件會更新緩存中對應的實體,以便下次從緩存中讀取出的數據狀態是最新的

package com.dsideal.sys.service.impl;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.collections.map.HashedMap;
import org.springframework.stereotype.Service;

import com.dsideal.sys.bean.SysLoginPersonBean;
import com.dsideal.sys.service.ISysMemcachedTestService;
import com.google.code.ssm.api.InvalidateSingleCache;
import com.google.code.ssm.api.ParameterDataUpdateContent;
import com.google.code.ssm.api.ParameterValueKeyProvider;
import com.google.code.ssm.api.ReadThroughSingleCache;
import com.google.code.ssm.api.UpdateSingleCache;

@Service
public class SysMemcachedTestServiceImpl implements ISysMemcachedTestService {
    
    private static final String NAMESPACE = "com.dsideal.sys.service.impl";
    private Map<String,SysLoginPersonBean> person = new HashMap<String,SysLoginPersonBean>();

    @Override
    public void saveLoginPerson(SysLoginPersonBean lpBean) {
        person.put(lpBean.getPerson_id(), lpBean);
    }

    /**
     * ReadThroughSingleCache、ReadThroughMultiCache、ReadThroughAssignCache
        當遇到查詢方法聲明這些切入點時,組件首先會從緩存中讀取數據,取到數據則跳過查詢方法,直接返回。
        取不到數據在執行查詢方法,並將查詢結果放入緩存,以便下一次獲取
     */
    @Override
    @ReadThroughSingleCache(namespace = NAMESPACE, expiration = 600) 
    public SysLoginPersonBean getByPersonId(@ParameterValueKeyProvider String personId) {
        System.out.println(personId);
        return person.get(personId);
    }

    @Override
    @UpdateSingleCache(namespace = NAMESPACE, expiration = 600)
    public void updatePerson(@ParameterValueKeyProvider @ParameterDataUpdateContent SysLoginPersonBean lpBean) {
        person.put(lpBean.getPerson_id(), lpBean);
    }

    @Override
    @InvalidateSingleCache(namespace = NAMESPACE)
    public void deletePerson(@ParameterValueKeyProvider String personId) {
        person.remove(personId);        
    }
    
    

}

7. bean類

注:這里bean一定要序列化,否則不能存入memcached

package com.dsideal.sys.bean;

import java.io.Serializable;

import com.google.code.ssm.api.CacheKeyMethod;

@SuppressWarnings("serial")
public class SysLoginPersonBean implements Serializable{

  private String person_id; private String login_name; private String login_pwd; private int b_use; private int identity_id; private int bureau_id; private String real_name; @CacheKeyMethod public String getPerson_id() { return person_id; } public void setPerson_id(String person_id) { this.person_id = person_id; } public String getLogin_name() { return login_name; } public void setLogin_name(String login_name) { this.login_name = login_name; } public String getLogin_pwd() { return login_pwd; } public void setLogin_pwd(String login_pwd) { this.login_pwd = login_pwd; } public int getB_use() { return b_use; } public void setB_use(int b_use) { this.b_use = b_use; } public int getIdentity_id() { return identity_id; } public void setIdentity_id(int identity_id) { this.identity_id = identity_id; } public int getBureau_id() { return bureau_id; } public void setBureau_id(int bureau_id) { this.bureau_id = bureau_id; } public String getReal_name() { return real_name; } public void setReal_name(String real_name) { this.real_name = real_name; } public SysLoginPersonBean() { } public SysLoginPersonBean(String person_id,String login_name,String login_pwd,int b_use,int identity_id,int bureau_id,String real_name) { this.person_id = person_id; this.login_name = login_name; this.login_pwd = login_pwd; this.b_use = b_use; this.identity_id = identity_id; this.bureau_id = bureau_id; this.real_name = real_name; } }

 

英文官方配置:http://code.google.com/p/simple-spring-memcached/wiki/Getting_Started

本人配置時主要借鑒的文章:http://blog.csdn.net/javaman_chen/article/details/7682290

具體測試方法,我已經寫在controller里面了,需要分開執行測試,也可以參照本人之前寫的博客,原生態的memcached第二種測試方法進行測試,具體鏈接為

這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM