将单例服务注入原型 Bean

问题描述 投票:0回答:0

我有这个代码:

来电者:

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。那也不管用。同样的结果。

singleton prototype javax.inject
© www.soinside.com 2019 - 2024. All rights reserved.