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); } } }