动态配置服务层中的存储库接口

时间:2013-04-29 22:14:23

标签: spring spring-mvc

我的spring MVC设置中的Service类和我的存储库类是这样的 -

public class ObjectServiceImpl implements ObjectService {

@Autowired
Temp1Repo temp1Repo;
@Autowired
Temp2Repo temp2Repo;
...

}

public interface Temp1Repo extends CrudRepository<Temp1, Integer> {


}

public interface Temp2Repo extends CrudRepository<Temp2, Integer> {


}

现在,在我的服务类中,我得到一个Temp1类型的对象,我必须调用temp1Repo.save()。如果我得到Temp2的对象,我必须调用temp2Repo.save()等等......

我如何实现这一目标?

3 个答案:

答案 0 :(得分:0)

看起来很简单,只需要一个if语句:

if(object instanceof Temp1) {
    temp1Repo.save((Temp1) object);
} else if(object instanceof Temp2) {
    temp2Repo.save((Temp2) object);
}

或许您正在寻找更通用的方式?

答案 1 :(得分:0)

我想您想要将所有存储库重新组合在一个存储库中。像

这样的东西
@SuppressWarnings("rawtypes")
public class ObjectServiceImpl  {

    @Autowired
    private CrudRepository[] repositories;
    private Map<Class<?>, CrudRepository> repositoryMap = new HashMap<Class<?>, CrudRepository>();


     @PostConstruct
     public void init() {
          for (CrudRepository r : repositories)
              repositoryMap.put(getType(r), r);
     }

    private Class<?> getType(CrudRepository repository) {

        Type[] types = repository.getClass().getGenericInterfaces();
        for (Type t : types) {
            if (t instanceof ParameterizedType)
                return (Class<?>) ((ParameterizedType) t).getActualTypeArguments()[0];
        }

        throw new IllegalStateException("Check repositories...");
    }

    public void save(Object entity) {
        repositoryMap.get(entity.getClass()).save(entity);
    }

    public <T> T get(Object id, Class<T> clazz) {
        return repositoryMap.get(clazz).findOne(id);
    }

    ....

}

考虑直接使用EntityManager,但无论如何都可能有用......

答案 2 :(得分:0)

根据您编写的代码,如果缺少任何注入,Spring将在启动时引发异常。

您要做的是动态模块加载,具体取决于您在问题中省略的条件。

您可能必须使用XML配置样式并创建一个条件弹簧上下文并加载要使用的正确的上下文。

干杯