常用框架(二) : spring+springMvc+mybatis+maven+redis
在上一篇常用框架(一)中已经搭建好了基本框架,这里主要是集成 redis 缓存框架到项目中,作为补充。
需要查看前篇的请点这里跳转:http://blog.****.net/mynoteblog/article/details/54922775
先来看下项目结构:
一,在pom.xml 中追加redis依赖包,由于改动比较多,这里还是直接贴上全部内容,以免遗漏:
- <project xmlns="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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.maven.web</groupId>
- <artifactId>com.maven.web</artifactId>
- <packaging>war</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>com.maven.web Maven Webapp</name>
- <properties>
- <spring.version>4.3.0.RELEASE</spring.version>
- <jackson.version>2.6.5</jackson.version>
- <fastjson.version>1.2.23</fastjson.version>
- <mybatis.version>3.3.0</mybatis.version>
- <mybatis-spring.version>1.2.3</mybatis-spring.version>
- <mysql.connector.version>5.1.29</mysql.connector.version>
- <jedis.version>2.7.3</jedis.version>
- <spring.data.redis.version>1.7.1.RELEASE</spring.data.redis.version>
- </properties>
- <repositories>
- <repository>
- <id>spring-milestones</id>
- <name>Spring Milestones</name>
- <url>https://repo.spring.io/libs-milestone</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- </repositories>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- <!-- @Resource注解包 -->
- <dependency>
- <groupId>javax.annotation</groupId>
- <artifactId>javax.annotation-api</artifactId>
- <version>1.2</version>
- </dependency>
- <!-- Spring -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-expression</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-beans</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-context</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context-support</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-orm</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-oxm</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-tx</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-web</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <!-- 数据库连接池 -->
- <dependency>
- <groupId>commons-dbcp</groupId>
- <artifactId>commons-dbcp</artifactId>
- <version>1.4</version>
- </dependency>
- <!-- mybatis start -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>${mybatis.version}</version>
- </dependency>
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-spring</artifactId>
- <version>${mybatis-spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-generator-core</artifactId>
- <version>1.3.2</version>
- </dependency>
- <!-- mysql -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>${mysql.connector.version}</version>
- </dependency>
- <!-- StringUtils -->
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- <version>3.4</version>
- </dependency>
- <!-- jackson -->
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>${jackson.version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>${jackson.version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-annotations</artifactId>
- <version>${jackson.version}</version>
- </dependency>
- <!-- fastjson -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>${fastjson.version}</version>
- </dependency>
- <!-- fastjson -->
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <version>3.1.0</version>
- <scope>provided</scope>
- </dependency>
- <!-- redis start -->
- <dependency>
- <groupId>redis.clients</groupId>
- <artifactId>jedis</artifactId>
- <version>${jedis.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-redis</artifactId>
- <version>${spring.data.redis.version}</version>
- </dependency>
- <!-- redis end -->
- </dependencies>
- <build>
- <finalName>com.maven.web</finalName>
- </build>
- </project>
- <?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"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
- <!-- blockWhenExhausted: 从Pool中获取Jedis对象,Pool资源耗尽后阻塞maxWaitMillis参数指定时间 -->
- <!-- maxWaitMillis: 从Pool中获取Jedis对象超时时间 -->
- <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"
- p:minIdle="2"
- p:maxIdle="5"
- p:maxTotal="8"
- p:maxWaitMillis="2000"
- p:testOnBorrow="false"
- p:testOnReturn="false"
- p:testWhileIdle="true"
- p:blockWhenExhausted="true" />
- <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
- <property name="usePool" value="true" />
- <property name="hostName" value="192.168.230.130" />
- <property name="port" value="6379" />
- <property name="password" value="" />
- <property name="timeout" value="2000" />
- <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
- </bean>
- <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
- <property name="connectionFactory" ref="jedisConnectionFactory" />
- </bean>
- </beans>
***********************************
这里需要说明一下:
hostName:填写安装有redis的服务器地址,我这里是安装到本地虚拟机的,如何安装请参看博客:http://www.cnblogs.com/yun965861480/p/6273451.html
port:默认端口是6379
password:自己设置,我这里为空
下面是我启动虚拟机中redis服务的截图,在启动我们项目之前,需要先启动redis:
三,Spring-config.xml 原来的配置中引入redis 的配置文件,如下:
- <import resource="classpath:Spring-redis.xml" />
四,redis的使用,我这里直接用的工具类,代码分享如下:
(1) RedisService
- package com.maven.web.redis;
- import java.util.Collection;
- import java.util.concurrent.TimeUnit;
- import java.util.function.Supplier;
- /**
- * redis缓存接口。
- *
- * 缓存时间单位默认分钟,
- * 默认timeout值为5,
- * 没有timeout和timeunit的方法默认不设置有效时间,永久有效。
- */
- public interface RedisService {
- int EXPIRE_TIME_1 = 1;
- int EXPIRE_TIME_2 = 2;
- int EXPIRE_TIME_5 = 5;
- int EXPIRE_TIME_7 = 7;
- int EXPIRE_TIME_15 = 15;
- int EXPIRE_TIME_30 = 30;
- <T> void put(String key, T obj);
- <T> void put(String key, T obj, int timeout);
- <T> void put(String key, T obj, int timeout, TimeUnit unit);
- <T> T get(String key, Class<T> cls);
- <E, T extends Collection<E>> T get(String key, Class<E> cls, Class<T> collectionClass);
- <T> T putIfAbsent(String key, Class<T> cls, Supplier<T> supplier);
- <T> T putIfAbsent(String key, Class<T> cls, Supplier<T> supplier, int timeout);
- <T> T putIfAbsent(String key, Class<T> cls, Supplier<T> supplier, int timeout, TimeUnit unit);
- <T> T putIfAbsent(String key, Class<T> cls, Supplier<T> supplier, int timeout, TimeUnit unit, boolean refresh);
- <E, T extends Collection<E>> T putIfAbsent(String key, Class<E> cls, Class<T> collectionCls, Supplier<T> supplier);
- <E, T extends Collection<E>> T putIfAbsent(String key, Class<E> cls, Class<T> collectionCls, Supplier<T> supplier, int timeout);
- <E, T extends Collection<E>> T putIfAbsent(String key, Class<E> cls, Class<T> collectionCls, Supplier<T> supplier, int timeout, TimeUnit unit);
- <E, T extends Collection<E>> T putIfAbsent(String key, Class<E> cls, Class<T> collectionCls, Supplier<T> supplier, int timeout, TimeUnit unit, boolean refresh);
- boolean exists(String key);
- void delete(String key);
- boolean expire(String key, long timeout, TimeUnit timeUnit);
- boolean expire(String key, long timeout);
- void put(String key, String value);
- void put(String key, String value, int timeout);
- void put(String key, String value, int timeout, TimeUnit unit);
- String get(String key);
- }
(2) RedisServiceImpl
- package com.maven.web.redis;
- import java.util.Collection;
- import java.util.concurrent.TimeUnit;
- import java.util.function.Supplier;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.redis.core.StringRedisTemplate;
- import org.springframework.stereotype.Component;
- import com.maven.web.util.JsonUtils;
- @Component("redisService")
- public class RedisServiceImpl implements RedisService {
- private StringRedisTemplate redisTemplate;
- @Autowired
- public void setRedisTemplate(StringRedisTemplate redisTemplate) {
- this.redisTemplate = redisTemplate;
- }
- public <T> void put(String key, T obj) {
- redisTemplate.opsForValue().set(key, JsonUtils.toJson(obj));
- }
- public <T> void put(String key, T obj, int timeout) {
- put(key, obj, timeout, TimeUnit.MINUTES);
- }
- public <T> void put(String key, T obj, int timeout, TimeUnit unit) {
- redisTemplate.opsForValue().set(key, JsonUtils.toJson(obj), timeout, unit);
- }
- public <T> T get(String key, Class<T> cls) {
- return JsonUtils.fromJson(redisTemplate.opsForValue().get(key), cls);
- }
- public <E, T extends Collection<E>> T get(String key, Class<E> cls, Class<T> collectionClass) {
- return JsonUtils.fromJson(redisTemplate.opsForValue().get(key), cls, collectionClass);
- }
- public <T> T putIfAbsent(String key, Class<T> cls, Supplier<T> supplier) {
- T t = get(key, cls);
- if (t == null) {
- t = supplier.get();
- if (t != null) {
- put(key, t);
- }
- }
- return t;
- }
- public <T> T putIfAbsent(String key, Class<T> cls, Supplier<T> supplier, int timeout) {
- T t = get(key, cls);
- if (t == null) {
- t = supplier.get();
- if (t != null) {
- put(key, t, timeout);
- }
- }
- return t;
- }
- public <T> T putIfAbsent(String key, Class<T> cls, Supplier<T> supplier, int timeout, TimeUnit unit) {
- T t = get(key, cls);
- if (t == null) {
- t = supplier.get();
- if (t != null) {
- put(key, t, timeout, unit);
- }
- }
- return t;
- }
- public <T> T putIfAbsent(String key, Class<T> cls, Supplier<T> supplier, int timeout, TimeUnit unit, boolean refresh) {
- T t = get(key, cls);
- if (t == null) {
- t = supplier.get();
- if (t != null) {
- put(key, t, timeout, unit);
- }
- } else {
- if (refresh) {
- expire(key, timeout, unit);
- }
- }
- return t;
- }
- public <E, T extends Collection<E>> T putIfAbsent(String key, Class<E> cls, Class<T> collectionCls, Supplier<T> supplier) {
- T t = get(key, cls, collectionCls);
- if (t == null || t.isEmpty()) {
- t = supplier.get();
- if (t != null && t.size() > 0) {
- put(key, t);
- }
- }
- return t;
- }
- public <E, T extends Collection<E>> T putIfAbsent(String key, Class<E> cls, Class<T> collectionCls, Supplier<T> supplier, int timeout) {
- return putIfAbsent(key, cls, collectionCls, supplier, timeout, TimeUnit.SECONDS);
- }
- public <E, T extends Collection<E>> T putIfAbsent(String key, Class<E> cls, Class<T> collectionCls, Supplier<T> supplier, int timeout, TimeUnit unit) {
- return putIfAbsent(key, cls, collectionCls, supplier, timeout, unit, false);
- }
- public <E, T extends Collection<E>> T putIfAbsent(String key, Class<E> cls, Class<T> collectionCls, Supplier<T> supplier, int timeout, TimeUnit unit, boolean refresh) {
- T t = get(key, cls, collectionCls);
- if (t == null || t.isEmpty()) {
- t = supplier.get();
- if (t != null && t.size() > 0) {
- put(key, t, timeout, unit);
- }
- } else {
- if (refresh) {
- expire(key, timeout, unit);
- }
- }
- return t;
- }
- public boolean exists(String key) {
- return redisTemplate.hasKey(key);
- }
- public void delete(String key) {
- redisTemplate.delete(key);
- }
- public boolean expire(String key, long timeout, TimeUnit timeUnit) {
- return redisTemplate.expire(key, timeout, timeUnit);
- }
- public boolean expire(String key, long timeout) {
- return expire(key, timeout, TimeUnit.MINUTES);
- }
- public void put(String key, String value) {
- redisTemplate.opsForValue().set(key, value);
- }
- public void put(String key, String value, int timeout) {
- put(key, value, timeout, TimeUnit.MINUTES);
- }
- public void put(String key, String value, int timeout, TimeUnit unit) {
- redisTemplate.opsForValue().set(key, value, timeout, unit);
- }
- public String get(String key) {
- return redisTemplate.opsForValue().get(key);
- }
- }
- package com.maven.web.util;
- import java.io.IOException;
- import java.text.SimpleDateFormat;
- import java.util.Collection;
- import org.apache.commons.lang3.StringUtils;
- import com.fasterxml.jackson.core.JsonProcessingException;
- import com.fasterxml.jackson.databind.DeserializationFeature;
- import com.fasterxml.jackson.databind.JavaType;
- import com.fasterxml.jackson.databind.ObjectMapper;
- public final class JsonUtils {
- //public static final Logger LOGGER = LoggerFactory.getLogger(JsonUtils.class);
- private JsonUtils() {}
- private static ObjectMapper objectMapper;
- static {
- objectMapper = new JsonObjectMapper();
- objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
- objectMapper.setDateFormat(new SimpleDateFormat("yyyyMMddHHmmss"));
- }
- public static <T> String toJson(T obj) {
- try {
- return objectMapper.writeValueAsString(obj);
- } catch (JsonProcessingException e) {
- e.printStackTrace();
- //LOGGER.error("class: {} serialize to JSON error: {}", ToStringBuilder.reflectionToString(obj), e);
- }
- return null;
- }
- public static <T> T fromJson(String json, Class<T> cls) {
- try {
- if (StringUtils.isBlank(json)) {
- return null;
- }
- return objectMapper.readValue(json, cls);
- } catch (IOException e) {
- e.printStackTrace();
- //LOGGER.error("deserialize failed! JSON string: {}, class: {}, reason: {}", json, cls, e);
- }
- return null;
- }
- public static <E, T extends Collection<E>> T fromJson(String json, Class<E> cls, Class<T> collectionCls) {
- if (StringUtils.isBlank(json)) {
- return null;
- }
- JavaType javaType = objectMapper.getTypeFactory().constructParametricType(collectionCls, cls);
- try {
- return objectMapper.readValue(json, javaType);
- } catch (IOException e) {
- e.printStackTrace();
- /*LOGGER.error("deserialize failed! JSON string: {}, Object class:{}, Collection class: {}, reason: {}",
- json, cls, collectionCls, e);*/
- }
- return null;
- }
- }
- package com.maven.web.util;
- import java.io.IOException;
- import com.fasterxml.jackson.core.JsonGenerator;
- import com.fasterxml.jackson.core.JsonParser;
- import com.fasterxml.jackson.core.JsonProcessingException;
- import com.fasterxml.jackson.databind.JsonSerializer;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import com.fasterxml.jackson.databind.SerializerProvider;
- public class JsonObjectMapper extends ObjectMapper {
- private static final long serialVersionUID = 4769299031472855116L;
- public JsonObjectMapper() {
- // 允许单引号
- this.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
- // 字段和值都加引号
- this.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
- // 数字也加引号
- /*this.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true);
- this.configure(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS, true);*/
- // 空值处理为空串
- this.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
- @Override
- public void serialize(
- Object value,
- JsonGenerator jg,
- SerializerProvider sp) throws IOException, JsonProcessingException {
- jg.writeString("");
- }
- });
- }
- }
五,准备工作做好了,接下来是测试
(1) 新增RedisController,代码如下:
- package com.maven.web.controller;
- import javax.annotation.Resource;
- 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 org.springframework.web.bind.annotation.ResponseBody;
- import com.maven.web.entity.UserInfo;
- import com.maven.web.service.impl.UserService;
- @Controller
- @RequestMapping("/redis")
- public class RedisController {
- @Resource
- private UserService userService;
- @ResponseBody
- @RequestMapping(value="/userInfo",method=RequestMethod.GET)
- public String getUserInfo(@RequestParam Long uid){
- UserInfo userInfo = userService.getUserInfo(uid);
- if(userInfo!=null){
- return "您要获取的用户名称是:"+userInfo.getUserName();
- }
- return "获取用户信息失败";
- }
- }
- /** 从缓存中获取 */
- UserInfo getUserInfo(Long uid);
- public UserInfo getUserInfo(Long uid) {
- String json = redisService.get(USER_INFO+uid);
- if(json==null){
- UserInfo userInfo = select(uid);
- if(userInfo!=null){
- redisService.put(USER_INFO+uid, userInfo, 1, TimeUnit.HOURS);
- }
- return userInfo;
- }
- return JsonUtils.fromJson(json, UserInfo.class);
- }
开启debug模式进入后台可以看到,第一次是从数据库查询数据,第二次就是从缓存取数据了:
再看返回结果:
**********************************************************************************************
测试成功,到此集成redis框架就完成了,需要参考项目源码的请点这里:http://pan.baidu.com/s/1kVPr
相关推荐
- .NET深入解析LINQ框架(二:LINQ优雅的前奏)
- 网络安全学习篇36_第二阶段_简单介绍Java Web框架之Tomcat服务、Nginx负载均衡、Linux包过滤防火墙IPtables、NAT网络地址转换
- (二)最常用的量子计算模型——量子线路
- 从零开始写javaweb框架(第二章)—— 所遇到的问题 与 解决方法
- ASP.NET企业开发框架IsLine FrameWork系列之二--命名空间与契约
- 谈谈计算机和网络常用进位制:二进制(Binary)、十进制(Decimal)和十六进制(He...
- 【自然框架】之通用权限(二):人员表组
- Spring框架(二)——代理模式,看完整个体系轻松进入BAT大厂
- Maven学习(二) 修改settings文件和常用命令 Maven核心概念
- 淘淘商城系列(二)—— 什么是dubbo框架?如何使用它呢?(二)
- SQL返回Map集合或者对象
- 8.0通知栏新增通知渠道