Redis之——Spring基于注解整合Redis

来源:互联网 发布:淘宝网信息管理系统 编辑:程序博客网 时间:2024/05/16 10:48

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/52141372

在《Redis之——Spring整合Redis》一文中,向大家介绍了如何将Spring与Redis整合起来,但不是基于注解的形式,很多同学都希望能够通过注解的形式来简单的将Spring与Redis整合起来,这样,在使用的时候,只需要在相应的方法上加上注解,便可以使方法轻松的调用Redis的缓存。那么今天就来向大家介绍如何用基于注解的形式来整合Spring与Redis。另外,在之前的一篇《Memcached之——整合Spring完整示例》博文中,Spring与Memcached的整合也是基于注解形式的,有兴趣的同学可以参见《Memcached之——整合Spring完整示例》一文。好,我们开始进入正题:

一、项目搭建

今天,我们不使用Hibernate来操作数据库了,我们今天选择的框架是: Spring4(包括mvc、context、orm) + MyBatis3,所以,我们今天的基础架构是:Spring4(包括mvc、context、orm) + MyBatis3+Redis

1、构建pom.xml

<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>lyz</groupId><artifactId>lyz</artifactId><version>1.0.0</version><packaging>war</packaging><name>lyz</name><description>Basic Data Platform</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring.version>4.2.0.RELEASE</spring.version></properties><dependencies><!-- spring mvc related.....start --> <!-- TODO: replace jackson with fastjson --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.3</version></dependency><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.13</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.6.1</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.6.1</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.6.1</version></dependency><!-- spring mvc related.....end --><!-- mybatis orm related.....start --><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.3</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.36</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.3.0</version></dependency><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.12</version></dependency><!-- mybatis orm related.....end --><!-- project log related.....start --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- project log related.....end --><!-- redis cache related.....start --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.6.0.RELEASE</version></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.7.3</version></dependency><!-- redis cache related.....end --></dependencies><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.7</source><target>1.7</target></configuration></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>2.4</version><configuration><warSourceDirectory>WebContent</warSourceDirectory><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin></plugins></build></project>

2、创建测试数据库:lyz,测试数据表:user

DROP DATABASE IF EXISTS `lyz`;CREATE DATABASE `lyz`;DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  `name` varchar(255) DEFAULT NULL,  `sex` varchar(255) DEFAULT NULL,  `age` int(11) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3、创建实体类user

