2015-04-27 20 views
5

"RequestContext" sınıfına sahibim ve request kapsamına sahiptir. Bu sınıf listOfItem numaralı özelliğe sahiptir. Bu listeyi kullanmam gereken yerdeyim . Şimdi ne zaman listOfItems istediğimde, her zaman context.getListOfItem()'u arayabilirim ama sorun, bunu bir çok kez tekrarlamam gereken çok özel bir yönteme sahibim. Kurucuda bu değeri tanımladığımda sorun yok mu?İstek kapsamı kullanırken güvenlik kodunu girin

public abstract class MyMapper{ 

@Autowired 
protected RequestContext context; 

private final List<String> listOfItem; 

public MyMapper() { 
    this.listOfItem = context.getListOfItem(); // is this thread safe and ok ? 
} 

public Object map(Object entity){ 

} 

} 

cevap

1

Evet, bu güvenli iplik sürece bir prototip kapsamı fasulyesi olarak bildirilmiş olması ise ve Bahar tarafından çağrılan bir init() yöntemi oluşturmak gerekir:? O parçacığı güvenli

@PostConstruct 
public void init() { 
    listOfItem = context.getListOfItem(); 
} 

RequestContext yalnızca tek bir iş parçacığından (isteği işlemek için tahsis edilen) erişilebilir, yapıcı, çağrılmadan hemen önce nesnenin oluşturulmasının doğası gereği yeniden giriş yapmaz. Bir gaz giderici tarafından paylaşılmasını onu durmuyor MyMapper nesnesinde kilitlenir sırf biri kullanılabilir olsaydı

'göremezsiniz (, listOfItem nasılsa olsa Evreselliğin sorunlarına karşı güvende olmak bu karıştırmamaya dikkat edin Senin durumunda. Ayrıca, bunun soyut bir sınıf olduğunu görüyorum, ancak listOfItem özel olduğu için, alt sınıflar buna erişemeyecektir. Bu Listenin herhangi bir sızdırılmış referansı, eşzamanlı iş parçacıkları tarafından manipüle edilebilir, referansta yapılan herhangi bir kopya vardı (çünkü List s Java'da değiştirilebilir).

Bu güvenlik amacınız olduğu için, alanın görünürlüğünü denetleyen bir birim testi oluşturun ve yansıma yoluyla alana erişilmesi uygun istisnayı atmazsa başarısız olur. Ayrıca alanın iş parçacığı olduğunu göstermek için alanı kendi dahili işaretleyici ek açıklamayla birlikte yorumlamak isteyebilirsiniz. Bu, belgelendirmeyle ve bir ek açıklama olarak, gelecekteki olası bir otomasyona yardımcı olur (örneğin, bu tür tüm ek açıklamaları arayabilecek ve yansıtma testini otomatik olarak çalıştırabilecek bir test tabanı gibi).

Çok temiz görünüyor! İyi işlere devam et.

+1

hm, ancak autowiring olduğunda null bağlam değil null? – hudi

+0

Evet, doğru, cevabımı güncelleyeceğim. (Son birkaç yıldır Scala'yı yapıyorum ...) –

+0

Eğer init yöntemi ilkbahar tarafından çağrılırsa, aynı soruna neden olmaz mıydı? Yoksa sınıfın singleton kapsamında olmaması gerektiğini mi düşünüyorsun? – eis