【问题标题】:How to get Instance of Any class?如何获取任何类的实例?
【发布时间】:2014-04-01 06:13:28
【问题描述】:

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

假设我有一个接口,每个类都会实现:

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) 来处理请求时,它会根据请求为我提供该类的实例。

所以我的问题是,有没有什么方法可以在没有@AutowiredfooBargetProcessor() 方法中的其他静态数据的情况下自动获取实例?

更新:

我已经用其他方法名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 然后删除方法等,以解释我的项目的完整流程和代码有点不可能,因为制作第一个骨架需要很长时间。

现在根据控制器中的请求,我必须根据请求映射数据并在该控制器类中调用方法ProcessRequest()

哪位知道的请指教一下。

【问题讨论】:

  • 我不知道@Autowired 是如何工作的,但你的函数 fooBargetProcessor 不应该有返回类型吗?
  • 您的代码不会运行(缺少返回类型),我看不到您的代码打算做什么。
  • 是的,我没有在这段代码中提供返回类型,但实际上都有返回类型,所以它会运行,我只想要类的单例实例。
  • 好的,所以你想使用每个类的特定实例,即使你有其他实例存在(所以它不是真正的单例)。我想更多地了解您的设计,以及您是如何产生这个想法的?
  • 先生,我已经用其他流程和数据更新了我的代码实际工作方式的问题。

标签: java spring-mvc singleton instance


【解决方案1】:

如果您想简单地获取所有 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 在List 中给我们所有fooBars。您需要将fooBar 实例标记为@Component 或其他东西,以便Spring 能够找到它们。 Spring 应该找到所有实例并将它们连接到List(请参阅@Autowired 的文档)。然后该方法使用 Java 泛型来确定您想要的类型,然后循环通过 List 来找到它。您可以使用Set 而不是List 来保证fooBar 对象的唯一性。

【讨论】:

  • 您好先生,感谢您的回答,看看我自己的回答。我尝试了一些新的东西,这对我来说效果很好。这是不同的东西,但这个简短的代码已经为我完成了一切。
【解决方案2】:

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

如此简短的代码,已经删除了这么多不必要的代码。

谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2012-12-30
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多