我有这个代码:
来电者:
public class MyManager {
@Inject
private ObjectProvider<MyService> mySvcProvider;
public void processMyData(){
MyService mySvc = mySvcProvider.getObject("myName", "c:\myfolder");
mySvc.processValues();
}
被叫:
@Named
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class MyService{
private long recId;
private List<String> values;
@Inject
private mySingletonDBService mnDBSvc;
@Inject
private mySingletonFileService myFileSvc;
@Inject
public myManager(long recName, File folder)
throws DataExtractException {
this.recId = myDBSvc.getRecId(recName); <- Throws NPE
this.values = myFileSvc.getValues(recId);
}
public processMyValues(){
....
}
}
所以在被调用者中调用构造函数时,它无法访问 myDBSvc 和 myFileSvc。两者均为空。我如何将我的单例服务注入到这个 prototypeBean 中。 . 我的包在 applicationContext.xml 中注册,如下所示,因此应该可以找到来自这里的所有 bean>
<context:component-scan base-package="my.package.myProject"/>
顺便说一句,这种注入在其他 Singleton Bean 的任何其他地方都有效。它不仅仅适用于这个原型 Bean。所以我可以在技术上尝试将这些服务注入调用者“MyManager”并将它们作为构造函数参数传递,但它很讨厌。在示例中,我只有两个服务,但在我的生产代码中,我使用了大约 10-15 个服务。把它全部放在构造函数上,然后从被调用者调用这个构造函数看起来是非常错误的。应该有一种方法可以将单例 bean 注入原型 bean。
我尝试的另一个选项是在下面使用 applicationContext.getBean(Class, args)。 同样的结果:构造函数被正确调用。但是这两项服务仍然是空的。从未注射过。我不知道有什么区别,但我也尝试使用 d@Autowired 而不是 Inject。那也不管用。同样的结果。