Java 弹簧靴。如何利用原型范围?
我试图找到一种方法,在SpringBoot中创建一个优雅的可运行bean。该应用程序的目的是提供一个服务,接收一些数据,并启动一个受监控的外部进程 在我以前的尝试中,我只是建立了一个常规的新MyRunnable并将其传递给执行服务。现在,我正在考虑如何使用Spring环境正确地实现这一点,并使用@Scopeprototype 我确实找到了使用ApplicationContext.getBean…的示例和更好的方法,但我仍然无法正确理解如何在一个服务中实际调用新的MyRunnable,这将遵循以下简单思想:Java 弹簧靴。如何利用原型范围?,java,spring,spring-boot,runnable,Java,Spring,Spring Boot,Runnable,我试图找到一种方法,在SpringBoot中创建一个优雅的可运行bean。该应用程序的目的是提供一个服务,接收一些数据,并启动一个受监控的外部进程 在我以前的尝试中,我只是建立了一个常规的新MyRunnable并将其传递给执行服务。现在,我正在考虑如何使用Spring环境正确地实现这一点,并使用@Scopeprototype 我确实找到了使用ApplicationContext.getBean…的示例和更好的方法,但我仍然无法正确理解如何在一个服务中实际调用新的MyRunnable,这将遵循以下
class MyService {
public void triggerNewExternalTask() {
....
executionService.run(new MyRunnable());
我相信你走错了路 Spring依赖注入非常棒,但这并不意味着在编写正确的Spring启动应用程序中永远找不到对new的调用 在这种情况下,调用new是正确的做法。池中的每个执行器在启动时都应该获得自己的Runnable/Callable实例 对于任何方法作用域变量都是这样:最好在方法作用域中实例化它,并在退出方法时让垃圾收集器清理它。在这种情况下,Spring没有理由对bean的生命周期负责
当您尝试共享可运行实例时,您做得太过分了,尤其是当它们具有状态时。即使问题已经解决,您也会遇到另一种解决方案,即-@Lookup,它满足了以下任务: 实体: 服务:
@Service
public class ProtoService {
@Lookup
public Proto getProto() {
return null;
}
}
以及测试:
@Service
public class LookupWorks {
@Autowired
private ProtoService serv;
@PostConstruct
private void test() {
System.out.println(">>>>>>>>>>>>>>");
serv.getProto();
serv.getProto();
serv.getProto();
serv.getProto();
serv.getProto();
System.out.println(">>>>>>>>>>>>>>");
}
}
对于输出:
>>>>>>>>>>>>>>
count: 0
count: 1
count: 2
count: 3
count: 4
>>>>>>>>>>>>>>
不清楚您实际上想要修复什么问题,但是您是否查看了Spring中的@Scheduled注释?我正在尝试创建一个服务,它可以像Jenkins一样执行—触发多个具有属性的已定义CMD,并将输出作为单独的作业进行监视。为此,我目前正在研究如何实际形成新的Runnable实现,并在考虑是否可以通过Scope.PROTOTYPE和Spring的Bean factory实现这一点。感谢您的回复。目标有点不同——用Spring可以处理的东西替换新的MyRunnable调用,但是,总的来说,我理解你的观点。我会坚持好的旧的新的:我明白目的。应首选每个执行器一个新实例。
>>>>>>>>>>>>>>
count: 0
count: 1
count: 2
count: 3
count: 4
>>>>>>>>>>>>>>