我正在研究一种在运行时动态获取事务管理器实例的方法。
我有一个服务,它根据下面的参数
在运行时动态选择DAO引用@Mapper //Spring-MyBatis mapper
public interface DataMapper {
void save(Object domain);
}
public class DAO {
private DataMapper mapper;
public void save(Object domain) {
mapper.save(domain);
}
}
@Component
public class Service {
private DAO onlineBusinessDAO;
private DAO storeBusinessDAO;
public void save(String businessIdentifier, Object domain) {
identifyDAOBasedOn(businessIdentifier).save(domain);
}
private DAO identifyDAOBasedOn(String businessIdentifier) {
Switch(businessIdentifier) {
case "Online":
return onlineBusinessDAO;
case "Store":
return storeBusinessDAO;
}
}
}
在上面基于businessIdentifier的实现中,我决定在哪个DAO实例中进行拾取,在DAO中我使用mybatis Mapper来完成这项工作。
所以我有多个数据源(一个用于在线,一个用于商店)和一个特定DAO实例下的多个transactionManagers。
我想在Service类的save()下使用spring @Transactional,但我需要根据businessIdentifier参数指定在运行时动态地使用哪个“transactionManager”引用。
有没有办法实现这个目标?
我希望保持代码更清晰,尽可能少 - 不想使用facade创建2个服务或DAO实现。
答案 0 :(得分:0)
请参阅以下步骤:
1.创建使用自己2 different helper DAO implementation classes
的{{1}}。
2.请确保transactional managers
应该both Implementation classes
一个implement
3. common interface
类将保留两个辅助实现(使用Main DAO
来区分这两个辅助实现)
4.主DAO将获得@Qualifier
作为datasource
的名称,并根据它将调用正确的方法parameter