Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧靴。如何利用原型范围?_Java_Spring_Spring Boot_Runnable - Fatal编程技术网

Java 弹簧靴。如何利用原型范围?

Java 弹簧靴。如何利用原型范围?,java,spring,spring-boot,runnable,Java,Spring,Spring Boot,Runnable,我试图找到一种方法,在SpringBoot中创建一个优雅的可运行bean。该应用程序的目的是提供一个服务,接收一些数据,并启动一个受监控的外部进程 在我以前的尝试中,我只是建立了一个常规的新MyRunnable并将其传递给执行服务。现在,我正在考虑如何使用Spring环境正确地实现这一点,并使用@Scopeprototype 我确实找到了使用ApplicationContext.getBean…的示例和更好的方法,但我仍然无法正确理解如何在一个服务中实际调用新的MyRunnable,这将遵循以下

我试图找到一种方法,在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
>>>>>>>>>>>>>>