spring布置memcached的aop遇到的问题

在布置memcached的缓存的问题时候,遇到问题如下:

1.布置memcached的xml配置,memcached.xml

<?xml version="1.0" encoding="UTF-8"?>

<memcached>

<!-- name 属性是程序中使用Cache的唯一标识;socketpool 属性将会关联到后面的socketpool配置; -->

<client name="mclient_0" compressEnable="true" defaultEncoding="UTF-8"

socketpool="pool_0">

<!-- 可选,用来处理出错情况 -->

<errorHandler>com.alisoft.xplatform.asf.cache.memcached.MemcachedErrorHandler</errorHandler>

</client>

<!--

name 属性和client 配置中的socketpool 属性相关联。

maintSleep属性是后台线程管理SocketIO池的检查间隔时间,如果设置为0,则表明不需要后台线程维护SocketIO线程池,默认需要管理。

socketTO 属性是Socket操作超时配置,单位ms。 aliveCheck

属性表示在使用Socket以前是否先检查Socket状态。

-->

<socketpool name="pool_0" maintSleep="5000" socketTO="3000"

failover="true" aliveCheck="true" initConn="5" minConn="5" maxConn="250"

nagle="false">

<!-- 设置memcache服务端实例地址.多个地址用","隔开 -->

<servers>127.0.0.1:11211</servers>

<!--

可选配置。表明了上面设置的服务器实例的Load权重. 例如 <weights>3,7</weights> 表示30% load 在

10.2.224.36:33001, 70% load 在 10.2.224.46:33001

<weights>3,7</weights>

-->

</socketpool>

</memcached>

2.memcached的tool工具

package com.lqg.memcache;

import com.alisoft.xplatform.asf.cache.ICacheManager;

import com.alisoft.xplatform.asf.cache.IMemcachedCache;

import com.alisoft.xplatform.asf.cache.memcached.CacheUtil;

import com.alisoft.xplatform.asf.cache.memcached.MemcachedCacheManager;

public class MemCachedTool {

private ICacheManager <IMemcachedCache> manager;

private IMemcachedCache cache;

public MemCachedTool(){

manager=CacheUtil.getCacheManager(IMemcachedCache.class,MemcachedCacheManager.class.getName());

manager.setConfigFile("memcached.xml");

manager.setResponseStatInterval(5*1000);

manager.start();

cache=manager.getCache("mclient_0");

}

/**

* 获取缓存接口

* @return

*/

public IMemcachedCache getCache(){

return this.cache;

}

/**

* 数据放入缓存

* @param key

* @param object

*/

public void put(String key, Object object){

cache.put(key, object);

}

/**

* 从缓存中读取数据

* @param key

* @return

*/

public Object get(String key){

return cache.get(key);

}

}

3.memcached的tool工具的spring配置

<!-- MemcachedCache缓存 -->

<bean id="MemcachedCache" class="com.lqg.memcache.MemCachedTool"></bean>

4.aop配置类

package com.lqg.aop;

import org.apache.log4j.Logger;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import com.lqg.memcache.MemCachedTool;

import com.lqg.model.user.Admin;

@Aspect

public class AdminInterceptor {

public static final Logger log=Logger.getLogger(AdminInterceptor.class);

//将缓存客户端工具类MemcahcedTool编织进来

@Autowired

private MemCachedTool memcachedCache;

/*

* 定义poincut

*/

@Pointcut("execution(* com.lqg.dao.user.AdminDaoImpl.*(..))")

public void aPointcut(){

}

/**

* 环绕装备 用于拦截查询 如果缓存中有数据,直接从缓存中读取;否则从数据库读取并将结果放入缓存

*

* @param call

* @param name

* @return

*/

@Around("aPointcut()&&args(username,password)")

public Admin doFindUserByNameAround(ProceedingJoinPoint call, String username,String password) {

Admin admin = null;

if (memcachedCache.getCache().containsKey("findAdminByName_" + username)) {

admin = (Admin) memcachedCache.get("findAdminByName_" + username);

log.debug("从缓存中读取!findAdminByName_" + username);

System.out.println("从缓存中读取!findAdminByName_" + username);

} else {

try {

admin = (Admin) call.proceed();

if (admin != null) {

memcachedCache.put("findAdminByName_" + username, admin);

log.debug("缓存装备被执行:findAdminByName_" + username);

System.out.println("缓存装备被执行:findAdminByName_" + username);

}

} catch (Throwable e) {

e.printStackTrace();

}

}

return admin;

}

}

