AOP 和 动态代理 切换DAO

1:AOP
package com.ai.dao;

import java.lang.reflect.Method;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;

import com.ai.core.springcontext.AppContext;
import com.ai.core.utils.PropertiesUtils;

public class DominoDaoInterceptor{
	
		private String bundle = "com.ai.dao.DominoDaoInterceptor";
		private Logger logger = Logger.getLogger(DominoDaoInterceptor.class);
		private String usePgsqlDao = PropertiesUtils.getKey("PgsqlDaoUsed", bundle);
	
	    public void switchDao(ProceedingJoinPoint pjp) throws Throwable{ 
	    	logger.info("Switch: " + pjp.getSignature().toLongString());
	    	
	    	if("true".equalsIgnoreCase(usePgsqlDao)){
	    		String calledMethod = pjp.getSignature().getName();
		    	Object[] args = pjp.getArgs();
		    	Class[] paraTypes = new Class[args.length];
		    	for(int i = 0 ; i < args.length ; i++){
		    		paraTypes[i] = args[i].getClass();
		    	}
		    	Method method = pjp.getTarget().getClass().getMethod(calledMethod, paraTypes);
		    	String clazz = pjp.getTarget().getClass().getName();
		    	String bean = PropertiesUtils.getKey(clazz.substring(clazz.lastIndexOf(".")+1), bundle);
		    	Object object = null;
		    	try{
		    		object = AppContext.getApplicationContext().getBean(bean);
		    	}catch(Exception e){
		    		logger.error(e.getMessage());
		    		logger.error("As it failed to switch, the origenal dao was used.");
		    		pjp.proceed();
		    		return;
		    	}
		    	method.invoke(object, args);
	    	}else{
	    		pjp.proceed();
	    	}
	    }  
}



2:动态代理
package com.ai.dao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.apache.log4j.Logger;

import com.ai.core.springcontext.AppContext;
import com.ai.core.utils.PropertiesUtils;

public class DaoSwapper {

	private static String BUNDLE = "com.ai.dao.DaoSwapper";
	private static Logger logger = Logger.getLogger(DaoSwapper.class);
	private static String usePgsqlDao = PropertiesUtils.getKey("PgsqlDaoUsed",
			BUNDLE);

	public static Object swap(Object object) {
		
		if (!"true".equalsIgnoreCase(usePgsqlDao)) {
			return object;
		}
		logger.info("Swap Dao: " + object.getClass());

		DaoHandler handler = new DaoSwapper(). new DaoHandler(object);
		return Proxy.newProxyInstance(object.getClass().getClassLoader(),
				object.getClass().getInterfaces(), handler);
	}

	private class DaoHandler implements InvocationHandler {

		private Object original;
		private Object target;

		public DaoHandler(Object obj) {
			this.original = obj;
		}

		public Object invoke(Object proxy, Method method, Object[] args)
				throws Throwable {

			String targetBeanName = getTargetBeanName(original);
			target = AppContext.getApplicationContext().getBean(targetBeanName);
			return method.invoke(target, args);
		}

		private String getTargetBeanName(Object obj) {
			String clazz = obj.getClass().getName();
			clazz = clazz.substring(clazz.lastIndexOf(".") + 1);
			return PropertiesUtils.getKey(clazz, BUNDLE);
		}
	}
}

猜你喜欢

转载自nevenchen.iteye.com/blog/1630622