代码之家  ›  专栏  ›  技术社区  ›  user3145373 ツ

如何获取任何类的实例?

  •  0
  • user3145373 ツ  · 技术社区  · 12 年前

    我有以下代码,我使用这些代码根据请求手动获取类的实例。

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

    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(); 但这给了我空实例,所以我使用了 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,然后更新,如果DELETE,然后删除方法,等等,来解释我的项目的完整流程和代码有些不可能,因为制作第一个框架需要很长时间。

    现在,根据控制器中的请求,我只能根据请求和调用的方法映射数据 处理请求() 在该控制器类中。

    如果有人知道,请给我指导。

    2 回复  |  直到 12 年前
        1
  •  0
  •   CodeChimp    12 年前

    如果你想简单地 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 s在a List 。您需要 fooBar 标记为的实例 @Component 或者什么东西,让春天找到它们。Spring应该找到所有实例并将它们连接到 列表 (参见文档 @Autowired ). 然后,该方法使用Java Generics来确定所需的类型,然后循环通过 列表 找到它。你可以使用 Set 而不是 列表 以确保 fooBar 物体。

        2
  •  0
  •   user3145373 ツ    12 年前

    做了一些代码更改后,我删除了 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 对象

    这么短而简单的代码,删除了这么多不必要的代码。

    谢谢大家。