我有以下代码,我根据请求来手动获取类的实例进行处理。
假设我有一个接口将由每个类实现:
interface fooBar{
}
以下是我正在实现该接口的类,每个类根据请求具有不同的主体:
class AddFoo implements fooBar{
}
class DeleteFoo implements fooBar{
}
class AddBar implements fooBar{
}
class DeleteBar implements fooBar{
}
以下是根据请求手动返回实例的类:
class ProcessAllRequest{
@Autowired
private AddFoo addfoo;
@Autowired
private DeleteFoo deletefoo;
public fooBar fooBargetProcessor(fooBar f){
if(f.getClass.equals(AddFoo.class)){
return addfoo;
}else if(f.getClass.equals(DeleteFoo.class)){
return deletefoo;
}else return null;
}
}
我也尝试了return new AddFoo();
,但这给了我null实例,所以我使用了Autowired
并且工作得很好。
现在当我在任何一个类中调用fooBargetProcessor(fooBar f)
来处理请求时,它会根据请求给我该类的实例。
所以我的问题是,有没有任何方法,所以我可以在@Autowired
方法中使用fooBargetProcessor()
和其他静态数据自动获取实例?
更新:
我已在其他方法名称ProcessRequest()
中调用此方法。
尽管如此,我已经使用ModelMapper创建了命令并使用表单数据映射每个命令。
喜欢:
ModelMapper mapper = new ModelMapper();
AddFoo f = mapper.map(form, AddFoo.class);
ProcessRequest(f);
和ProcessRequest() i have called fooBargetProcessor()
方法。
示例类代码:
@Controller
@RequestMapping(value = "/api/foo")
public class Foo extends BaseApi{
@RequestMapping(method= RequestMethod.POST,consumes = "application/json")
public @ResponseBody
String add(@RequestBody AddFooForm form){
ModelMapper mapper = new ModelMapper();
AddFoo f = mapper.map(form, AddFoo.class);
ProcessRequest(f);
return "Hello";
}
}
现在根据请求/ api / foo /它将传递给各种方法,如果POST然后添加和PUT然后更新,如果删除然后删除方法就这样,解释我的项目的完整流程和代码有点不可能,因为制作第一个骨架需要很多时间。
现在根据请求进入控制器,我必须按照请求映射数据,并在该控制器类中调用方法ProcessRequest()
。
任何人都知道,请给我指导。
答案 0 :(得分:0)
如果您想简单地获取所有fooBar
,为什么不简单地向Spring询问数组或它们的集合?然后,在fooBargetProcessor()
中,您可以执行以下操作:
@Autowired
private List<fooBar> processors;
public <T extends fooBar> T getProcessor(Class<T> type) {
fooBar processor = null;
for (fooBar p : processors) {
if (p.getClass().equals(type)) {
processor = p;
break;
}
}
return processor;
}
警告:这是从内存中输入的,因此可能需要进行一些测试和代码清理。
基本上,我们要求Spring在fooBar
中向我们提供所有List
个。您需要将fooBar
个实例标记为@Component
或其他东西,以便Spring找到它们。 Spring应该找到所有实例并将它们连接到List
(请参阅@Autowired的文档)。然后,该方法使用Java Generics确定您想要的类型,然后循环遍历List
以找到它。您可以使用Set
代替List
来保证fooBar
个对象的唯一性。
答案 1 :(得分:0)
在做了一些代码更改后,我删除了class ProcessAllRequest
和我调用它的方法fooBargetProcessor(fooBar f)
我编写了这段代码并且对我有用,现在我已经得到了任何操作的实例/在课程时间上课。
感觉很好,因为我第一次使用这种类型的代码并且工作正常。
代码:
首先,我在类中有Autowired
个应用程序上下文,如:
@Autowired
private ApplicationContext context;
然后在ProcessRequest()
方法中我编写了这个代码来获取实例:
String processorName = Introspector.decapitalize(f.getClass().getSimpleName() + "Processor");
ICommandProcessor processor = (ICommandProcessor) context.getBean(processorName);
此处f
是fooBar
对象。
如此短而简单的代码,删除了太多不必要的代码。
谢谢大家。