package com.lyz.user.bean;import java.io.Serializable;import org.codehaus.jackson.map.annotate.JsonSerialize;import com.fasterxml.jackson.databind.PropertyNamingStrategy;import com.fasterxml.jackson.databind.annotation.JsonNaming;/** * 用户实体类 * @author liuyazhuang * */@JsonSerialize@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class) public class User implements Serializable{private static final long serialVersionUID = 1332643889208978231L;/** * id */private Integer id;/** * 姓名 */private String name;/** * 性别 */private String sex;/** * 年龄 */private Integer age;public User() {super();}public User(Integer id, String name) {super();this.id = id;this.name = name;}public User(String name, String sex, Integer age) {super();this.name = name;this.sex = sex;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";}}

4、创建UserMapper接口

此接口定义了与MyBatis交互的接口协议,通过此接口与MyBatis框架通信,由MyBatis框架实现对数据库的增删改查操作。

package com.lyz.user.mapper;import java.util.List;import com.lyz.user.bean.User;/** * UserMapper接口 * @author liuyazhuang * */public interface UserMapper {    /**     * 保存用户     * @param user     */    void saveUser(User user);/** * 获取所有用户列表 * @return */List<User> getAllUser();/** * 根据id查询用户信息 * @param id * @return */User getUserById(Integer id);/** * 更新用户的名称 * @param user */void renameUser(User user);/** * 根据id删除指定的用户 * @param id */void deleteUserById(Integer id);}

5、创建UserMapper.xml

此文件中主要实现了UserMapper接口定义的方法,即实现对数据库的增删改查操作。

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.lyz.user.mapper.UserMapper" >    <!-- 插入一条城市记录 -->    <insert id="saveUser" parameterType="com.lyz.user.bean.User">    insert into user (name, sex, age)        values ( #{name}, #{sex}, #{age} )    </insert>    <!-- 根据省份名称返回该省份下的所有城市列表 -->    <select id="getAllUser" resultType="com.lyz.user.bean.User">select u.id, u.name, u.sex, u.age from user u    </select>        <!-- 根据 city_code 查找城市信息 -->    <select id="getUserById" resultType="com.lyz.user.bean.User" parameterType="java.lang.Integer">    select u.id, u.name, u.sex, u.age from user u where u.id = #{id}    </select>        <!-- 重命名城市 -->      <update id="renameUser" parameterType="com.lyz.user.bean.User">    update user set name = #{name} where id = #{id}    </update>          <!-- 删除一个城市记录 -->      <delete id="deleteUserById" parameterType="java.lang.Integer">          delete from user where id = #{id}      </delete>  </mapper>

6、创建UserDao接口

package com.lyz.user.dao;import java.util.List;import com.lyz.user.bean.User;/** * 用户dao接口 * @author liuyazhuang * */public interface UserDao { /**     * 保存用户     * @param user     */    void saveUser(User user);/** * 获取所有用户列表 * @return */List<User> getAllUser();/** * 根据id查询用户信息 * @param id * @return */User getById(Integer id);/** * 更新用户的名称 * @param user */void rename(User user);/** * 根据id删除指定的用户 * @param id */void deleteById(Integer id);}

7、创建UserDao的实现类UserDaoImpl

此类主要实现UserDao中定义的接口,主要实现方法是注入UserMapper接口的实例对象,调用UserMapper接口实例的方法来实现相应的操作。

package com.lyz.user.dao.impl;import java.util.List;import javax.annotation.Resource;import org.springframework.stereotype.Repository;import com.lyz.user.bean.User;import com.lyz.user.dao.UserDao;import com.lyz.user.mapper.UserMapper;/** * Dao实现类 * @author liuyazhuang * */@Repositorypublic class UserDaoImpl implements UserDao {@Resourceprivate UserMapper mUserMapper;@Overridepublic void saveUser(User user) {mUserMapper.saveUser(user);}@Overridepublic List<User> getAllUser() {return mUserMapper.getAllUser();}@Overridepublic User getById(Integer id) {return mUserMapper.getUserById(id);}@Overridepublic void rename(User user) {mUserMapper.renameUser(user);}@Overridepublic void deleteById(Integer id) {mUserMapper.deleteUserById(id);}}

8、创建UserService接口

package com.lyz.user.service;import java.util.List;import com.lyz.user.bean.User;/** * 用户service接口 * @author liuyazhuang * */public interface UserService { /**     * 保存用户     * @param user     */    void saveUser(String name, String sex, Integer age);/** * 获取所有用户列表 * @return */List<User> getAllUser();/** * 根据id查询用户信息 * @param id * @return */User getUserById(Integer id);/** * 更新用户的名称 * @param user */void renameUser(String name, Integer id);/** * 根据id删除指定的用户 * @param id */void deleteUserById(Integer id);}

9、创建UserService接口实现类UserServiceImpl

package com.lyz.user.service.impl;import java.util.List;import javax.annotation.Resource;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;import com.lyz.user.bean.User;import com.lyz.user.dao.UserDao;import com.lyz.user.service.UserService;/** * UserService实现类 * @author liuyazhuang * */@Service@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public class UserServiceImpl implements UserService {@Resourceprivate UserDao mUserDao;@Override@CacheEvict(value = { "saveUser"}, allEntries = true)public void saveUser(String name, String sex, Integer age) {User user = new User(name, sex, age);mUserDao.saveUser(user);}@Override@Cacheable("getAllUser")public List<User> getAllUser() {return mUserDao.getAllUser();}@Override@Cacheable("getUserById")public User getUserById(Integer id) {return mUserDao.getById(id);}@Override@CacheEvict(value = { "getAllUser", "getUserById" }, allEntries = true)public void renameUser(String name, Integer id) {mUserDao.rename(new User(id, name));}@Override@CacheEvict(value = { "getAllUser", "getUserById" }, allEntries = true)public void deleteUserById(Integer id) {mUserDao.deleteById(id);}}

10、创建UserController

package com.lyz.user.controller;import java.util.List;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.lyz.user.bean.User;import com.lyz.user.service.UserService;/** * UserController类 * @author liuyazhuang * */@Controller@RequestMapping("/user")public class UserController {private final Log logger = LogFactory.getLog(this.getClass());@Autowiredprivate UserService mUserService;/** * 保存用户 * @param name * @param sex * @param age * @return */@RequestMapping("/save")@ResponseBodypublic Integer save(@RequestParam(value="name", defaultValue="") String name,@RequestParam(value="sex", defaultValue="") String sex,@RequestParam(value="age", defaultValue="0") String age){logger.debug(name);mUserService.saveUser(name, sex, Integer.parseInt(age));return 1;}/** * 获取所有用户列表 * @return */@RequestMapping("/getall")@ResponseBodypublic Object getAllUser(){List<User> users = mUserService.getAllUser();for(User u : users){logger.debug(u.toString());}return users;}/** * 根据用户id获取用户信息 * @return */@RequestMapping("/getUserById")@ResponseBodypublic Object getUserById(@RequestParam(value="id", defaultValue="0") String id){User user = mUserService.getUserById(Integer.parseInt(id));logger.debug(user.toString());return user;}/** * 根据用户id获取用户信息 * @return */@RequestMapping("/renameUser")@ResponseBodypublic Integer renameUser(@RequestParam(value="id", defaultValue="0") String id,  @RequestParam(value="name", defaultValue="") String name){logger.debug(id + "=========" + name);mUserService.renameUser(name, Integer.parseInt(id));return 1;}/** * 根据用户id获取用户信息 * @return */@RequestMapping("/delete")@ResponseBodypublic Integer delete(@RequestParam(value="id", defaultValue="0") String id){logger.debug(id);mUserService.deleteUserById(Integer.parseInt(id));return 1;}}
到此,只要再创建相应的配置文件,我们就可以实现Spring+MyBatis框架的整合了,下面我们创建一个整合Redis的关键类RedisCacheConfig,这个类继承CachingConfigurerSupport。

11、创建RedisCacheConfig类

package com.lyz.cache.redis;import java.lang.reflect.Method;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;/** * 以Spring与配置文件来管理的redis缓存配置类 * @author liuyazhuang * */@Configuration@EnableCachingpublic class RedisCacheConfig extends CachingConfigurerSupport {private volatile JedisConnectionFactory mJedisConnectionFactory;private volatile RedisTemplate<String, String> mRedisTemplate;private volatile RedisCacheManager mRedisCacheManager;public RedisCacheConfig() {super();}public RedisCacheConfig(JedisConnectionFactory mJedisConnectionFactory, RedisTemplate<String,String> mRedisTemplate,RedisCacheManager mRedisCacheManager) {super();this.mJedisConnectionFactory = mJedisConnectionFactory;this.mRedisTemplate = mRedisTemplate;this.mRedisCacheManager = mRedisCacheManager;}public JedisConnectionFactory redisConnectionFactory() {return mJedisConnectionFactory;}public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {return mRedisTemplate;}public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) {return mRedisCacheManager;}@Beanpublic KeyGenerator customKeyGenerator() {return new KeyGenerator() {@Overridepublic Object generate(Object o, Method method, Object... objects) {StringBuilder sb = new StringBuilder();sb.append(o.getClass().getName());sb.append(method.getName());for (Object obj : objects) {sb.append(obj.toString());}return sb.toString();}};}}
这个类中的所有属性、字段都是在Spring的配置文件lyz-applicationContext.xml文件中注入的,稍后我们介绍如何注入这些属性字段。

下面介绍每个配置文件的内容,注:所有的配置文件(除了web.xml),都是放在classpath路径下的。

12、创建数据库的配置文件jdbc.properties

jdbc.host=127.0.0.1jdbc.database=lyzjdbc.port=3306jdbc.username=rootjdbc.password=root

13、创建log4j日志配置文件log4j.properties

# Global logging configurationlog4j.rootLogger=WARN,stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c:%L - %m%n# mybatis loglog4j.logger.com.lyz.user.mapper.UserMapper=DEBUG# lyz loglog4j.logger.com.lyz.user.controller=DEBUGlog4j.logger.com.lyz.user.service=DEBUG

14、创建redis配置文件redis.properties

# Redis settingsredis.host=192.168.157.130redis.port=6379redis.pass=liuyazhuangredis.dbIndex=0redis.expiration=3000redis.maxIdle=300redis.maxActive=600redis.maxWait=1000redis.testOnBorrow=true

15、创建SpringMVC的配置文件lyzmvc-servlet.xml

<?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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">  <!-- class annotation related... start --><context:component-scan base-package="com.lyz.*.controller" /><!-- class annotation related... end -->  <!-- jsp page related... start --><bean id="viewResolver"class="org.springframework.web.servlet.view.UrlBasedViewResolver"><property name="viewClass"value="org.springframework.web.servlet.view.JstlView" /><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean><!-- jsp page related... end --><!-- rest json related... start --><bean id="mappingJacksonHttpMessageConverter"          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">        <property name="supportedMediaTypes">            <list>                <value>application/json;charset=UTF-8</value>            </list>        </property>    </bean>    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">        <property name="messageConverters">            <list>                <ref bean="mappingJacksonHttpMessageConverter"/>            </list>        </property>    </bean>    <!-- rest json related... end --></beans>

16、创建MyBatis配置文件mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <settings>        <setting name="mapUnderscoreToCamelCase" value="true"/>    </settings></configuration>

17、创建Spring核心配置文件lyz-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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">     <!-- class annotation related... start -->    <context:component-scan base-package="com.lyz"/>   <context:component-scan base-package="com.lyz.*.service" /><context:component-scan base-package="com.lyz.*.service.*" /><context:component-scan base-package="com.lyz.cache.redis" /><!-- class annotation related... end --><context:annotation-config />    <!-- mybatis related... start --><bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><!-- 这里支持多种寻址方式:classpath和file --><value>classpath:jdbc.properties</value><value>classpath:redis.properties</value><!-- 推荐使用file的方式引入,这样可以将配置和代码分离 --></list></property></bean><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource "destroy-method="close"><property name="driverClass" value="com.mysql.jdbc.Driver" /><property name="jdbcUrl" value="jdbc:mysql://${jdbc.host}:${jdbc.port}/${jdbc.database}?useUnicode=true&characterEncoding=utf8" /><property name="user" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><property name="acquireIncrement" value="1" /><property name="initialPoolSize" value="5" /><property name="maxPoolSize" value="20" /><property name="minPoolSize" value="5" /><property name="maxStatements" value="100" /><property name="testConnectionOnCheckout" value="true" /></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configLocation" value="/WEB-INF/classes/mybatis-config.xml" /></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">        <property name="basePackage" value="com.lyz.*.mapper"/>    </bean>    <!-- mybatis related... end --><!-- transaction config related... start --><tx:annotation-driven transaction-manager="transactionManager" /><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!-- transaction config related... end --><!-- redis  config  start --><!-- 配置JedisPoolConfig实例 --><bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxIdle" value="${redis.maxIdle}" /><property name="maxTotal" value="${redis.maxActive}" /><property name="maxWaitMillis" value="${redis.maxWait}" /><property name="testOnBorrow" value="${redis.testOnBorrow}" /></bean><!-- 配置JedisConnectionFactory --><bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><property name="hostName" value="${redis.host}"/><property name="port" value="${redis.port}"/><property name="password" value="${redis.pass}"/><property name="database" value="${redis.dbIndex}"/><property name="poolConfig" ref="poolConfig"/></bean><!-- 配置RedisTemplate --><bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"><property name="connectionFactory" ref="jedisConnectionFactory"/></bean><!-- 配置RedisCacheManager --><bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">     <constructor-arg name="redisOperations" ref="redisTemplate" /><property name="defaultExpiration" value="${redis.expiration}"/></bean><!-- 配置RedisCacheConfig --><bean id="redisCacheConfig" class="com.lyz.cache.redis.RedisCacheConfig"><constructor-arg ref="jedisConnectionFactory" /><constructor-arg ref="redisTemplate" /><constructor-arg ref="redisCacheManager" /></bean><!-- redis  config  end --></beans>
注:在lyz-applicationContext.xml配置文件中,配置了Spring的注解、注入了RedisCacheConfig中的属性字段。

18、完善web.xml文件

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><display-name>lyz</display-name><!-- character encoding related.....start --><!-- TODO : 将 encodingFilter、sysParamsFilter 两个过滤器交给 spring 管理 --><filter><filter-name>encodingFilter</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><init-param>       <param-name>forceEncoding</param-name>       <param-value>true</param-value></init-param></filter><filter-mapping>      <filter-name>encodingFilter</filter-name>      <url-pattern>/*</url-pattern></filter-mapping><!-- 除了加过滤器,由于tomcat默认编码ISO-8859-1,还需要修改 %tomcat%/conf/server.xml Connector 标签加属性 URIEncoding="UTF-8" --><!-- character encoding related.....end --><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/classes/*-applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>lyzmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/classes/*-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>lyzmvc</servlet-name><url-pattern>*.json</url-pattern><url-pattern>*.html</url-pattern></servlet-mapping></web-app>

二、运行测试

这里我们使用Apache JMeter来测试我们的程序,大家可以到http://jmeter.apache.org/download_jmeter.cgi下载Apache JMeter。

1、启动程序,使用JMeter调用保存用户接口

首先按照图示配置JMeter,其中访问路径和端口按照实际需要配置:

点击启动按钮,也就是上方的

图标:

点击“查看结果树”并打开“响应数据”选项:


我们看到返回的结果是1,证明我们成功的调用了保存用户的接口。

下面我们来看看数据库表:

已经将数据保存到数据库了。

2、调用查询用户的接口

首先按照图示配置JMeter,其中访问路径和端口按照实际需要配置:

这些我们先看看redis服务器中是否存在相应的数据:


此时,redis服务器中并没有任何数据,下面我们点击启动,执行程序:

点击“查看结果数”并打开“响应数据”,如下:



返回了相应的数据。

我们再打开控制台看看输出的语句:


说明首次获取数据是从数据库中获取的。下面我们再看看redis缓存中是否存在数据了:


说明首次获取数据,从数据库中取出的数据已经放在了redis缓存服务器中。

我们再次点击Jmeter的启动按钮,执行查询用户的操作:

查看Jmeter的“查看结果数”中的“响应数据”选项:

返回了正确的结果,同时,我们再看看Eclipse的控制台:



已经没有再从数据库中获取数据了,说明再次执行查询用户的操作,程序是直接从Redis缓存中获取的数据。

至此,Spring基于注解整合Redis介绍完毕。

三、源码下载

大家可以到链接http://download.csdn.net/detail/l1028386804/9597255下载Spring基于注解整合Redis的完整示例代码


3 0
原创粉丝点击