Spring IOC DI带有运行时参数

时间:2016-01-31 02:28:27

标签: java spring dependency-injection inversion-of-control

我是IOC和DI的新相对论,所以我猜我在这里缺少一些高级设计原则,但我无法弄清楚如何使我的架构工作。

我有一个REST API端点,它接受两个POST数据:客户ID和类型ID。其余的api需要返回该特定客户/类型组合的一组数据。

以下是我正在做的事情的粗略画面: enter image description here

控制器正在通过发布数据传递实体ID,并通过JPA存储库获取适当的实体。

然后构造一个数据生成器对象(将实体作为构造函数参数),并使用它来处理API的所有数据收集。

问题:因为数据生成器采用了两个动​​态构造函数参数,所以它不能被DI进入Controller,而是必须使用new。但是,在数据生成器内部,我需要访问JPA存储库。访问这些存储库的唯一方法是通过DI。但是我不能DI,因为对象是new而不是IOC容器的DI。

有没有办法设计这个以便我没有这个问题?我是否违反了有关IOC的规定?我在某处有错误的假设吗?任何建议都表示赞赏。

谢谢!

编辑:数据生成器的伪代码

public class DataGenerator {
    private Customer customer;
    private Type type

    public DataGenerator(Customer customer, Type type) {
        this.cusomter = customer;
        this.type = type;
    }

    public generateData() {
        if(customer == x && type == y) {
            //JPA REPOSITORY QUERY
        } else {
            //DIFFERENT JPA REPOSITORY QUERY
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我想你可能已经在某个地方混淆了。您应该有Service命中您的存储库,并将信息提供给控制器。一个原始设置就是这样的。

@Controller 
public MyController {

    @AutoWired
    private DataService dataService;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    private DataGenerator readBookmark(@PathVariable Long customerId, @PathVariable Integer typeId) {
        return dataService.getData(customerId, typeId);
    }
}

@Service
public class DataService {

    @AutoWired
    private JPARepository repository;

    public DataGenerator getData(long customerId, int typeId) {
        Type typeDetails = repository.getType(typeId);
        Customer customerDetails = repository.getCustomer(customerId);
        return new DataGenerator(customerDetails, typeDetails);
    }
}