136+64÷8+92125×64的简便方法法

&基于 ssm + maven + redis 使用自定义注解 利用aop基于AspectJ方式 实现redis缓存
  如何能更简洁的利用aop实现redis缓存,话不多说,上demo
  需求:     数据查询时每次都需要从数据库查询数据,数据库压力很大,查询速度慢,     因此设置缓存层,查询数据时先从redis中查询,如果查询不到,则到数据库中查询     然后将数据库中查询的数据放到redis中一份,下次查询时就能直接从redis中查到,不需要查询数据库了
  实现过程:
      先搭建ssm的架子,引入redis,编写redis 缓存方法 RedisCache.java以及序列化用到的工具类
      自定义注解
getCache 目的:
            被这个注解标记的方法实现aop
            防止redis key重复
     编写切面
      @Aspect
        @Pointcut("@annotation(com.spring_redis.cache.GetCache)")
        切入点为自定义注解 即每个被该注解标记的方法实现通知
        @Around("getCache()")
        利用环绕通知
          过程: 查询时,先查询redis 如果存在key-value,则返回不查询
          如果不存在,则查询数据库,之后将查询到的数据存入到redis缓存中
          redis key格式:为了防止key冲突,创建的key格式为:
          包名.类名.方法名.参数类型.参数值",类似 "your.package.SomeService.getById(integer).123"
  目录结构
      
  maven依赖:&
