Spring:如何在没有构造函数的情况下初始化属性?

时间:2017-08-09 14:51:24

标签: java spring

我有一个配置了构造函数的旧类

public class Outer
{
  ...
  public Outer(OldService oldService) { this.oldService = oldService;}
}

我需要使用新服务添加新字段,但不能更改构造函数(太多遗留代码依赖于它)。所以,我希望得到像

这样的东西
public class Outer
{
  private NewService newService; // Need injection here
  public Outer(OldService oldService) { this.oldService = oldService;}
}

@Component
public class NewService
{
    public NewService(Dependency dependency){this.dependency = dependency;}
}

我尝试为Outer.newService应用@Autowired和@Inject属性,但它没有帮助。我可以创建Outer.Initiate(NewService newService)方法,但这会给已经闻到的项目添加一些内容。

那么,我可以在Spring中注入字段吗?

Upd1 现在手动执行外部构造函数(如var outer = new outer(service);)。

2 个答案:

答案 0 :(得分:2)

由于Outer.class不是由Spring容器实例化的,而是由new实例化的,因此Spring容器无法知道它。这就是为什么Spring不能为NewService执行依赖注入。

现在,如果您将Outer实例化为Spring,除了自动装配NewService之外,您还需要自动装配或使用任何弹簧布线将OldService连接到Outer }。

答案 1 :(得分:1)

您可以使用字段级注入:

public class Outer{
  @Autowired
  private NewService newService; 
  public Outer(OldService oldService) { this.oldService = oldService;}
}

我不喜欢这种方法,因为它使测试变得更加麻烦并且隐藏了依赖性。

而不是这个,只需使用一个setter并用Autowired注释它,它做同样的事情:

public class Outer{
  private NewService newService; 
  public Outer(OldService oldService) { this.oldService = oldService;}

  @Autowired
  public setNewService(NewService newService){
    this.newService = newService;
  }
}