返回单例Spring bean的静态方法

问题描述

尝试在春季启动时构建任务执行程序应用程序。这个想法是设计一个模板来检索认的TaskConfig,以便执行者可以执行它。

@Component
public class TaskExecutor {

private final TaskTemplate taskTemplate;

@Autowired
public TaskExecutor(TaskTemplate taskTemplate) {
    this.taskTemplate=taskTemplate;
}

public void runTask() {
final TaskConfiguration taskConfig = taskTemplate.getTaskConfig("taskName");
  taskConfig.do();
  }
}

@Component
public class TaskTemplate {
private final TaskParam1 taskParam1;
private final TaskParam2 taskParam2;

@Autowired
public TaskTemplate(TaskParam1 taskParam1,TaskParam2 taskParam2) {
    this.taskParam1 = taskParam1;
    this.taskParam2 = taskParam2;
}

public TaskConfiguration getTaskConfig() {
// Logic to build the task configuration from task template params
 }
}

我看到的问题是TaskTemplate与TaskExecutor(自动接线)耦合,我希望将其删除。 我想用静态方便的方法替换它以返回单例模板,以便我可以执行它的getTaskConfig

正在寻求改进建议。

谢谢

解决方法

您可以将ApplicationContext注入另一个bean,如下面的代码所示。在spring初始化之后,您可以使用BeanGetter.getTaskTemplate()获取TaskTemplate单​​例bean。

...
final TaskConfiguration taskConfig = BeanGetter.getTaskTemplate().getTaskConfig("taskName");
...
@Service
public class BeanGetter {

    private static ApplicationContext applicationContext;
    
    @Autowired
    public BeanGetter(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    public static TaskTemplate getTaskTemplate(){
        return applicationContext.getBean(TaskTemplate.class);
    }
}