1 &properties&
&project.build.sourceEncoding&UTF-8&/project.build.sourceEncoding&
&!-- spring版本号 --&
&spring.version&4.0.6.RELEASE&/spring.version&
&!-- mybatis版本号 --&
&mybatis.version&3.2.7&/mybatis.version&
&/properties&
&dependencies&
&!-- spring核心包 --&
&!-- springframe start --&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-core&/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-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-aop&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-jdbc&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-webmvc&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support --&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context-support&/artifactId&
&version&4.0.6.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context&/artifactId&
&exclusions&
&exclusion&
&groupId&commons-logging&/groupId&
&artifactId&commons-logging&/artifactId&
&/exclusion&
&/exclusions&
&version&${spring.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-test&/artifactId&
&version&${spring.version}&/version&
&/dependency&
&!-- springframe end --&
&!-- aop注解
&dependency&
&groupId&org.aspectj&/groupId&
&artifactId&aspectjrt&/artifactId&
&version&1.6.12&/version&
&/dependency&
&dependency&
&groupId&org.aspectj&/groupId&
&artifactId&aspectjweaver&/artifactId&
&version&1.6.12&/version&
&/dependency&
&dependency&
&groupId&cglib&/groupId&
&artifactId&cglib&/artifactId&
&version&2.2&/version&
&/dependency&
&!-- mysql驱动包 --&
&dependency&
&groupId&mysql&/groupId&
<span style="color: #0
&artifactId&mysql-connector-java&/artifactId&
<span style="color: #1
&version&5.1.31&/version&
<span style="color: #2
&/dependency&
<span style="color: #3
<span style="color: #4
&!-- dbcp2连接池 --&
<span style="color: #5
&dependency&
<span style="color: #6
&groupId&org.apache.commons&/groupId&
<span style="color: #7
&artifactId&commons-dbcp2&/artifactId&
<span style="color: #8
&version&2.0.1&/version&
<span style="color: #9
&/dependency&
<span style="color: #0
<span style="color: #1
&!-- json数据 --&
<span style="color: #2
&dependency&
<span style="color: #3
&groupId&org.codehaus.jackson&/groupId&
<span style="color: #4
&artifactId&jackson-mapper-asl&/artifactId&
<span style="color: #5
&version&1.9.13&/version&
<span style="color: #6
&/dependency&
<span style="color: #7
<span style="color: #8
&!-- mybatis核心包 --&
<span style="color: #9
&dependency&
<span style="color: #0
&groupId&org.mybatis&/groupId&
<span style="color: #1
&artifactId&mybatis&/artifactId&
<span style="color: #2
&version&${mybatis.version}&/version&
<span style="color: #3
&/dependency&
<span style="color: #4
&!-- mybatis/spring包 --&
<span style="color: #5
&dependency&
<span style="color: #6
&groupId&org.mybatis&/groupId&
<span style="color: #7
&artifactId&mybatis-spring&/artifactId&
<span style="color: #8
&version&1.2.2&/version&
<span style="color: #9
&/dependency&
<span style="color: #0
<span style="color: #1
&dependency&
<span style="color: #2
&groupId&org.springframework.data&/groupId&
<span style="color: #3
&artifactId&spring-data-redis&/artifactId&
<span style="color: #4
&version&1.6.1.RELEASE&/version&
<span style="color: #5
&/dependency&
<span style="color: #6
&dependency&
<span style="color: #7
&groupId&redis.clients&/groupId&
<span style="color: #8
&artifactId&jedis&/artifactId&
<span style="color: #9
&version&2.7.3&/version&
<span style="color: #0
&/dependency&
<span style="color: #1
<span style="color: #2
&!-- servlet-api --&
<span style="color: #3
&dependency&
<span style="color: #4
&groupId&javax.servlet&/groupId&
<span style="color: #5
&artifactId&javax.servlet-api&/artifactId&
<span style="color: #6
&version&3.0.1&/version&
<span style="color: #7
&scope&provided&/scope&
<span style="color: #8
&/dependency&
<span style="color: #9
&dependency&
<span style="color: #0
&groupId&javax.servlet.jsp&/groupId&
<span style="color: #1
&artifactId&jsp-api&/artifactId&
<span style="color: #2
&version&2.2&/version&
<span style="color: #3
&scope&provided&/scope&
<span style="color: #4
&/dependency&
<span style="color: #5
&!-- servlet-api end --&
<span style="color: #6
<span style="color: #7
&dependency&
<span style="color: #8
&groupId&log4j&/groupId&
<span style="color: #9
&artifactId&log4j&/artifactId&
<span style="color: #0
&version&1.2.17&/version&
<span style="color: #1
&/dependency&
<span style="color: #2
&/dependencies&
<span style="color: #3
&  这里只给出redis 的相关配置
    在applicationContext-dao.xml 里添加
1 &?xml version="1.0" encoding="UTF-8"?&
2 &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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
<span style="color: #
http://www.springframework.org/schema/context/spring-context-3.2.xsd
<span style="color: #
http://www.springframework.org/schema/tx
<span style="color: #
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
<span style="color: #
http://www.springframework.org/schema/aop
<span style="color: #
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
<span style="color: #
http://www.springframework.org/schema/util
<span style="color: #
http://www.springframework.org/schema/util/spring-util-3.2.xsd"&
<span style="color: #
<span style="color: #
<span style="color: #
&!-- 加载db.properties文件中的内容,db.properties文件中key命名要有一定的特殊规则 --&
<span style="color: #
&context:property-placeholder location="classpath:properties/db.properties" /&
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
&!-- 配置数据源 ,dbcp --&
<span style="color: #
<span style="color: #
&bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"&
<span style="color: #
&property name="driverClassName" value="${jdbc.driver}" /&
<span style="color: #
&property name="url" value="${jdbc.url}" /&
<span style="color: #
&property name="username" value="${jdbc.username}" /&
<span style="color: #
&property name="password" value="${jdbc.password}" /&
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
&bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
<span style="color: #
p:dataSource-ref="dataSource" p:configLocation="classpath:mybatis/sqlMapConfig.xml"
<span style="color: #
<span style="color: #
&!-- Redis和缓存配置开始 --&
<span style="color: #
&!-- jedis 配置 --&
<span style="color: #
&bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" &
<span style="color: #
&property name="maxIdle" value="100" /&
<span style="color: #
&property name="maxWaitMillis" value="1000" /&
<span style="color: #
&property name="testOnBorrow" value="true" /&
<span style="color: #
<span style="color: #
<span style="color: #
&!-- redis连接池 --&
<span style="color: #
&bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close"&
<span style="color: #
&constructor-arg name="poolConfig" ref="poolConfig"/&
<span style="color: #
&constructor-arg name="host" value="127.0.0.1"/&
<span style="color: #
&constructor-arg name="port" value="6379"/&
<span style="color: #
<span style="color: #
<span style="color: #
&!-- redis服务器中心 --&
<span style="color: #
&bean id="connectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" &
<span style="color: #
&property name="poolConfig" ref="poolConfig" /&
<span style="color: #
&property name="port" value="6379" /&
<span style="color: #
&property name="hostName" value="127.0.0.1" /&
<span style="color: #
&!-- &property name="password" value="${redis.password}" /& --&
<span style="color: #
&property name="timeout" value="10000" &&/property&
<span style="color: #
<span style="color: #
&bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" &
<span style="color: #
&property name="connectionFactory" ref="connectionFactory" /&
<span style="color: #
&property name="keySerializer" &
<span style="color: #
&bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /&
<span style="color: #
&/property&
<span style="color: #
&property name="valueSerializer" &
<span style="color: #
&bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /&
<span style="color: #
&/property&
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
&!-- cache配置 --&
<span style="color: #
&bean id="putCache" class="com.spring_redis.cache.PutCacheAOP" &
<span style="color: #
&property name="redisTemplate" ref="redisTemplate" /&
<span style="color: #
<span style="color: #
<span style="color: #
&!-- cache配置 --&
<span style="color: #
&bean id="getCache" class="com.spring_redis.cache.GetCacheAOP" &
<span style="color: #
&property name="redisTemplate" ref="redisTemplate" /&
<span style="color: #
<span style="color: #
<span style="color: #
&!-- Redis和缓存配置结束 --&
<span style="color: #
<span style="color: #
&!-- mapper扫描器 --&
<span style="color: #
&bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"&
<span style="color: #
&!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开 --&
<span style="color: #
&property name="basePackage" value="com.spring_redis.mapper"&&/property&
<span style="color: #
&property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/&
<span style="color: #
<span style="color: #
<span style="color: #
&bean id="roomservice" class="com.spring_redis.service.impl.RoomServiceImpl" &
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: # &/beans&
  springmvc.xml
1 &beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
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-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
<span style="color: #
http://www.springframework.org/schema/context/spring-context-3.2.xsd
<span style="color: #
http://www.springframework.org/schema/aop
<span style="color: #
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
<span style="color: #
http://www.springframework.org/schema/tx
<span style="color: #
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "&
<span style="color: #
<span style="color: #
&aop:aspectj-autoproxy proxy-target-class="true"/&
<span style="color: #
<span style="color: #
&!-- 可以扫描controller、service、... 这里让扫描controller,指定controller的包 com.ssm.controlle --&
<span style="color: #
&context:component-scan base-package="com.spring_redis"&
<span style="color: #
&/context:component-scan&
<span style="color: #
&!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置 mvc:annotation-driven默认加载很多的参数绑定方法 --&
<span style="color: #
&mvc:annotation-driven /&
<span style="color: #
&!-- 视图解析器 解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包 --&
<span style="color: #
<span style="color: #
class="org.springframework.web.servlet.view.InternalResourceViewResolver"&
<span style="color: #
&!-- 配置jsp路径的前缀 &property name="prefix" value="/jsp/"/& --&
<span style="color: #
&!-- 配置jsp路径的后缀 --&
<span style="color: #
&property name="suffix" value=".jsp" /&
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: # &/beans&
& &&aop:aspectj-autoproxy proxy-target-class="true"/& &开启注解这个一定要写到springmvc.xml里,否则注解会不起作用
  那重点开始了
  创建自定义注解
* 自定义注解,对于查询使用缓存的方法加入该注解
* @author Chenth
5 @Retention(RetentionPolicy.RUNTIME)
6 @Target({ElementType.METHOD})
7 public @interface GetCache {
String name() default "";
String value() default "";
<span style="color: # }
  被这个自定义注解所标记的方法将实现下面的切面
  配置切面
1 package com.spring_redis.
3 import java.io.S
4 import java.lang.reflect.M
7 import org.aspectj.lang.JoinP
8 import org.aspectj.lang.ProceedingJoinP
9 import org.aspectj.lang.annotation.A
10 import org.aspectj.lang.annotation.A
11 import org.aspectj.lang.annotation.P
12 import org.aspectj.lang.reflect.MethodS
13 import org.springframework.beans.factory.annotation.A
14 import org.springframework.data.redis.core.RedisT
15 import org.springframework.stereotype.C
17 import com.spring_redis.util.RedisC
19 @Component
20 @Aspect
21 public class GetCacheAOP
@Autowired
private RedisTemplate&Serializable, Object& redisT
private RedisCache redisCache = new RedisCache();
@Pointcut("@annotation(com.spring_redis.cache.GetCache)")
public void getCache(){
System.out.println("我是一个切入点");
* 在所有标注@getCache的地方切入
* @param joinPoint
@Around("getCache()")
public Object beforeExec(ProceedingJoinPoint joinPoint){
//前置:到redis中查询缓存
System.out.println("调用从redis中查询的方法...");
//redis中key格式:
String redisKey = getCacheKey(joinPoint);
//获取从redis中查询到的对象
Object objectFromRedis = redisCache.getDataFromRedis(redisKey);
//如果查询到了
if(null != objectFromRedis){
System.out.println("从redis中查询到了数据...不需要查询数据库");
return objectFromR
System.out.println("没有从redis中查到数据...");
//没有查到,那么查询数据库
Object object = null;
object = joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
System.out.println("从数据库中查询的数据...");
//后置:将数据库中查询的数据放到redis中
System.out.println("调用把数据库查询的数据存储到redis中的方法...");
redisCache.setDataToRedis(redisKey, object);
System.out.println("redis中的数据..."+object.toString());
//将查询到的数据返回
* 根据类名、方法名和参数值获取唯一的缓存键
* @return 格式为 "包名.类名.方法名.参数类型.参数值",类似 "your.package.SomeService.getById(int).123"
@SuppressWarnings("unused")
private String getCacheKey(ProceedingJoinPoint joinPoint) {
MethodSignature ms=(MethodSignature) joinPoint.getSignature();
Method method=ms.getMethod();
String ActionName = method.getAnnotation(GetCache.class).name();
String fieldList = method.getAnnotation(GetCache.class).value();
//System.out.println("签名是"+ms.toString());
for (String field:fieldList.split(","))
ActionName +="."+
//先获取目标方法参数
String id = null;
Object[] args = joinPoint.getArgs();
if (args != null && args.length & 0) {
<span style="color: #0
id = String.valueOf(args[0]);
<span style="color: #1
<span style="color: #2
<span style="color: #3
ActionName += "="+
<span style="color: #4
String redisKey = ms+"."+ActionN
<span style="color: #5
return redisK
<span style="color: #6
<span style="color: #7
<span style="color: #8
<span style="color: #9
public void setRedisTemplate(
<span style="color: #0
RedisTemplate&Serializable, Object& redisTemplate) {
<span style="color: #1
this.redisTemplate = redisT
<span style="color: #2
<span style="color: #3 }
@Pointcut("@annotation(com.spring_redis.cache.GetCache)") 这个切入点的作用是
                                      在所有标注@getCache的地方切入
@Around("getCache()")这里用的是后置通知,即查询之前先查询redis,如果有数据就返回数据,没有就穿透的数据库查询数据,之后再缓存到redis中
  这里并没有太多的讲解配置ssm框架,可能后续会写关于spring+springmvc+mybatis的框架整合
  编写mapper层,service层,controller层
  mapper
* @description 持久化
public interface RoomMapper {
@Insert("insert into room(roomName,address) values(#{roomName},#{addRess})")
int insert(Room room);
@Select("select * from room where id=#{id}")
public Room selectByPrimaryKey(@Param("id")Integer id);
  service
* @description test
7 public interface RoomService {
<span style="color: #
int insert(Room room)throws E
<span style="color: #
<span style="color: #
<span style="color: #
Room selectByPrimaryKey(Integer id)throws E
<span style="color: #
<span style="color: # }
<span style="color: #
<span style="color: # // 实现
<span style="color: # /**
<span style="color: #
<span style="color: #
<span style="color: #
* @description
<span style="color: #
<span style="color: # public class RoomServiceImpl implements RoomService{
<span style="color: #
<span style="color: #
@Autowired
<span style="color: #
private RoomM
<span style="color: #
<span style="color: #
<span style="color: #
public int insert(Room room) throws Exception {
<span style="color: #
<span style="color: #
return mapper.insert(room);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
public Room selectByPrimaryKey(Integer id) throws Exception {
<span style="color: #
<span style="color: #
return mapper.selectByPrimaryKey(id);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: # }
   controller
* @description test controller
@Controller
@RequestMapping("room")
public class RoomController {
@Autowired
private RoomService
@GetCache(name="room",value="id")
@RequestMapping("selectByPrimaryKey")
public @ResponseBody Object roomList(Integer id) throws Exception{
System.out.println("已查询到数据,准备缓存到redis...
"+roomService.selectByPrimaryKey(id).getRoomName());
return roomService.selectByPrimaryKey(id);
  缓存要用到的工具类 &RedisCache
1 public class RedisCache {
@Autowired
private JedisPool jedisPool = new JedisPool();
//从redis缓存中查询,反序列化
public Object getDataFromRedis(String redisKey){
<span style="color: #
Jedis jedis = jedisPool.getResource();
<span style="color: #
byte[] result = jedis.get(redisKey.getBytes());
<span style="color: #
<span style="color: #
//如果查询没有为空
<span style="color: #
if(null == result){
<span style="color: #
return null;
<span style="color: #
<span style="color: #
<span style="color: #
//查询到了,反序列化
<span style="color: #
return SerializeUtil.unSerialize(result);
<span style="color: #
<span style="color: #
<span style="color: #
//将数据库中查询到的数据放入redis
<span style="color: #
public void setDataToRedis(String redisKey, Object obj){
<span style="color: #
<span style="color: #
<span style="color: #
byte[] bytes = SerializeUtil.serialize(obj);
<span style="color: #
<span style="color: #
//存入redis
<span style="color: #
Jedis jedis = jedisPool.getResource();
<span style="color: #
String success = jedis.set(redisKey.getBytes(), bytes);
<span style="color: #
<span style="color: #
if("OK".equals(success)){
<span style="color: #
System.out.println("数据成功保存到redis...");
<span style="color: #
<span style="color: #
<span style="color: # }
  缓存要用到的序列化和反序列化工具
* @Description: 序列化反序列化工具
5 public class SerializeUtil {
<span style="color: #
public static byte[] serialize(Object obj){
<span style="color: #
<span style="color: #
ObjectOutputStream oos = null;
<span style="color: #
ByteArrayOutputStream baos = null;
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
baos = new ByteArrayOutputStream();
<span style="color: #
oos = new ObjectOutputStream(baos);
<span style="color: #
<span style="color: #
oos.writeObject(obj);
<span style="color: #
byte[] byteArray = baos.toByteArray();
<span style="color: #
return byteA
<span style="color: #
<span style="color: #
} catch (IOException e) {
<span style="color: #
e.printStackTrace();
<span style="color: #
<span style="color: #
return null;
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
* 反序列化
<span style="color: #
* @param bytes
<span style="color: #
<span style="color: #
<span style="color: #
public static Object unSerialize(byte[] bytes){
<span style="color: #
<span style="color: #
ByteArrayInputStream bais = null;
<span style="color: #
<span style="color: #
<span style="color: #
//反序列化为对象
<span style="color: #
bais = new ByteArrayInputStream(bytes);
<span style="color: #
ObjectInputStream ois = new ObjectInputStream(bais);
<span style="color: #
return ois.readObject();
<span style="color: #
<span style="color: #
} catch (Exception e) {
<span style="color: #
e.printStackTrace();
<span style="color: #
<span style="color: #
return null;
<span style="color: #
<span style="color: # }
 以上就是利用aop+自定义注解实现 redis缓存的过程了
      有不对之处,还望指出 欢迎留言
有参考到的文章:http://www.cnblogs.com/mrlinfeng/p/5857775.html
        http://blog.csdn.net/chentian610/article/details/
阅读(...) 评论()}

我要回帖

更多关于 数角的简便方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信