将数据库条目连接到Spring Bean

时间:2018-10-15 14:31:41

标签: java spring spring-bean

标题可能有点误导,但是我正在尝试找到将数据库条目连接到spring bean的最佳解决方案。我希望下面的示例可以澄清问题。

对于初学者来说,我有一个Task实体。

@Entity
@Table( name = "tasks")
class Task {

}

我还有一个TaskExecutor接口,该接口只有一种方法可以执行Task。

public interface TaskExecutor {
  void executeTask(Task t);
}

现在,我目前有3个TaskExecutor接口的实现。

@Service("taskExecutorOne")
class TaskExecutorOne implements TaskExecutor {  
}
@Service("taskExecutorTwo")
class TaskExecutorTwo implements TaskExecutor{
 }    
@Service("taskExecutorThree")
class TaskExecutorThree implements TaskExecutor{
} 

现在,每个任务都应由这三个任务执行者之一执行。 我遇到的麻烦是,确定在任务数据库条目和可用的执行程序服务之间建立连接的最佳解决方案。

1 。一种实现方法是使用三个值创建一个ExecutorType枚举:

 enum ExecutorType {
    EXECUTOR_ONE,
    EXECUTOR_TWO,
    EXECUTOR_THREE
    };

我们可以在任务表中添加一列,其中将包含特定任务的枚举值。这样,当我们需要获取任务的执行者时,我们可以执行以下操作:

@Service
class TaskRegisterService {
  @Autowired
  @Qualifier("taskExecutorOne")
  private TaskExecutor taskExecutorOne;

  @Autowired
  @Qualifier("taskExecutorOne")
  private TaskExecutor taskExecutorOne;

  @Autowired
  @Qualifier("taskExecutorOne")
  TaskExecutor taskExecutorOne;

  public TaskExecutor getExecutorForTask(Task t) {
    if(t.executorType == ExecutorType.EXECUTOR_ONE)
      return taskExecutorOne;
    else if(t.executorType == ExecutorType.EXECUTOR_TWO)
      return taskExecutorTwo;
    else if(t.executorType == ExecutorType.EXECUTOR_THREE)
      return taskExecutorThree;
  }
}

我不喜欢这种解决方案,因为创建新服务需要在枚举中添加新条目,并在if方法内添加新的getExecutorForTask部分。

2。。另一种方法是将bean名称存储在tasks表中。在这种情况下,getExecutorForTask看起来像这样:

@Service
class TaskRegisterService {

  @Autowired 
  private ApplicationContext applicationContex;

  public TaskExecutor getExecutorForTask(Task t) {
    return (TaskExecutor) applicationContex.getBean(t.getBeanName());
  }
}

这样,我将能够添加新的执行程序,而无需在getExecutorForTask方法中添加任何其他代码,但是我将不得不在数据库中存储bean名称。

有没有更好的方法来解决我刚才描述的问题?如果没有,我描述的哪种方法似乎更好? 我的目标是能够通过修改尽可能少的代码来轻松添加新的执行器。

2 个答案:

答案 0 :(得分:0)

我建议使用最后一个选项,根据枚举将bean名称添加到数据库是确定需要使用哪个执行程序的有效方法。它使您的代码更加动态和模块化,并且看起来更简洁(使用if-else语句更少),因此,我绝对鼓励您使用最后一个选项。

如果您还有其他问题想问,那么我将详细说明:)

答案 1 :(得分:0)

您可以创建TaskExecutor装饰器以选择实现。像这样:

print("Enter lower bound: ", end = " ")
lower = my_float(input()) #lower bound of definite integral

然后,您只能将此实现作为TaskExecutor注入。