其中会出现问题;

3.1.本人JDK是1.7的,于是尝试使用不同版本的aspectjrt.jar文件,发现错误仍然存在!所以不是aspectjrt.jar的问题。

于是本人下载了最新版本的aspectjweaver.jar并替换了原来的版本,error at ::0 can‘t find referenced pointcut allAddMethod成功解决了,程序正常运行。

3.2.error at ::0
formal unbound in pointcut

解决方法:去掉函数通知函数中的参数,比如:将

@Before("execution(public void com.bjsxt.dao.impl.UserDAOImpl.*(..))")

public void beforeMethod(Method method){

System.out.println("method before");

}

改为

@Before("execution(public void com.bjsxt.dao.impl.UserDAOImpl.*(..))")

public void beforeMethod(){

System.out.println("method before");

}

[email protected]("execution(*
com.lqg.dao.user.AdminDaoImpl.*(..))")

public void aPointcut(){

}

Pointcut的定义的红色部分是空格,要不然出错,这个很奇怪啊。

4.aop在spring的配置

<!-- aop切面 -->

<bean id="happy" class="com.lqg.aop.AdminInterceptor"></bean>

同时要启动aspect的

<!-- 启动@Aspectj支持 -->

<aop:aspectj-autoproxy proxy-target-class="true"/>

5.juint的测试类

package com.lqg.dao;

import static org.junit.Assert.*;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.orm.hibernate3.SessionFactoryUtils;

import org.springframework.orm.hibernate3.SessionHolder;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import org.springframework.transaction.support.TransactionSynchronizationManager;

import com.lqg.dao.user.AdminDao;

import com.lqg.memcache.MemCachedTool;

import com.lqg.model.user.Admin;

/**

* 閿熸枻鎷烽敓鏂ゆ嫹閿熸枻鎷?

* @author QiuguoLi

*

*/

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = "classpath:applicationContext-common.xml")

public class DaoSupportTest {

@Autowired

private AdminDao adminDao;//DAO

@Autowired

private SessionFactory sessionFactory;

@Autowired

private MemCachedTool memcachedCache;

private Session session;

@SuppressWarnings("unchecked")

@Before

public void setUp() throws Exception {//閿熸枻鎷峰閿熸枻鎷烽敓鏂ゆ嫹閿熸枻鎷烽敓鏂ゆ嫹閿熸枻鎷烽敓鏂ゆ嫹鎵ч敓鍙殑鍑ゆ嫹閿熸枻鎷?

//daoSupport=new DaoSupport<BookItem>();

//daoSupport=(DaoSupport<BookItem>)factory.getBean("bookItemDao");

session = SessionFactoryUtils.getSession(sessionFactory, true);

Session s = sessionFactory.openSession();

TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(s));

}

@After

public void tearDown() throws Exception {//閿熸枻鎷烽敓锟介敓鏂ゆ嫹閿熸枻鎷烽敓鏂ゆ嫹閿熻杈炬嫹姊板閿熸枻鎷烽敓锟?

adminDao=null;//閿熸枻鎷蜂浚閿熸枻鎷烽敓锟?

SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);

Session s = holder.getSession();

s.flush();

TransactionSynchronizationManager.unbindResource(sessionFactory);

SessionFactoryUtils.releaseSession(s, sessionFactory);

//SessionFactoryUtils.closeSessionIfNecessary(s, sessionFactory);

}

@SuppressWarnings("unchecked")

@Test

