spring 多数据源配置方式

核心配置文件:       

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值