Видимость свойств метода в компоненте (потокобезопасен или нет ?!)

#java #spring #spring-mvc

#java #весна #spring-mvc

Вопрос:

Я просто думаю об этом. Если у меня есть компонент dao весной, и этот компонент dao имеет защищенное / общедоступное свойство «currentSQL». Это будет значение в этом свойстве «видимым» для всех сопутствующих запросов или нет?

Пример:

 @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 id="fooDAO" class="-" scope="prototype"/>
  

для каждого доступа (запроса) к FooDao spring создает новый экземпляр FooDao. Тогда его можно считать потокобезопасным, если ваши локальные потоки не используют один и тот же экземпляр FooDao. Если это так, вы должны обрабатывать доступ к потоку с помощью «public synchronized void doSome ()»

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

если ваш компонент одноэлементный, то он не потокобезопасен. Одноэлементный экземпляр является общим для вашего приложения. Если это так, то вам необходимо синхронизировать метод.

Комментарии:

1. важная проблема заключается в том, что ваш DAO не должен иметь состояния. Это не очень хорошая практика. Они предоставляют методы / операции на уровне сохранения. Если ваши синглтоны имеют состояние, например, на уровне сервиса, вы должны убедиться, что множественный доступ к ним должен быть синхронизирован независимо от того, имеют ли они состояние или нет.

2. amp; @danny. лесник Ах, я так и думал 🙂 В моем примере небольшая ошибка, вместо «Компонента» должна быть аннотация «Репозиторий». Но это ничего не меняет, репозиторий по-прежнему является одноэлементной областью. И по определению Spring DAO должны быть одноэлементными (я надеюсь :)). Тогда лучше передать все свойства методам в качестве аргументов? Или есть решение, чтобы сделать это свойство потокобезопасным или безопасным для запросов. Мне нужна эта функциональность, потому что мне нужно хранить некоторую информацию, которая отличается для каждого запроса.

3. Ах, я случайно удалил свой предыдущий комментарий. Теперь этот поток выглядит сумасшедшим :). Хорошо, как я читал в руководстве spring, вообще лучше всего иметь классы без состояния в spring. Хорошо, тогда я проведу рефакторинг своего класса DAO.

Ответ №2:

Если ваша конфигурация компонента настраивает ваш DAO как компонент с одноэлементной областью действия (http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-scopes ), этот объект будет использоваться совместно во всем вашем приложении, куда он вводится, и этот экземпляр var не будет безопасным. Пожалуйста, обратите внимание, что область singleton является областью по умолчанию.

Ответ №3:

Нет, этого не будет. ваш компонент является одноэлементной областью, что означает, что у вас есть только один экземпляр класса, но это не значит, что он потокобезопасен. Область действия Singleton не имеет ничего общего с одноэлементным шаблоном проектирования. Вам нужно позаботиться о безопасности потоков и синхронизировать доступ к этому свойству.