2017-06-28 18 views
0

我有三類不同的範圍:當@ApplicationScoped被注入到另一個類中時,@ApplicationScoped bean中的不同範圍的依賴關係是否會再次重新注入?

// default scope 
public class DefaultScopedInstance { 
    private String someAttribute; 
} 

@SessionScoped 
public class SomeSessionScopedInstance implements Serializable { 
    private String username; 
    private String email; 
} 

@ApplicationScoped 
public class UniqueInstance { 

    private Clazz someUniqueData; //just an example. could be anything 

    @Inject 
    private SomeSessionScopedInstance sessionData; 

    @Inject 
    private DefaultScopedInstance someOtherData; 
} 

然後注入UniqueInstance到JAX-RS控制器(RequestScoped)是這樣的:

@Path("/someService") 
public class SomeRestSevice { 
    @Inject 
    private UniqueInstance uniqueInstance; 
} 

UniqueInstance將再次重新注入的依賴對於每一個新的請求,以尊重他們的範圍?

這可能與此設計存在併發問題?像其他用戶訪問SomeSessionScopedInstance的請求一樣嗎?

另外,由於某些原因,這可能會導致性能問題?

謝謝!

回答

2

UniqueInstance的依賴關係是否會爲每個新請求重新注入以尊重它們的作用域?

是在會話bean會話時,默認/依賴號爲no。我們先來談談@Inject private SomeSessionScopedInstance sessionData;。這一個將永遠包含當前會話的用戶數據會話,如果你嘗試在服務器端使用它而沒有一個,它會炸燬。這是如何完成的細節取決於實現,但對於焊接(您可能使用的),這是基於線程局部變量。它將提取綁定到當前執行代碼的線程的會話(這是現實的簡化版本)。

至於@Inject private DefaultScopedInstance someOtherData; - 這個不會被「重新注入」。它是@Dependent這意味着它的生命週期與它被注入的對象是一樣的,它是@ApplicationScoped bean。因此,只要該AppScoped bean存在,它將是同一實例。

這可能與此設計有一個併發問題?像某些請求從其他用戶訪問SomeSessionScopedInstance?

不,因爲我上面所描述的。你只有一個會話綁定到線程,就是這樣。

另外,由於某些原因,這可能會導致性能問題?

太模糊的問題。任何事情都可能有性能問題,如果你嚴重編碼,無論它背後的設計。

相關問題