当前位置: 首页 > 知识库问答 >
问题:

spring Beans实现接口的工厂

贺靖
2023-03-14

考虑到一个由许多实体组成的项目,我有一个服务需要知道实体的类型才能执行一个方法。我创造;

interface Service<T> {
  String myMethod(T entity)
  Class<T> getResponsibility()

和例如;

class FooService<Foo> {
  String myMethod(Foo entity) { return 'foo'; }
  Class<Foo> getResponsibility() { return Foo.class }

我想创建一个工厂来返回正确的Bean(我使用的是spring boot)来使用,我定义了这个Bean:

class ServiceFactory {
  List<Service<?>> services;
  
  @Autowired
  public ServiceFactory(List<Service<?>> services) {
    this.services = services;
  }

  Service getFor(Object entity) {
    // Simplified for comprehension purpose
    return this.services.stream().filter(service -> service.getResponsibility().equals(entity.getClass()).get();
}

这是可行的,但我有一个(声纳)警告说,我不应该“原始”使用service作为工厂方法的返回类型。实现这一点的正确方法是什么?使用通配符是另一个警告。

目标是有一个返回正确bean的工厂。是最初的设计错了吗?

共有1个答案

公冶子安
2023-03-14

不传递对象,而是传递类本身并将其捕获为方法类型参数:

<T> Service<T> getFor(Class<T> type) {
 类似资料:
  • 问题内容: 在JDBC中,要连接和执行DB中的语句,我们主要使用Connection,Statement和ResultSet这两个接口。但是它们对应的对象后来用于运行诸如createStatement(),executeQuery(),next()等的方法。哪个类实现了这些方法?为什么将其称为连接对象而不是已实现的类对象? 问题答案: 在JDBC中,您首先需要通过调用来注册驱动程序 加载数据库类并

  • 问题内容: 我有一个定义方法的接口。我有一个 实现 此接口的结构。在其中,我已经从该接口实现了方法,并且还定义了其他方法。 例如: 在操场上:https : //play.golang.org/p/B1GgoNToNl_l 在此,WagTail()不是Animal接口的一部分,但属于Dog结构。运行此代码会出现错误 dog.WagTail未定义(动物类型没有字段或方法WagTail)。 有没有一种

  • 我试图重写ResponseErrorHandler接口,以便能够在2xx以外的任何响应情况下返回整个请求(状态代码、正文等)。 我注意到Spring(RestTemplate)默认情况下,如果响应不是2xx会返回异常。我不想返回异常,我只想能够返回: 但是我不明白如何在不更改方法返回的情况下返回ResponseEntity(我无法通过实现方法来实现)。 执行:

  • 7.3. 实现接口的条件 一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口。例如,*os.File类型实现了io.Reader,Writer,Closer,和ReadWriter接口。*bytes.Buffer实现了Reader,Writer,和ReadWriter这些接口,但是它没有实现Closer接口因为它不具有Close方法。Go的程序员经常会简要的把一个具体的类型描述成

  • 本文向大家介绍实现Runnable接口和Callable接口的区别?相关面试题,主要包含被问及实现Runnable接口和Callable接口的区别?时的应答技巧和注意事项,需要的朋友参考一下 如果想让线程池执行任务的话需要实现的Runnable接口或Callable接口。 Runnable接口或Callable接口实现类都可以被ThreadPoolExecutor或ScheduledThreadP

  • 问题内容: 有没有为接口方法创建默认实现的首选方法或样式?假设我有一个常用的接口,在90%的情况下,我想要的功能是相同的。 我的第一个直觉是用静态方法创建一个具体的类。然后,当我想要默认功能时,可以将功能委托给静态方法。 这是一个简单的示例: 接口 方法的具体实现 使用默认功能的具体实现 这里有更好的方法吗? 编辑 在看到了一些建议的解决方案之后,我认为我应该更加清楚自己的意图。本质上,我正在尝试