2011-11-24 103 views
1

我想知道當我使用原型範圍自動裝入線程時是否應該預料到任何問題。@Autowired和線程的陷阱

螺紋:

... 
@Service 
@Scope("prototype") 
public class MyThread extends Thread { 
    ... 
} 

線程開始類:

... 
public class ThreadStarter { 

    @Autowired 
    private MyThread myThread; 

    public void startThread(){ 
    myThread.start(); 
    } 
} 

出發類將從Web服務實現中調用。

我應該考慮哪些缺陷?

回答

1

那麼它重新取決於線程類實例的作用。

想到Servlet doGet和/或doPost方法。如果你是無狀態的並且不把值保存在更廣泛的範圍內(比如會話或上下文),那麼你可以不用擔心自己將在什麼時候調用servlet實例。但是,如果你有狀態(例如將對象放到會話範圍中),那麼你需要將該servlet實例的訪問同步到所述範圍(synchronized(session))或序列化servlet線程處理請求的方式。

我想在這裏你幾乎處於相同的情況。如果你是事實狀態的並且在你的線程之間共享數據,你想讓你的線程實例成爲原型作用域(並且因此在每次需要注入時創建一個新實例),並且可以將其保留到單例的默認範圍if該線程的run()方法就其所涉及的數據而言是無狀態的。

1

不,自動裝配隻影響選擇哪個bean來實現依賴性 - 只要您不干涉ApplicationContext(即同時添加/修改Bean),就不會發生奇怪的事情。

在你的例子ThreadStarter將被注入一個新的實例MyThread每次它實例化 - 我希望是你想要的。