利用自定义注解给实体类设置AbstractRoutingDataSource的数据源的key。选择数据源时,通过获取注解设置的key值选择不同的数据源。
使用场景:提取公共方法,利用注解设置key值。实现实体类与选择数据源的解耦,且更直观可读性强(个人理解)。通过在实体类中添加数据源字段存储key值的方法,增加耦合,且bean的定义存在不相关字段。而利用map存储数据源key,数据源不直观,降低代码可读性。
AbstractRoutingDataSource使用参考上一篇:Spring利用AbstractRoutingDataSource实现多数据源
定义注解:
package com.learn.table;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Table {
//设置数据源的key
public String dbName();
}
实体类:
package com.learn.pojo;
import com.learn.table.Table;
//定义类时就确定要使用的数据源
@Table(dbName="dataSource2")
public class Work {
private String workId;
private String workName;
public String getWorkId() {
return workId;
}
public void setWorkId(String workId) {
this.workId = workId;
}
public String getWorkName() {
return workName;
}
public void setWorkName(String workName) {
this.workName = workName;
}
}
使用:
package com.learn.moreDate;
import javax.sql.DataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import com.learn.pojo.Work;
import com.learn.table.Table;
public class Demo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:config/applicationContext.xml");
//获取Work的Table注解
Table table = (Table)Work.class.getAnnotation(Table.class);
//获取Table的值并设置数据源key值
CustomerContextHolder.setCustomerType(table.dbName());
//获取数据源
DataSource dds = (DataSource)context.getBean("dynamicDataSource");
//执行sql
JdbcTemplate template = new JdbcTemplate(dds);
String sql = "delete from work";
template.update(sql);
}
}