代码之家  ›  专栏  ›  技术社区  ›  yN.

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

  •  1
  • yN.  · 技术社区  · 7 年前

    我想创建一个 RestTemplate 在使用 RestTemplateBuilder . 我想自动接通 重新模板生成器 在构造函数中传递另一个参数“manually”。这有可能吗?

    我目前的方法:

    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 回复  |  直到 7 年前
        1
  •  2
  •   Rafał Wrzeszcz    7 年前

    它不是这样工作的-你要么将对象创建传递给Spring,要么自己处理它。Spring并不是一个预处理器,它将向您公开一个不同的接口——它将使用您的接口来自动处理它。

    你所能做的就是 bluc 对Spring上下文的价值并将其完全自动化:

    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);
        }
    }
    
        2
  •  1
  •   FranXho    7 年前

    你不能那样做。其他的方法怎么样,比如下面的代码?

    @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框架的优点是依赖注入。 因此,如果使用弹簧,则不应使用 new XXXX() 在你的 编写代码,让Spring框架为您处理这个部分。

    通过这样做,您可以利用松耦合。你可以替换 那节课后来换了一节课。否则,从长远来看,你会发现自己 很难取代任何班级。

        3
  •  0
  •   DEVAS    7 年前

    除了Franxho的回答之外,您还可以使用@Required 如果不想失去依赖于构造函数的优势,可以使用autowired。