Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Singleton в Spring layers, IOC / 3 сообщений из 3, страница 1 из 1
10.04.2007, 22:49:44
    #34451297
Alexey Turn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton в Spring layers, IOC
Правильно ли понимаю, что
Если используется singleton, то конструкции, описанные в коде ниже не являются потокобезопасными, и следовательно, если два потока зайдут в метод SimpleService.service()
то может получится не то, что ожидалось.

Выходы:
1. Не использовать в sinleton изменяемых свойств класса.
2. Использовать прототипы.
3. Синхронизировать доступ synchronize(this){}
4. Использовать ThreadLocal переменные.

Всвязи с этим вопрос:

Получается, что спринг со своей рекомендуемой layers, IOC, singleton архитектурой навязывает процедурный стиль программирования, при котором синглтоны дергают друг-друга и не имеют изменяемых свойств класса?

Можно создать прототип, используя BeanFactoryLocator, но при этом мы жестко пишем в коде Spring - специфичные строки, что авторы Spring не рекомендует делать просто так, а только в тех случаях когда чужое приложение инстанциирует какой-то из классов, реализующих его интерфейс.

А если так, то в каких случаях, кроме этих используется singletone=false, подскажите пожалуйста.

Или ,может быть, при вызове метода getXxx(), в этом случае создастся прототип и будет возвращен, а ссылка на него обнулена? Не понятно.

============================================================================
Есть синглтон Spring:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 public  MessageParser 
 {
         private  String message;
        
         private  String phone;

         public  String getPhone();
        
         public   void  setMessage(String msg){ this .msg=message;}

         public   void  parsePhone(){
               this .phone =  this .message.substring( 1 , 7 );
        
         }
 }

Есть его клиент:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 public   class  SimpleService{
   private  MessageParser messageParser;
   public   void  setMessageParser(msgParser){ this .messageParser=msgParser;}
   public   void  service(String msg)
    {
           this .messageParser.setMessage("msg");
           this .messageParser.parse();
          String phone =  this .messageParser.getPhone();
    }
}
...
Рейтинг: 0 / 0
10.04.2007, 23:20:53
    #34451323
Alexey Turn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton в Spring layers, IOC
Нашел в Spring Reference: 3.3.4.1. Lookup method Injection
Теперь моя душа спокойна.
...
Рейтинг: 0 / 0
11.04.2007, 08:45:30
    #34451625
vas0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Singleton в Spring layers, IOC
Можно несколькими путями пойти, когда у тебя singelton должен использовать не singelton`ы :

1. Method injection.

2. Реализовывать интерфейс BeanFactoryAware, сохранив ссылку на application context, а потом самому получать нужный bean через beanFactory.getBean().

3. Через ObjectFactory & ObjectFactoryCreatingFactoryBean

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 public   class  Service {

     private  ObjectFactory factory;

     public   void  setFactory(ObjectFactory factory) {
         this .factory = factory;
    }

     public   void  execute() {
        ... bean = (...) factory.getObject();
        // todo work
    }
}

beans.xml
Код: plaintext
1.
2.
3.
4.
5.
6.
    <bean id="factory"  class ="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
        <property name="targetBeanName"><idref local="someBean"/></property>
    </bean>

    <bean id="service"  class ="Service">
        <property name="factory" ref="factory"/>
    </bean>

Ну и походу в spring 2.0, если пользоваться новой схемой, аттрибут singelton был удален и вместо него ввели атрибут scope, который принимает значения: singelton, prototype, request, session, globalSession (последние три только для web приложений), если очень хочется то можно свой scope создать.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Singleton в Spring layers, IOC / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]