Spring通过实例工厂实例化bean的简单应用场景举例
前提说明
源库只有一个,目标库存在多个,将源库里的数据同步到不同的目标库中。
后台框架
Spring+OpenJpa
由于存在多个目标库,需要配置多个baseDao(一个baseDao对应一个目标库),所有的baseDao全部实现IBaseDao接口。如图:
FirstDao:
public class FirstDao extends MBaseDao implements IBaseDao {
@PersistenceContext(unitName="target_one")
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}
SecondDao:
public class SecondDao extends MBaseDao implements IBaseDao {
@PersistenceContext(unitName="target_two")
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}
Service层:
public interface IBaseService {
public void add(Employee emp) throws Exception;
}
public class BaseService implements IBaseService {
private IBaseDao baseDao;
public BaseService() {
}
public BaseService(IBaseDao baseDao){ // 一定要有这个有参构造器,传入的是各个目标库的baseDao。
this.baseDao = baseDao;
}
@Override
public void add(Employee emp) throws Exception {
getBaseDao().mergeEntity(Employee.class, emp);
}
public IBaseDao getBaseDao() {
return baseDao;
}
public void setBaseDao(IBaseDao baseDao) {
this.baseDao = baseDao;
}
}
工厂类:
/**
* 我负责生产baseService
*/
public class ServiceFactory {
public BaseService getBaseService(IBaseDao baseDao){
return new BaseService(baseDao);
}
}
Spring通过工厂方法配置bean
<!-- 配置工厂实例 -->
<bean id="serviceFactory" class="com.amoeba.factory.ServiceFactory">
</bean>
<!-- 通过实例工厂创建target_one的Service方法 -->
<bean id="targetOneService" factory-bean="serviceFactory" factory-method="getBaseService">
<constructor-arg ref="firstBaseDao"></constructor-arg>
</bean>
<!-- 通过实例工厂创建target_two的Service方法 -->
<bean id="targetTwoService" factory-bean="serviceFactory" factory-method="getBaseService">
<constructor-arg ref="secondBaseDao"></constructor-arg>
</bean>
如此一来,只需要写一套业务代码,方便以后的维护。