public void testFindIntInt() {

//Map<String, String> orderby = new HashMap<String, String>(1);//閿熸枻鎷烽敓鏂ゆ嫹Map閿熸枻鎷烽敓鏂ゆ嫹

//orderby.put("createTime", "desc");//閿熸枻鎷烽敓鐭府鎷烽敓鏂ゆ嫹閿熸枻鎷锋椂閿熸垝鍊掗敓鏂ゆ嫹閿熸枻鎷烽敓鏂ゆ嫹

String username="admin";

String password="admin";

Admin admin= adminDao.login(username, password);

System.out.println(admin.getUsername()+" "+admin.getPassword());

assertNotNull("不是空的方法执行",admin);//閿熷彨璁规嫹find()閿熸枻鎷烽敓鏂ゆ嫹閿熻鍑ゆ嫹鏅掗敓鏂ゆ嫹閿熺獤顖ゆ嫹閿熻锟?

}

}

5.1要打开session,要不join的类不能换取

5.2 @RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = "classpath:applicationContext-common.xml")记得要写进入

时间: 2024-11-05 22:42:51

spring布置memcached的aop遇到的问题的相关文章

浅谈Spring(四)AOP实例

在<浅谈Spring(三)AOP原理>中我详细的介绍了AOP的基本概念和实现原理,这里给出代码示例. 一.XML方式 1. TestAspect:切面类 package com.spring.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; public class TestAspect { public void doAfter(JoinPoint jp) { System

《Spring设计思想》AOP实现原理(基于JDK和基于CGLIB)

0.前言 在上篇文章<Spring设计思想>AOP设计基本原理中阐述了Spring AOP 的基本原理以及基本机制,本文将深入源码,详细阐述整个Spring AOP实现的整个过程. 读完本文,你将了解到: 1.Spring内部创建代理对象的过程 2.Spring AOP的核心---ProxyFactoryBean 3.基于JDK面向接口的动态代理JdkDynamicAopProxy生成代理对象 4.基于Cglib子类继承方式的动态代理CglibAopProxy生成代理对象 5.各种Advice

spring的优点 ioc aop

spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入式设计,代码的污染极低 8.独立于各种应用服务器 9.spring的DI机制降低了业务对象替换的复

spring的IOC和AOP详细讲解

1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是有这个IOC容器进行产生,同时,要是产生的是单例的bean,他还可以给管理bean的生命周期! spring的IOC有三种注入方式 : 第一是根据属性注入 也叫set方法注入: 第二种是根据构造方法进行注入: 第三种是根据注解进行注入,这种方式我认为比较好,方便,要是bean多的话,使用前两种方式会使得配置文件过于臃肿. Spri

Spring Boot中使用AOP统一处理Web请求日志

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通过对既有程序定义一个切入点,然后在其前后切入不同的执行内容,比如常见的有:打开数据库连接/关闭数据库连接.打开事务/关闭事务.记录日志等.基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率.

Spring 2.0 的AOP介绍及其通知类型

Spring 2.0的AOP 在Spring 2.0中最激动人心的增强之一是关于Spring AOP,它变得更加便于使用而且更加强大,主要是通过复杂而成熟的AspectJ语言的支持功能来实现,而同时保留纯的基于代理的Java运行时.Spring 2.0的AOP提供给我们一种新的思考程序结构的方法,能够解决很多纯OOP无法解决的问题--让我们能够在一个模块中实现某些需求,而不是以发散的方式实现.Spring 2.0允许用户选择使用基于模式或@AspectJ注解的方式来自定义切面.这两种风格都支持所

Spring 的IOC 和Aop

Spring 的IOC 和Aop 在ApplicationContext.xml中,bean的scope属性默认是singleton,即默认是单例 Spring容器创建的时候,会将所有的配置的bean对象创建,默认bean都是单例的, 代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构造器,创建实例对象 bean的作用域 scope=“prototype” 原型模型(N个对象),真正使用时才会创建,没获取一次,都会创建不同的对象 scopr="singl

Spring的IOC和AOP之深剖

我们首先要知道 用Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例,并调用bean实例的方法完成“依赖注入”. Spring框架的作用是什么?有什么优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6

Spring Annotation注解进行aop的学习

使用Maven管理项目,pom文件为: 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&