用于访问数据对象的Spring Boot程序结构

时间:2017-07-21 13:49:33

标签: java spring spring-boot spring-data

我有一个Spring启动应用程序,它有一个mongo存储库,并使用spring数据连接到它。这意味着有一个"实体"类,然后是"存储库"类。

然而,为了实际使用存储库,我需要使用@Autowire我的repo到另一个类中的变量(我们称之为X),这可能是想要使用它。但是如果X类本身不是一个春天的豆子,它只是由新的X"创造的常规pojo。在某个地方,它无法使用自动装配,因此无法使用回购。

这似乎是一个显示停止...没有人可以在某些特定情况之外使用回购,例如直接从您的RestController调用回购或任何没有任何干预逻辑的回购。但我相信人们正在使用它。

所以我的问题是如何构造代码以便可以使用它?我是否需要进行一堆处理,然后返回控制器与数据库进行交互?有没有办法创建某种其他"中间帮助bean"调解连接?那应该是什么样的?

免责声明:我对春天来说相当新鲜

2 个答案:

答案 0 :(得分:1)

正如您所说,您只能自动装配自动装配的对象中的字段。这是豆类注射所固有的。您应该使用例如@Component注释X并将其注入您需要的位置。

答案 1 :(得分:1)

也许我可以发布一些可以澄清你情况的摘录。

//nothing spring specific
public class MyPojo {
  //properties
}

在另一个包装中:

@Repository
public class MyRepositoryImpl implements MyRepository {
    //CRUD implementation or whatever
}

在另一个包装中:

@Service
public class MyServiceImpl implements MyService {

    @Autowired //constructor-injection
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    private final MyRepository myRepository;

    public void myBusinessLogic() {
        MyPojo pojo = new MyPojo(); //not dependent on Spring
        myRepository.doSomething();
        //place calls to X here as needed
    }
}

最后:

@Controller
public class MyController {

    @Autowired
    public MyController(MyService myService) {
        this.myService = myService;
    }

    private final MyService myService;

    @GetMapping("/myPage")
    public String doIt() {
       myService.myBusinessLogic();
       return "myPage";
    }  
}

其中MyRepositoryMyService是包含各自实现合同的接口。

单一责任原则

需要注意的一点是,您的POJO不会像您在问题中提到的那样“使用回购”。它代表一个实体,不应该关心任何特定的存储库。这似乎与您的问题有关 - POJO不应该调用存储库(在这种情况下是您的“X”类)。如果是这种情况,似乎应该重新考虑设计。