1:AOP
2:动态代理
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);
}
}
}