当我使用原型范围自动装配线程时,我想知道是否应该考虑任何问题。
主题:
...
@Service
@Scope("prototype")
public class MyThread extends Thread {
...
}
线程起始类:
...
public class ThreadStarter {
@Autowired
private MyThread myThread;
public void startThread(){
myThread.start();
}
}
将从Web服务实现中调用起始类。
我是否应该考虑任何陷阱?
答案 0 :(得分:1)
不,自动装配只会影响选择哪个bean来实现依赖 - 只要你没有干预ApplicationContext(即同时添加/修改bean),就不会发生奇怪的事情。
在您的示例ThreadStarter
中,每次实例化时都会注入一个MyThread
的新实例 - 我希望这是你想要的。
答案 1 :(得分:1)
它的重要性取决于线程类实例的作用。
考虑Servlet doGet
和/或doPost
方法。如果你是无状态的并且没有将值保存在更广泛的范围内(例如会话或上下文),那么你可以毫不麻烦地告诉自己什么时候会调用你的servlet实例。但是,如果您是statefull(例如,将对象放入会话范围),那么您需要同步该servlet实例对所述范围(synchronized(session)
)的访问权限,或者序列化servlet线程处理请求的方式。
我想在这里你几乎处于同样的境地。您希望使您的线程实例成为原型作用域(因此每次需要注入时都会创建一个新实例)如果您是有状态的并且在线程之间共享数据,并且您可以将其保留为默认的单例范围。该线程的run()方法就其外部的数据而言是无状态的。