我有一个配置了构造函数的旧类
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);)。
答案 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;
}
}