Java 如何使用自动连线和非自动连线字段同时创建构造函数?

Java 如何使用自动连线和非自动连线字段同时创建构造函数?,java,spring,dependency-injection,Java,Spring,Dependency Injection,我有一个系统可以做一些动作。此系统使用以下方法为每个对象创建一个单独的线程: stp.scheduleWithFixedDelay((EditSite)ctx.getBean(“EditSite”,site),threadTimeParams); 我想创建一个带有“Site”参数的构造函数,但我应该以某种方式保持我的自动连接构造函数工作 公共类编辑站点{ 私人决赛A; 私人决赛B; 私人决赛C; 私人地盘; 公共编辑站点(@Autowired A A、@Autowired B B、@Autow

我有一个系统可以做一些动作。此系统使用以下方法为每个对象创建一个单独的线程:

stp.scheduleWithFixedDelay((EditSite)ctx.getBean(“EditSite”,site),threadTimeParams);
我想创建一个带有“Site”参数的构造函数,但我应该以某种方式保持我的自动连接构造函数工作

公共类编辑站点{
私人决赛A;
私人决赛B;
私人决赛C;
私人地盘;
公共编辑站点(@Autowired A A、@Autowired B B、@Autowired C C){
这个a=a;
这个.b=b;
这个.c=c;
}
public void run(){check();}
公共无效检查(){}
}

我的IDE说我不能创建
公共编辑站点(站点站点,@Autowired A A、@Autowired B B、@Autowired C)
。我以前有一个字段注释,但最近我看到一篇文章说字段注释不好,并决定重构我的代码。如何操作?

使用现场自动布线,例如:

@Autowired
private final A a;

@Autowired
private final B b;

@Autowired
private final C c;

private Site site;

使用现场自动布线,例如:

@Autowired
private final A a;

@Autowired
private final B b;

@Autowired
private final C c;

private Site site;

您需要在配置中显式地创建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);
  }

}

您需要在配置中显式地创建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);
  }

}

我不建议将注入(字段,但不表示对象“状态”)与对象“状态”(由“站点”值表示)混合使用。我更愿意创建一个新类,将所有四个值都作为“普通”构造函数参数,由您自己创建,而不是通过依赖项注入,即一个普通的Java“EditSiteProcessor”初始化为a,b,c和一个站点,然后将其传递给您的调度程序。似乎
site
对象充当调用参数而不是依赖项,因此它根本不应该被注入。更好的方法是将
Site
对象传递到
run()
方法中。@NikolayShevchenko是的,你是对的。但是,当我有一个像这样的代码时,如何将它传递给run方法呢?(检查scheduleWith…行)我不建议将注入(是字段,但不表示对象“状态”)与对象“状态”(由“站点”值表示)混合使用。我更愿意创建一个新类,将所有四个值都作为“普通”构造函数参数,由您自己创建,而不是通过依赖项注入,即一个普通的Java“EditSiteProcessor”初始化为a,b,c和一个站点,然后将其传递给您的调度程序。似乎
site
对象充当调用参数而不是依赖项,因此它根本不应该被注入。更好的方法是将
Site
对象传递到
run()
方法中。@NikolayShevchenko是的,你是对的。但是,当我有一个像这样的代码时,如何将它传递给run方法呢?(用…行检查日程安排)谢谢你的回答。我已经用过了,但我听说现场自动接线不好。你确定这是个好主意吗?@just4ask4,我在生产中使用:)字段自动连接是一个糟糕的做法,因为Spring将通过反射注入依赖项。这样的代码可能很难测试,这就是为什么构造函数注入或setter注入是一种更好的方法——您不需要与Spring耦合,就可以让依赖关系的对象运行。谢谢您的回答。我已经用过了,但我听说现场自动接线不好。你确定这是个好主意吗?@just4ask4,我在生产中使用:)字段自动连接是一个糟糕的做法,因为Spring将通过反射注入依赖项。这样的代码可能很难测试,这就是为什么构造函数注入或setter注入是一种更好的方法——您不需要与Spring耦合,就可以让依赖项的对象运行。