如何获得任何课程的实例?

时间:2014-04-01 06:13:28

标签: java spring-mvc singleton instance

我有以下代码,我根据请求来手动获取类的实例进行处理。

假设我有一个接口将由每个类实现:

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()

任何人都知道,请给我指导。

2 个答案:

答案 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);

此处ffooBar对象。

如此短而简单的代码,删除了太多不必要的代码。

谢谢大家。