如何解决返回单例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);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。