更清洁的方式来获得原型的自动assembly字段的新实例

我遇到了这个问题,同时尝试自动运行一个可运行的类,并在不同的调用中创建它的不同实例并将其保存在数组中。

xml配置是:

 

在我的代码中,我正在尝试这样的事情:

 public class ThreadHandler{ @Autowired private ABC threadName; //getter ABC getThreadName(){ return threadName; } public void someFunction(){ List abc = new ArrayList(ABC>(); for (int i=0;i<SOME_CONST;i++){ ABC tName = getThreadName(); abc.add(tName); tName.start(); } } 

}

ABC成为一个Thread/Runnable/Callable

这样,它抛出java.lang.IllegalThreadStateException 。 但是,它工作正常,如果我使用ABC tName =appContext.getBean("threadName",ABC.class);

为什么会这样?

在尝试从getMethod获取对象时,我们不会获得新实例吗?

当您需要创建Runnable / Callable并将其注入applicationContext时,有更好的练习,它被称为查找方法:

让我们考虑所有Runnable / Callable类都是@Prototype和@Lazy

 @Component(value="task") @Scope(value="prototype") @Lazy(value=true) public class Task implements Runnable { public void run(){ ..... } } 

现在您需要创建查找方法工厂:

     

现在让我们实现TaskFactory本身,它是一个抽象类,并有一个抽象方法:

 @Component(value="taskFactory") public abstract class TaskFactory { public abstract Task createTask(); } 

魔术来了:

 public class ThreadHandler{ @Autowired private TaskFactory taskFactory; public void someFunction(){ Runnable task = taskFactory.createTask(); taskExecutor.execute(task); } } 

每次调用taskFactory singleton对象的createTask()方法时。 您将收到原型对象的全新实例

PS:别忘了添加

   

正确启用注释。

希望能帮助到你。

不,你没有获得一个新对象,只需访问一个包含对作为Prototype的bean的引用的字段。 Spring没有任何方法可以使用仅基于字段访问的新引用替换您的实例级引用。 它由自动assembly设置一次,然后它只是对该一个对象的引用。 如果您希望它实际创建一个新的,您需要在观察时使用getBean。

您可以告诉Spring重写您的get方法并使用方法注入将其替换为’getBean’,以从您的bean中获取Spring依赖项: