Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Связь Spring бинов 
:(
    Опции темы
oson
Дата 3.8.2008, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



Подскажите плиз  


Есть у меня spring session bean Manager и есть singleton bean Calculator
Код

<bean id="manager" class="my.Manager" scope="session">
         <property name="calc" ref="calculator" />
     </bean>

    <bean id="calculator"  class="my.Calculator" scope="singleton"/>


в классах пишу

Код

 public class Manager
 {
      private int value1;
      public int getValue1() {...
     
      private Calculator calc;
      public void setCalc(Calculator calc) {...
      public Calculator getCalc() { ...
  }

 public class Calculator
{
    public int calculate(int val)
    {
        //здесь чтото вычисляется с этим val
       return val + 10;
     }
}

Синглетон Calculator инициализируется первым при старте приложения.
Когда логинится юзер, то инициализируется сессион бин Manager и вызывается метод setCalc(Calculator calc)
Но дело в том, что я хочу вызвать из класса Manager метод  calculate класса Calculator
и передать ему переменную value1.
Приходится делать вот так
Код

  public int useManager
{
              
              Manager manager = (Manager)applicationContext.getBean("manager"); 
              return  manager.getCalc().calculate(manager.getValue1());
}

А нельзя ли както в конфигурационном файле прописать сразу, чтобы в классе Calculator была уже такая переменная класса val
Код

  public class Calculator
{
    private int val;
    public void setVal(int val) {...
    public int calculate()
    {
        //здесь чтото вычисляется с этим val
       return val + 10;
     }
}


и чтобы при инициализации Manager и соответственно вызове метода manager.setCalc() эта переменная val сразу получала значение из переменной value1 класса Manager. Ну то есть, чтобы не писать
 
Код

public int useManager
{
              
  ...
              return  manager.getCalc().calculate(manager.getValue1());
}



а как то так
Код

public int useManager
{
              
  ...
              return  manager.getCalc().calculate();
}



и эта переменная manager.getValue1() уже передалась бы через конфиг в класс Calculator?
PM MAIL   Вверх
Kangaroo
Дата 4.8.2008, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



oson, не понимаю.. val у тебя для каждого пользователя свой? Тогда почему ты кладешь его в общий для все Калькулятор?


--------------------
Lost....
PM MAIL MSN   Вверх
ivg
Дата 4.8.2008, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата(oson @  4.8.2008,  02:02 Найти цитируемый пост)
чтобы в классе Calculator была уже такая переменная класса val и чтобы при инициализации Manager и соответственно вызове метода manager.setCalc() эта переменная val сразу получала значение из переменной value1 класса Manager

Не делайте так с синглтоном. Это будет баг многопоточного доступа, а такие баги трудноуловимы, бррр.  smile
Не нравится: 
Код

    return  manager.getCalc().calculate(manager.getValue1());
 Сделайте в классе Manager метод, например 
Код

    public int useCalculator() {
        return this.calc.calculate(this.value1);
    }
 и вместо 
Код

    return  manager.getCalc().calculate(manager.getValue1());
 у вас будет 
Код

    return  manager.useCalculator();

И кстати, вот такого подхода 
Код

    Manager manager = (Manager)applicationContext.getBean("manager");
 в Спринге нужно по возможности избегать.
PM MAIL   Вверх
oson
Дата 4.8.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



Ну я сделал примерно вот так
Код

  public class Manager
{
   private Calculator calc;
   private String value1;
   public void setValue1(...) {...}
    public void setCalc(Calculator calc)  //это метод для Спринга
    {
        this.calc = calc;
    }

    public Calculator getCalculator()
    {
        return this.calc.getInstance(value1);
    }
}

 public class Calculator
{
  private String val;
  public Calculator getInstance(String val)
 {
     this.val = val;
     return this;
  }
  public String calculate()
 { 
     return this.val + "something else";
 }
}

//И потом вызываю вот так
       
        String result =manager.setValue1("v1").getCalculator().calculate();



Наверное надо или  public Calculator getInstance(String val) сделать sinchronized или сделать весь класс Calculator -  prototype (вместо singleton).
Что скажете?
PM MAIL   Вверх
ivg
Дата 4.8.2008, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата(oson @  4.8.2008,  15:34 Найти цитируемый пост)
Ну я сделал примерно вот так
Те же грабли.
Цитата(oson @  4.8.2008,  15:34 Найти цитируемый пост)
public Calculator getInstance(String val) сделать synchronized
 Не поможет.
Цитата(oson @  4.8.2008,  15:34 Найти цитируемый пост)

Код

//И потом вызываю вот так
        String result =manager.setValue1("v1").getCalculator().calculate();

 Я думал вы хотите улучшить читабельность кода. Что ж тогда вы хотите получить, поясните.

PM MAIL   Вверх
oson
Дата 4.8.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 289
Регистрация: 3.3.2004
Где: Севастополь

Репутация: нет
Всего: 1



Вы правы
Сделал как вы посоветовали
А сделать я хотел следующее
У меня есть стратсовский актион
Оттуда вызывается именно сессион бин Manager и именно тем способом что Вы сказали нежелательно пользовать
Код

Manager manager = (Manager)applicationContext.getBean("manager");

(Кстати, а как в этом случае еще доступ к нему получить?)
Но чтобы не перегружать этот Manager, так как он для всех Actions один, я хотел сделать для каждого конкретного Action такой отдельный класс, типа Stateless Bean. То есть Manager держит переменные в определенном состоянии для текущего пользователя, и когда их Action происходит какой-то вызов, он передается такому Calculator, который чтото подсчитывает (исходя из состояний переменных класса Manager) и это значение возвращается к Action.


PM MAIL   Вверх
ivg
Дата 4.8.2008, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата(oson @  4.8.2008,  19:10 Найти цитируемый пост)
Оттуда вызывается именно сессион бин Manager и именно тем способом что Вы сказали нежелательно пользовать

Нежелательно в бинах Спринга, кто ж знал, что у вас там Struts используется. Integrating with Apache Struts 1.x and 2.x и spring-plugin смотрели?
Цитата(oson @  4.8.2008,  19:10 Найти цитируемый пост)
Но чтобы не перегружать этот Manager, так как он для всех Actions один, я хотел сделать для каждого конкретного Action такой отдельный класс, типа Stateless Bean. То есть Manager держит переменные в определенном состоянии для текущего пользователя, и когда их Action происходит какой-то вызов, он передается такому Calculator, который чтото подсчитывает (исходя из состояний переменных класса Manager) и это значение возвращается к Action

Может код Calculator'а перенести в Action Struts'а? Зачем его конфигурировать в Спринге? И вторая мысль - Нужны ли Manager'у ссылки на все эти Calculator'ы, когда их можно также получить из Спрингового контекста в Action'е Struts'а?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0793 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.