2017-10-12 85 views
3

問題1)從我的理解春季創建單身的對象,所以,當我有一個控制器像一個自動裝配Autowired服務之下,會影響threadsafety。spring-mvc線程安全中的自動裝配對象?

問題2)如果我在類級別聲明一個int型變量並在控制器或服務中使用它,是否會影響線程安全的?

@Controller 
public class LoginController { 

    @Autowired 
    public DaoService daoservice; 

    @RequestMapping("/") 
    public String getBookInfo() { 
     Book book = daoservice.getBookbyId(1L); 
     System.out.println(book.getTitle()); 
     return "welcome"; 
    } 
} 


@Service 
public class DaoService { 

    @Autowired 
    public BookRepository BookRepo; 

    public Book getBookbyId(Long Id) { 
     Book book = BookRepo.findOne(Id); 
     return book; 
    } 

} 
+0

線程安全無關的事實,如果事情是單身或沒有(或管理由Spring與否)。什麼讓類不是線程安全的是共享可變狀態。在你的示例中沒有共享狀態,所以這是線程安全的。現在,如果您要在類級別變量中共享/保存findOne的結果,那麼它不會是線程安全的(因爲多個線程可以同時修改單個共享實例)。 –

回答

2

問題1:難道春天豆線程安全的?
答案:
春天不給你的豆線程安全。 Spring提供了不同類型的bean作用域,如(Prototype,Singleton等)。如果原型然後一個新的bean創建每次它調用其中豆一次性創建和共享application context

如果你正在考慮爲HTTP請求,則2個或多個請求可以come.Hence一個bean的新的實例在每個請求範圍內創建。因此,您可以認爲它們在HTTP請求的上下文中是線程安全的,但它並不是Spring本身真正的線程安全。因爲多個線程可以在同一個HTTP請求上下文中共享該bean。

問題2:有類變量線程安全的?
答:沒有
here
所有私有成員變量是共享引用。它們可能是最終的,但這隻意味着引用不能改變。任何可變狀態都必須同步。

+0

您的答案::如果您正在考慮HTTP請求,那麼可能會出現2個或更多請求。因此,在每個請求範圍中都會創建一個bean的新實例。問題)對於你提到的HTTP請求,如果有兩個或更多的請求來了,創建了一個bean的新實例,你能解釋一下每個請求在這裏創建的是哪個bean –

+0

這就是我弄糊塗的地方,如果控制器是singleton ,我怎麼可以線程安全的每一個新的請求 –

+0

我已經說過,但它不是真正的線程安全的春天本身*。要明確,除* singleton *或* prototype *外,還有一些其他的範圍,如* request *,* session *。我正在說請求範圍。可能是我的第一個評論是有點混亂。你的'@ Controller'在請求範圍內。 –