2011-10-07 123 views
1

我只是在想這個。如果我在春天有dao bean並且dao bean有一個受保護的/公共屬性「currentSQL」。對於所有相關請求或不是,這個屬性的值是「可見的」嗎?Bean中的方法屬性可見性(線程安全嗎?!)

實施例:

@Component 
public class FooDAO { 

    @Autowired 
    private DataSource dataSource; 

    private String currentSQL; 

    public void doSome() 
    { 
    currentSQL = "Foo SQL query"; 
    } 

    public String getSome() 
    { 
    return currentSQL; 
    } 
} 

是在例如currentSQL屬性上述每個請求或不安全?

回答

1

這取決於你如何設置FooDAO bean的範圍。

<bean id="fooDAO" class="-" scope="prototype"/> 

對於fooDAO spring的每個訪問(請求)創建一個FooDAO的新實例。然後它可以被認爲是線程安全的,只要你的本地線程不使用同一個FooDAO實例。如果是的話,你必須處理與「公共同步無效doSome()」

<bean id="fooDAO" class="-" scope="singleton"/> 

如果你的bean辛格爾頓,那麼它不是線程安全線程訪問。單例實例在您的應用程序中共享。如果是這種情況,那麼你必須同步該方法。

+0

重要的問題是你的DAO不應該有狀態。這不是一個好習慣。他們提供持久層的方法/操作。如果你的單例在服務層有狀態,你必須確保它們上的多重訪問必須同步,無論它們是否有狀態。 –

+0

&@ danny.lesnik嗯,我認爲:)在我的例子中是小錯誤,應該有「庫」註釋而不是「組件」。但是,這並沒有改變,Repository仍然是Singleton的範圍。而通過Spring定義,DAO應該是單例作用域(我希望:))。最好將所有屬性作爲參數傳遞給方法?或者是否有解決方案來使該屬性線程安全或請求安全。我需要這個功能,因爲我需要存儲一些針對每個請求不同的信息。 – Peter

+0

啊,我不小心刪除了我以前的評論。這個線程現在看起來很瘋狂:)。好的,正如我在春季手冊中看到的那樣,春天最好的做法是減少州級課程。好的,我會重構我的DAO類。 – Peter

0

不,它不會。你的bean是Singleton範圍,這意味着你只有一個類的實例,但這並不意味着它是線程安全的。 Singleton範圍與Singleton設計模式無關。您需要注意線程安全並同步訪問此屬性。