2015-04-27 3 views
5

У меня есть класс «RequestContext», который имеет объем request. У этого класса есть атрибут listOfItem.Код безопасности резьбы при использовании области запроса

сейчас у меня есть класс MyMapper, где мне нужно использовать этот список. Теперь, когда я хочу listOfItems, я всегда звоню context.getListOfItem(), но проблема в том, что у меня есть много частного метода, где мне нужно повторять это много раз. Это нормально, когда я определяю этот атрибут в конструкторе? Это поточно:

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){ 

} 

} 

ответ

1

Да, потокобезопасен до тех пор, как он объявлен как области видимости прототипа боба, и вам необходимо создать init() метод, который вызывается Spring:

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

RequestContext доступен только из одного потока (выделенного для обработки запроса), конструктор не является повторным по характеру создания объекта непосредственно перед его вызовом.

Будьте осторожны, чтобы не путать с listOfItem каким-то образом быть защищены от проблем Реентерабельность, хотя, только потому, что она заблокирована в MyMapper объект не останавливает его от разделяют геттер, если один были доступны (там ISN» т в вашем случае). Я также вижу, что это абстрактный класс, но поскольку listOfItem является частным, подклассы не будут иметь к нему доступа. Любую пропущенную ссылку этого Списка можно было бы манипулировать параллельными потоками, если бы были какие-либо копии, сделанные из ссылки (поскольку List s изменяются на Java).

Поскольку эта безопасность является вашей целью, создайте единичный тест, который проверяет видимость поля и терпит неудачу, если доступ к полю через отражение не вызывает соответствующее исключение. Вы также можете прокомментировать поле со своей внутренней аннотацией маркера, чтобы указать, что поле является потокобезопасным. Это помогает с документацией и в виде аннотации потенциальной будущей автоматизации (например, тестовой базой, которая может искать все такие аннотации и автоматически запускать тест отражения).

Он выглядит очень чистым! Продолжайте хорошую работу.

+1

hm, но isnt контекст null, когда он является autowiring? – hudi

+0

Да, это правильно, я уточню свой ответ. (Я занимаюсь Scala в течение последних нескольких лет ...) –

+0

если метод init вызван весной, разве это не проблема с той же проблемой? Или вы предлагаете, чтобы класс не был в одиночном режиме? – eis

Смежные вопросы