Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法(三)

2014-11-24 09:04:18 · 作者: · 浏览: 2
合前一个字元一次或多次
### *表示符合前一个字元零次或多次
### \Escape任何Regular expression使用到的符号
-->
com.hoo.*.service.impl.*Service*\.*.*
com.hoo.*.mapper.*Mapper*\.*.*
上面的拦截器是拦截Service和Mapper的Java对象中的执行方法,所有在service.impl包下的ServiceImpl和mapper包下的Mapper接口将会被DataSourceMethodInterceptor拦截到,并通过其中的规律动态设置数据源。
3、拦截器DataSourceMethodInterceptor.java拦截具体的业务,并通过业务代码中的方法和接口、实现类的规律进行动态设置数据源
package com.hoo.framework.spring.interceptor;
import java.lang.reflect.Proxy;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang.ClassUtils;
import org.springframework.beans.factory.InitializingBean;
import com.hoo.framework.log.ApplicationLogging;
import com.hoo.framework.spring.support.CustomerContextHolder;
/**
* function: 动态设置数据源拦截器
* @author hoojo
* @createDate 2013-9-27 下午02:00:13
* @file DataSourceMethodInterceptor.java
* @package com.hoo.framework.spring.interceptor
* @project SHMB
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class DataSourceMethodInterceptor extends ApplicationLogging implements MethodInterceptor, InitializingBean {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Class< > clazz = invocation.getThis().getClass();
String className = clazz.getName();
if (ClassUtils.isAssignable(clazz, Proxy.class)) {
className = invocation.getMethod().getDeclaringClass().getName();
}
String methodName = invocation.getMethod().getName();
Object[] arguments = invocation.getArguments();
trace("execute {}.{}({})", className, methodName, arguments);
if (className.contains("MySQL")) {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_MYSQL);
} else if (className.contains("Oracle")) {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_ORACLE);
} else if (methodName.contains("MySQL")) {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_MYSQL);
} else if (methodName.contains("Oracle")) {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_ORACLE);
} else {
CustomerContextHolder.clearCustomerType();
}
/*
if (className.contains("MySQL") || methodName.contains("MySQL")) {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_MYSQL);
} else if (className.contains("Oracle") || methodName.contains("Oracle")) {
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_ORACLE);
} else {
CustomerContextHolder.clearCustomerType();
}
*/
Object result = invocation.proceed();
return result;
}
@Override
public void afterPropertiesSet() throws Exception {
log.trace("afterPropertiesSet……");
}
}
上面的代码是在接口或实现中如果出现MySQ