我有一个Spring启动应用程序,它有一个mongo存储库,并使用spring数据连接到它。这意味着有一个"实体"类,然后是"存储库"类。
然而,为了实际使用存储库,我需要使用@Autowire我的repo到另一个类中的变量(我们称之为X),这可能是想要使用它。但是如果X类本身不是一个春天的豆子,它只是由新的X"创造的常规pojo。在某个地方,它无法使用自动装配,因此无法使用回购。
这似乎是一个显示停止...没有人可以在某些特定情况之外使用回购,例如直接从您的RestController调用回购或任何没有任何干预逻辑的回购。但我相信人们正在使用它。
所以我的问题是如何构造代码以便可以使用它?我是否需要进行一堆处理,然后返回控制器与数据库进行交互?有没有办法创建某种其他"中间帮助bean"调解连接?那应该是什么样的?
免责声明:我对春天来说相当新鲜答案 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";
}
}
其中MyRepository
和MyService
是包含各自实现合同的接口。
单一责任原则
需要注意的一点是,您的POJO不会像您在问题中提到的那样“使用回购”。它代表一个实体,不应该关心任何特定的存储库。这似乎与您的问题有关 - POJO不应该调用存储库(在这种情况下是您的“X”类)。如果是这种情况,似乎应该重新考虑设计。