Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于访问数据对象的Spring引导程序结构_Java_Spring_Spring Boot_Spring Data - Fatal编程技术网

Java 用于访问数据对象的Spring引导程序结构

Java 用于访问数据对象的Spring引导程序结构,java,spring,spring-boot,spring-data,Java,Spring,Spring Boot,Spring Data,我有一个SpringBoot应用程序,它有一个mongo存储库,并且正在使用spring数据连接到它。这意味着有一个“实体”类,然后是一个“存储库”类 然而,为了实际使用存储库,我需要spring将我的repo@Autowire连接到另一个类(我们称之为X)中可能需要使用它的变量。但是,如果X类本身不是Springbean,它只是由“new X”在某处创建的常规pojo,那么它不能使用自动连接,因此不能使用repo 这看起来像是一场表演。。。除了一些非常特殊的情况外,没有人可以使用回购协议,比如

我有一个SpringBoot应用程序,它有一个mongo存储库,并且正在使用spring数据连接到它。这意味着有一个“实体”类,然后是一个“存储库”类

然而,为了实际使用存储库,我需要spring将我的repo@Autowire连接到另一个类(我们称之为X)中可能需要使用它的变量。但是,如果X类本身不是Springbean,它只是由“new X”在某处创建的常规pojo,那么它不能使用自动连接,因此不能使用repo

这看起来像是一场表演。。。除了一些非常特殊的情况外,没有人可以使用回购协议,比如直接从RestController调用回购协议,或者没有任何干预逻辑的任何情况。但我确信人们正在使用它

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


免责声明:我对spring相当陌生,正如您所说,您只能在自动关联的对象中自动关联字段。这是豆类注射固有的。你应该用例如@Component来注释X,并在需要的地方注入它。

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

//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
    }
}
在另一个包中:

@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”类)。如果是这样的话,应该重新设计这个设计。

可以考虑用<代码>提供者>代码>实例化<代码> x>代码>而不是<代码>新< /代码>?但是x有其他字段依赖于被称为“新”的类(请求、其他服务调用等)捕获的其他事物。当构造器也需要知道这些东西时,我如何创建@组件?我想我理解,我认为这是有意义的。谢谢,让我知道你是否需要我澄清什么。坚持下去,它会变得更容易!