当前位置: 首页 > 知识库问答 >
问题:

在具有参数化构造函数的类上使用依赖注入

路欣荣
2023-03-14

我有一个自定义类,它有一个参数化构造函数

@Component
public class ExtractDataFromImage implements ExtractData{

    private Map<String, Boolean> selectedOptions;
    private BufferedImage image;
    
    @Autowired
    private TesseractService tesseractService;
    
    public ExtractDataFromImage(
            Map<String, Boolean> selectedOptions, 
            BufferedImage image,
            TesseractService tesseractService
            ) {
        this.selectedOptions = selectedOptions;
        this.image = image;
        this.tesseractService = tesseractService;
    }
    
    @Override
    public Map<String, ArrayList<String>> extractData() {
        //code
    }
}

因此,实例化时需要3个参数。如果我想将这个类作为依赖项添加,我发现在Spring中没有直接的方法可以做到这一点。

我知道我可以简单地创建一个类的新实例并使用它的方法。但是我找不到任何直接的方法将这个类注入我的另一个类,即Rest控制器。

需要注意的是:所有3个参数都需要在运行时传递。我不能从属性文件中使用它们

即使Spring中没有直接的方法,我也想知道定义此类依赖项并使用参数化构造函数创建新实例的最佳方法是什么

共有1个答案

司徒焕
2023-03-14

您需要的是Spring构造函数依赖项注入。有3种方法可以在Spring中注入依赖项:类字段、构造函数和setter方法。

最好的推荐方法是构造函数依赖项注入。在您的情况下,您必须在构造函数上设置一个自动连接的注释(自Spring 4.3以来,这不是强制性的),并从您的字段中删除自动连接的注释

@Autowired
public ExtractDataFromImage(
            Map<String, Boolean> selectedOptions, 
            BufferedImage image,
            TesseractService tesseractService
            ) {
        this.selectedOptions = selectedOptions;
        this.image = image;
        this.tesseractService = tesseractService;
}
@RestController
public class YourController {

    private ExtractDataFromImage edfi;

    @Autowired
    public YourController(ExtractDataFromImage edfi) {
        this.edfi = edfi;
    }
}
 类似资料:
  • 我需要重构现有的抽象类来实现依赖注入,但是这个类有两个接受其他参数的构造函数。 我需要注入一些接口,并避免在构造函数中传递任何其他参数,如“settingsId”和“Setting”。所以我的想法是在创建此类的实例后创建两种方法来设置这些参数。 但它看起来不是一个合适的解决方案,因为如果开发人员忘记在创建实例后运行这些方法之一,我们将来可能会得到一个异常(对象未设置为引用...)。我应该如何正确执

  • 和另一个类: 在这种情况下,服务将按照预期注入到A类中。据我所知,你不能在a类中使用构造函数,否则注入将无法工作。有没有一种方法可以在a类中使用一个构造函数,同时注入服务?即: 在这种情况下,我得到的服务是空的,无论如何要解决这个问题?我希望能够从类型A中使用“new”创建一个对象,并注入服务,这可能吗?

  • 我是新手。所以我想在我的使用MVVM架构的项目上尝试依赖注入。结构如下:JsonHelper- 当我试图在RemoteDataSource和Repository上注入DI时,出现了问题,因为这些类是单例类,并且有一个私有构造函数。错误代码如下所示 这是我的远程数据源和存储库代码,我已经尝试将其注入构造函数,但它说Dagger不能注入私有构造函数,所以我尝试将其注入函数,但仍然不起作用 远程数据源.

  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。

  • 好的,到目前为止还好。但是等等,突然A需要额外的输入,比如一个对它的构造至关重要的名为“amount”的整数。现在,我的A构造函数需要如下所示: 突然这个新参数干扰了注射。此外,即使这确实有效,我也无法在从提供者检索新实例时输入“金额”,除非我弄错了。这里有几件事我可以做,我的问题是哪一件是最好的? 我可以通过添加一个方法来重构A,该方法应该在构造函数之后调用。然而,这是很难看的,因为它迫使我推迟

  • 问题内容: 嘿 语言是Java。我想扩展构造函数具有参数的此类。 这是主要的课程 这是儿童班 如何编写正确的语法?并且错误是“构造函数无法应用于给定类型” 问题答案: 您可以定义构造函数所需的任何参数,但是有必要将超类的一个构造函数作为自己的构造函数的第一行来调用。可以使用或来完成。