如何同时创建具有自动装配字段和非自动装配字段的构造函数?

时间:2019-06-26 10:44:57

标签: java spring dependency-injection

我有一个可以采取行动的系统。该系统使用以下方法为每个对象创建一个单独的线程:

stp.scheduleWithFixedDelay((EditSite) ctx.getBean("EditSite", site), threadTimeParams);

我想用“ Site”参数创建一个构造函数,但是我应该以某种方式使我的自动装配构造函数继续工作。

public class EditSite{
    private final A a;
    private final B b;
    private final C c;

    private Site site;

    public EditSite(@Autowired A a, @Autowired  B b,@Autowired C c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public void run(){ check(); }
    public void check(){}
}

我的IDE表示我无法创建public EditSite(Site site, @Autowired A a, @Autowired B b,@Autowired C c)。我以前曾经有一个字段注释,但是最近我看到一篇文章说字段注释很糟糕,因此决定重构我的代码。我该怎么办?

2 个答案:

答案 0 :(得分:2)

您需要在配置中显式创建bean。 您无需在班级内部进行任何自动装配:

public class EditSite{
  private final A a;
  private final B b;
  private final C c;

  private Site site;

  public EditSite(Site site, A a, B b , C c) {
      this.site=site;
      this.a = a;
      this.b = b;
      this.c = c;
  }

  public void run(){ check(); }
  public void check(){}
}

为此配置:

@Configuration
public class EditSiteConfig {

  @Bean
  public EditSite editSite(A a, B b, C c){
    Site site = getSite(); //since site is not a bean, you need to get it manually
    return new EditSite(site, a, b, c);
  }

}

答案 1 :(得分:-2)

使用字段自动装配,例如:

@Autowired
private final A a;

@Autowired
private final B b;

@Autowired
private final C c;

private Site site;