![](/img/trans.png)
[英]Can I use spring @Autowired dependency injection to build multiple instances of a class?
[英](Spring) Can I use dependency injection inside a loop?
我目前正在使用Spring Boot應用程序,該應用程序允許用戶將類別保存到數據庫中。 我可以使我的代碼“工作”,但是,我認為它限制了我可以進行的測試數量,因此是我的問題。
控制器接收類別列表。 控制器遍歷這些類別,驗證它們,並根據它們是否有效將它們保存到數據庫中。 控制器最終返回消息列表,以便收件人可以識別已接受或拒絕的類別,等等。
我有一個模型消息列表(List),在每次迭代時,控制器會實例化一個新的模型消息(new ModelMessage()),並最終將其添加到列表中。 有沒有一種方法可以在每次迭代時注入新的ModelMessage,或者我需要使用new關鍵字嗎? 如果我確實使用了new關鍵字,我會感覺這限制了我的可測試性/將控制器與模型消息緊密耦合。
控制器:
@PostMapping("/category")
public String saveCategoryModelToDatabase(@RequestBody CategoryModelWrapper categoryModelWrapper){
List<CategoryModel> categoryModelList = categoryModelWrapper.getCategoryModelList();
modelMessageList.clear();
for(CategoryModel categoryModel : categoryModelList){
//Resetting model
modelMessage = new ModelMessage(); //This tightly couples my method to the ModelMessage class, which is bad for testing?
//@Autowired modelMessage; <-- something like this? Inject a new ModelMessage with each iteration.
modelMessage.setName(categoryModel.getName());
//Resetting categoryModelErrors
Errors categoryModelErrors = new BeanPropertyBindingResult(categoryModel, "categoryModel");
categoryModelValidator.validate(categoryModel, categoryModelErrors);
if(categoryModelErrors.hasErrors()){
modelMessage.setStatus(ModelMessageStatusEnum.REJECTED);
modelMessage.setReason(MODEL_MESSAGE_0004);
}
if(categoryModelService.save(categoryModel)){
modelMessage.setStatus(ModelMessageStatusEnum.ACCEPTED);
}
else{
modelMessage.setStatus(ModelMessageStatusEnum.REJECTED);
modelMessage.setReason(MODEL_MESSAGE_0005);
}
modelMessageList.add(modelMessage);
}
return gson.toJson(modelMessageList);
}
對收件人的響應示例:
[{"name":"Arts","status":"ACCEPTED"},{"name":"Business","status":"ACCEPTED"},{"name":"Gaming","status":"ACCEPTED"},{"name":"Deals","status":"REJECTED","reason":"Category rejected because of an unexpected exception, i.e. possibly due to duplicate keys."}]
謝謝你的幫助 :)
您可以將ApplicationContext(假設您有權訪問)用作ModelMessage的工廠。 但是,那真的必要嗎?
我認為您可以在Controller中創建新的ModelMessages,它只是一個數據對象,而不是服務bean。 一個junit可以檢查該方法的結果。
但是,如果您真的想使用Spring,我會看看FactoryBean ...
例:
public class ModelMessage {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Component
public class ModelMessageFactory implements FactoryBean<ModelMessage> {
@Override
public ModelMessage getObject() throws Exception {
return new ModelMessage();
}
@Override
public Class<?> getObjectType() {
return ModelMessage.class;
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
@SpringJUnitConfig
public class ModelMessageFactoryTest {
@Autowired
private ModelMessageFactory messageFactory;
@Test
public void testGetObject() throws Exception {
assertNotNull("Factory is null", messageFactory);
IModelMessage modelMessage1 = messageFactory.getObject();
IModelMessage modelMessage2 = messageFactory.getObject();
assertNotEquals("error object is equal", System.identityHashCode(modelMessage1),
System.identityHashCode(modelMessage2));
}
@Test
public void testGetObjectType() throws Exception {
assertEquals(ModelMessage.class, messageFactory.getObjectType());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.