【问题标题】:How to provide new class instance within constructor in Spring?如何在 Spring 的构造函数中提供新的类实例?
【发布时间】:2014-08-05 10:46:24
【问题描述】:

我有一个扩展基础服务的Spring 托管类。我想以任何实现类必须提供特定FileAnalyzer 实例的方式编写基础服务。但我不想让 FileAnalyzer 类由 spring 管理。

这可能吗?因为super() 类总是必须是构造函数中的第一个调用,所以我不能在调用基构造函数之前实例化任何类。

例子:

public abstract class BaseService {
    BaseService(FileAnalyzer analyzer, String path) {
        this.path = path;
        //perform any action with analyzer.
    }
}


@Service
public class TextfileService {
    public TextfileService() {
        //ERROR: super() must be first call in constructor
        FileAnalyzer analyzer = new FileAnalyzer();
        analyzer.configure(..);
        super(analyzer, "c:\logs");
    }
}

【问题讨论】:

  • FileAnalyzer是你写的自定义类吗?

标签: java spring


【解决方案1】:

这可能吗?因为 super() 类总是必须是构造函数中的第一个调用

是的,这是可能的。只需将代码移动到 private static 方法中,然后从 super() 调用中调用它。

@Service
public class TextfileService {
    public TextfileService() {
        super(getFileAnalyzer(), "c:\logs");
    }
}

private static FileAnalyzer getFileAnalyzer(){
    FileAnalyzer analyzer = new FileAnalyzer();
    analyzer.configure(..);
    return analyzer;
}

替代方式:

如果FileAnalyzer是您编写的自定义类,那么只需更改configure()方法的返回类型,如下所示:

@Service
public class TextfileService {
    public TextfileService() {
        super(new FileAnalyzer().configure(...), "c:\logs");
    }
}

文件分析器.java

public FileAnalyzer configure(){
    ...
    return this;
}

【讨论】:

  • 你不能在基础构造函数之前调用实例方法。
  • @kan 我错过了那部分。当我在我的系统上尝试它时。我使用了static,但忘记发布它。谢谢。
【解决方案2】:

您可以使用查找方法注入。 只需分配一个查找方法,每当您实例化此类的新对象时都会调用它。 检查this答案。

【讨论】:

    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    相关资源
    最近更新 更多