核心配置文件:
<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc_1.url}"/>
<property name="username" value="${jdbc_1.username}"/>
<property name="password" value="${jdbc_1.password}"/>
</bean>
<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc_2.url}"/>
<property name="username" value="${jdbc_2.username}"/>
<property name="password" value="${jdbc_2.password}"/>
</bean>
<bean id="dataSource" class="com.*.service.datasource.DynamicDataSourceHolder">
<!-- 通过key-value的形式来关联数据源 -->
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="dataSource1" value-ref="dataSource1"></entry>
<entry key="dataSource12" value-ref="dataSource2"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource1" />
</bean>
<!-- 配置hibernate -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">com.*.util.DialectForInkfish</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">none</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.*.common.model</value>
</list>
</property>
</bean>
1.基于注解的配置方式(可以在类或方法上注解):
1) xml:
<bean id="dataSourceAspect" class="com.*.interceptor.DataSourceAspect"></bean>
<aop:config>
<aop:aspect ref="dataSourceAspect">
<aop:pointcut id="dataSourcePointcut" expression="execution(* *..service..*.*(..))"/>
<aop:before pointcut-ref="dataSourcePointcut" method="intercept"/>
</aop:aspect>
</aop:config>
2)Class:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface DataSource {
String value() default DynamicDataSourceHolder.DATA_SOURCE_KFZX;
}
public class DataSourceAspect {
/**
* 拦截目标方法,获取由@DataSource指定的数据源标识,设置到线程存储中以便切换数据源
*
* @param point
* @throws Exception
*/
public void intercept(JoinPoint point) throws Exception {
Class<?> target = point.getTarget().getClass();
MethodSignature signature = (MethodSignature) point.getSignature();
// 默认使用目标类型的注解,如果没有则使用其实现接口的注解
for (Class<?> clazz : target.getInterfaces()) {
resolveDataSource(clazz, signature.getMethod());
}
resolveDataSource(target, signature.getMethod());
}
/**
* 提取目标对象方法注解和类型注解中的数据源标识
*
* @param clazz
* @param method
*/
private void resolveDataSource(Class<?> clazz, Method method) {
try {
Class<?>[] types = method.getParameterTypes();
// 默认使用类型注解
if (clazz.isAnnotationPresent(DataSource.class)) {
DataSource source = clazz.getAnnotation(DataSource.class);
DynamicDataSourceHolder.setCustomerType(source.value());
}
// 方法注解可以覆盖类型注解
Method m = clazz.getMethod(method.getName(), types);
if (m != null && m.isAnnotationPresent(DataSource.class)) {
DataSource source = m.getAnnotation(DataSource.class);
DynamicDataSourceHolder.setCustomerType(source.value());
}
} catch (Exception e) {
System.out.println(clazz + ":" + e.getMessage());
}
}
}
2.非注解的方式,在需要切换数据的方式前加上一下代码:
DynamicDataSourceHolder.setCustomerType(value);