![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| isabsent |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 30.5.2010 Репутация: нет Всего: нет |
Избавился от повторения кода в классах DAO с помощью дженериков. Однако в коде классов сервисов приходится постоянно повторять однообразные действия. Применить тот же способ, что и для DAO не получается, потому что в классах DAO инжектился заранее определенный бин SessionFactory
а в классы сервисов нужно инжектить соответствующий сервису бин DAO, который зависит от T
Естественно, при инжекции Spring обнаруживает сразу несколько подходящих DAO-бинов и не знает какой из них выбрать. Подскажите, что тут можно предпринять? Это сообщение отредактировал(а) isabsent - 18.5.2011, 15:51 |
||||
|
|||||
| MisterCleric |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1043 Регистрация: 16.2.2006 Где: Харьков, Украина Репутация: 5 Всего: 38 |
Привет
@Qualifier Больше всего обращаем внимание на эту фразу:
Это сообщение отредактировал(а) MisterCleric - 18.5.2011, 16:29 -------------------- ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ... |
|||
|
||||
| isabsent |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 30.5.2010 Репутация: нет Всего: нет |
Не понял... На сколько я понимаю, параметр value у аннотации @Qualifier(value = "someBean") должен быть константой (именем бина). А мне по смыслу проблемы надо туда передавать переменную на сколько я понимаю... Вы не могли бы поподробнее пояснить?
|
|||
|
||||
| MisterCleric |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1043 Регистрация: 16.2.2006 Где: Харьков, Украина Репутация: 5 Всего: 38 |
Похоже на то, что то, что ты хочешь, еще не реализовано:
http://www.google.com/search?q=Spring+Generics+%26+Autowired Я бы предложил вариант вынести получение dao в какой-нибудь @PostConstruct метод, который из BeanFactory по твоему type буедт доставать соответствующий bean. Это то, что быстрей всего реализовать. -------------------- ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ... |
|||
|
||||
| isabsent |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 30.5.2010 Репутация: нет Всего: нет |
Мысль понял... Получать через BeanFactory и получать из контекста Spring'a - это одинаковые по затратам способы или кто-то из них предпочтительнее?
|
|||
|
||||
| MisterCleric |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1043 Регистрация: 16.2.2006 Где: Харьков, Украина Репутация: 5 Всего: 38 |
-------------------- ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ... |
|||
|
||||
| isabsent |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 30.5.2010 Репутация: нет Всего: нет |
Вот нагуглил что-то - для тех кому интересно. Возможно, что скоро станет стандартом в Spring'e.
Это сообщение отредактировал(а) isabsent - 18.5.2011, 22:00 |
|||
|
||||
| isabsent |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 30.5.2010 Репутация: нет Всего: нет |
Подскажите, насколько этот рецепт затратен по ресурсам? Мне кажется, что это одноразовая операция при создании каждого бина и она не должна сильно нагружать сервер. Или не всё так очевидно? |
|||
|
||||
| MisterCleric |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1043 Регистрация: 16.2.2006 Где: Харьков, Украина Репутация: 5 Всего: 38 |
Поскольку твои DAO и сервисы будут в Spring созданы в scope="singleton" (по-умолчанию). Я надеюсь, что ты их так конфигуришь. Иначе нет смысла в этом разделении. То такая операция будет выполнена один раз при старте приложение, или точнее при первом обращении к такому бину: будь-то контейнером (Spring'овским) при инициализации, или при первом обращении к такому бину из приложения (когда у него стоит lazyInit) Это раз. И второе: то ты не видел как именно выполняется операция инициализации, когда у тебя поле помечено как @Autowired Ты же видел сколько работы выполнил человек, чтобы хоть как-то удовлетворить твое (или таких как ты) желание. -------------------- ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ... |
|||
|
||||
| isabsent |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 30.5.2010 Репутация: нет Всего: нет |
Придумал еще один вариант - без "сильной связи" через контекст Spring'a, что как-то больше соответствует идеям, заложенным в Spring. Если нельзя для GenericService в @Autowired указать нужный в данный момент конкретный DAO, то можно указать их все, а потом по type выбрать нужный. Таким образом получим один абстрактный GenericService и все остальные сервисы пронаследуем от него. Реализовал это в виде отдельного бина, в котром в Map собраны все DAO (как value) и их .class.getName() (как key). Его и @Autowire в GenericService. Покритикуйте, плз... |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |