Java Spring:使用;查找方法注入“;因为我的ThreadFactory看起来不可伸缩

Java Spring:使用;查找方法注入“;因为我的ThreadFactory看起来不可伸缩,java,spring,prototype,factory,Java,Spring,Prototype,Factory,我们正在构建一个ThreadFactory,所以每当一个单例控制器需要一个新线程时,我每次都会得到一个新实例 看起来不错,但是如果我们有多个线程类呢?我喜欢这样的事实,我可以自动连接我的线程 比如: 和配置: <bean id="threadManager" class="bla.ThreadManager" singleton="true"> <lookup-method name="createThreadA" bean="threadA" /> &l

我们正在构建一个
ThreadFactory
,所以每当一个单例控制器需要一个新线程时,我每次都会得到一个新实例

看起来不错,但是如果我们有多个线程类呢?我喜欢这样的事实,我可以自动连接我的线程

比如:

和配置:

<bean id="threadManager" class="bla.ThreadManager" singleton="true">
    <lookup-method name="createThreadA" bean="threadA" />
    <lookup-method name="createThreadB" bean="threadB"/>
</bean>
<!-- Yes! i can autowire now :)-->
<bean id="threadA" class="bla.ThreadA" singleton="false" autowire="byType">
<bean id="threadB" class="bla.ThreadB" singleton="false" autowire="byType">
问题:我不想为每个新的threadclass创建一个抽象的“create”方法

是否有可能将此一般性设置为:

threadManager.createThread(ThreadA.class);
我还研究了
ServiceLocatoryFactoryBean
,但是对于多个类,我必须传递bean名称(不是类型安全的)。
谢谢你

我认为没有办法自动做到这一点。如果您不想像建议的那样使用
ExecutorService
,您可以手动实现,如果这对您来说是一个问题(但我认为不是)

  • 使您的
    threadManager
    实现
    ApplicationContextAware
    BeanFactoryAware
    ,从而获得应用程序上下文/bean工厂
  • 在您的
    createThread(..)
    方法中,使用上面获得的上下文/工厂来获取线程bean的实例(当然应该是范围
    prototype

    • 我认为没有办法自动做到这一点。如果您不想像建议的那样使用
      ExecutorService
      ,您可以手动实现,如果这对您来说是一个问题(但我认为不是)

      • 使您的
        threadManager
        实现
        ApplicationContextAware
        BeanFactoryAware
        ,从而获得应用程序上下文/bean工厂
      • 在您的
        createThread(..)
        方法中,使用上面获得的上下文/工厂来获取线程bean的实例(当然应该是范围
        prototype


      现代Java应用程序没有理由创建自己的线程。
      java.util.concurrent.ExecutorService
      是处理异步处理的一种更简单的方法。是的,我看过“TaskExecutor”,但我可能不使用它。遗留代码。不同线程类之间有什么区别?他们运行不同的runnables吗?那么通过runnable不是更容易吗?如果没有,则使用
      Class@Christopher:是的,runnables有意义,但我们需要isAlive()方法的线程。是的,我喜欢这里的遗留代码…@Michael:我在考虑将Runnable传递给工厂,然后得到一个线程,这个线程在Runnable上工作。那么您就不需要几个线程类了,现代Java应用程序真的没有理由创建自己的线程。
      java.util.concurrent.ExecutorService
      是处理异步处理的一种更简单的方法。是的,我看过“TaskExecutor”,但我可能不使用它。遗留代码。不同线程类之间有什么区别?他们运行不同的runnables吗?那么通过runnable不是更容易吗?如果没有,则使用
      Class@Christopher:是的,runnables有意义,但我们需要isAlive()方法的线程。是的,我喜欢这里的遗留代码…@Michael:我在考虑将Runnable传递给工厂,然后得到一个线程,这个线程在Runnable上工作。那么您不需要几个线程类谢谢,但这不是我在问题中描述的问题。您希望我不使用IOC并调用getbean()?是的。但无论如何,这就是查找方法实际上正在做的事情。这将只是你的自定义查找方法,这样我也没有类型安全性。我想传递这个类,但是getbean()需要一个bean名。看看其他方法-你可以列出所有bean并得到一个具有适当类的bean。谢谢,但这不是我在问题中描述的问题。你想让我不要使用IOC并调用getbean()?是的。但无论如何,这就是查找方法实际上正在做的事情。这将只是你的自定义查找方法,这样我也没有类型安全性。我想传递这个类,但是getbean()需要一个bean名。看看这里的其他方法——您可以列出所有bean,并获得一个具有适当类的bean。
      
      threadManager.createThreadA();
      
      threadManager.createThread(ThreadA.class);