具有2个参数的Spring构造函数,其中需要注入一个

时间:2018-08-14 08:22:56

标签: java spring spring-boot

我想使用RestTemplate在类的构造函数中创建RestTemplateBuilder的实例。我想在构造函数中自动装配RestTemplateBuilder并“手动”传递另一个参数。这可能吗?

到目前为止我的方法:

public class IlikeU {

    private final String blub;
    private final RestTemplate restTemplate;

        public IlikeU(final String blub, @Autowired final RestTemplateBuilder restTemplateBuilder) {
            this.blub = blub;
            this.restTemplate = restTemplateBuilder.build();
        }
    }

我想创建一个如下实例,但无法完成,因为构造函数需要2个参数。

IlikeU iLikeU = new IlikeU("pew pew");

3 个答案:

答案 0 :(得分:2)

它不是那样工作的-您可以将对象创建传递给Spring,也可以自己处理。 Spring不是可以为您提供不同接口的预处理器-它会使用您的接口自动处理它。

您可以做的是还向Spring上下文提供bluc值并将其完全自动化:

public IlikeU(@Value("${your.parameter}") final String blub, @Autowired final RestTemplateBuilder restTemplateBuilder)

您需要在上下文可用的属性中将值定义为键your.parameter

其他可能性是建立一个工厂,该工厂将从Spring获得一个rest模板构建器,并使用给定的字符串构建您的IlikeU类:

public class IlikeUFactory {
    private final RestTemplate restTemplate;

    public IlikeUFactory(@Autowired final RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder.build();
    }

    public IlikeU createIlikeU(String blub) {
        return new IlikeU(blub, this.restTemplate);
    }
}

答案 1 :(得分:1)

您不能完全那样做。像下面的代码中那样,另一种方式呢?

@Component
public class IUseU{
    @Autowired
    private RestTemplateBuilder restTemplateBuilder;

    public void use(){
        IlikeU iLikeU = new IlikeU("pew pew", restTemplateBuilder);
    }
}

public class IlikeU {

    private final String blub;
    private final RestTemplate restTemplate;

    public IlikeU(final String blub, final RestTemplateBuilder restTemplateBuilder) {
        this.blub = blub;
        this.restTemplate = restTemplateBuilder.build();
    }
}
  

侧面说明:spring框架的优点是依赖项注入。   因此,如果您使用的是Spring,则不应在您的计算机中使用new XXXX()   代码并让spring框架为您处理这一部分。

     

这样做,您将获得松散耦合的优势。您可以更换   以后再上另一堂课。否则,从长远来看,你会发现自己   替换任何类都非常困难。

答案 2 :(得分:0)

除了FranXho的答案外,您还可以使用@Required 如果您不想失去构造函数依赖性的优势,请使用自动装配。