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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Generics & Autowired 
:(
    Опции темы
isabsent
Дата 18.5.2011, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Избавился от повторения кода в классах DAO с помощью дженериков. Однако в коде классов сервисов приходится постоянно повторять однообразные действия.  Применить тот же способ, что и для DAO не получается, потому что в классах DAO инжектился заранее определенный бин SessionFactory
Код

public abstract class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> {
    
    private final Class<T> type;
    
    @Autowired
    private SessionFactory sessionFactory;    
    
    public GenericDAOImpl() {
        this.type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }
    
    public GenericDAOImpl(final Class<T> type) {
        super();
        this.type = type;
    }
...

а в классы сервисов нужно инжектить соответствующий сервису бин DAO, который зависит от T
Код

public class GenericServiceImpl <T, ID extends Serializable> implements GenericService<T, ID> {

private final Class<T> type;    
    
    @Autowired
    GenericDAOImpl<T, ID> dao;    
    
    public GenericServiceImpl() {
        this.type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }
    
    public GenericServiceImpl(final Class<T> type) {
        super();
        this.type = type;
    }
... 

Естественно, при инжекции Spring обнаруживает сразу несколько подходящих DAO-бинов и не знает какой из них выбрать. Подскажите, что тут можно предпринять?

Это сообщение отредактировал(а) isabsent - 18.5.2011, 15:51
PM MAIL   Вверх
MisterCleric
Дата 18.5.2011, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



Привет
@Qualifier
Больше всего обращаем внимание на эту фразу:
Цитата

For a fallback match, the bean name is considered a default qualifier value.


Это сообщение отредактировал(а) MisterCleric - 18.5.2011, 16:29


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
isabsent
Дата 18.5.2011, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не понял... На сколько я понимаю, параметр value у аннотации @Qualifier(value = "someBean") должен быть константой (именем бина).  А мне по смыслу проблемы надо туда передавать переменную на сколько я понимаю... Вы не могли бы поподробнее пояснить?
PM MAIL   Вверх
MisterCleric
Дата 18.5.2011, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



Похоже на то, что то, что ты хочешь, еще не реализовано:
http://www.google.com/search?q=Spring+Generics+%26+Autowired
Я бы предложил вариант вынести получение dao в какой-нибудь @PostConstruct метод, который из BeanFactory по твоему type буедт доставать соответствующий bean.
Это то, что быстрей всего реализовать.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
isabsent
Дата 18.5.2011, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Мысль понял... Получать через BeanFactory и получать из контекста Spring'a - это одинаковые по затратам способы или кто-то из них предпочтительнее?
PM MAIL   Вверх
MisterCleric
Дата 18.5.2011, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



http://static.springsource.org/spring/docs...ionContext.html
Это один и тот же объект


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
isabsent
Дата 18.5.2011, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот нагуглил что-то - для тех кому интересно. Возможно, что скоро станет стандартом в Spring'e.  smile 

Это сообщение отредактировал(а) isabsent - 18.5.2011, 22:00
PM MAIL   Вверх
isabsent
Дата 24.5.2011, 06:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(MisterCleric @ 18.5.2011,  18:26)
Я бы предложил вариант вынести получение dao в какой-нибудь @PostConstruct метод, который из BeanFactory по твоему type буедт доставать соответствующий bean.
Это то, что быстрей всего реализовать.

Подскажите, насколько этот рецепт затратен по ресурсам? Мне кажется, что это одноразовая операция при создании каждого бина и она не должна сильно нагружать сервер. Или не всё так очевидно?
PM MAIL   Вверх
MisterCleric
Дата 24.5.2011, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



Цитата

Подскажите, насколько этот рецепт затратен по ресурсам? Мне кажется, что это одноразовая операция при создании каждого бина и она не должна сильно нагружать сервер. Или не всё так очевидно?

Поскольку твои DAO и сервисы будут в Spring созданы в scope="singleton" (по-умолчанию). Я надеюсь, что ты их так конфигуришь. Иначе нет смысла в этом разделении.
То такая операция будет выполнена один раз при старте приложение, или точнее при первом обращении к такому бину: будь-то контейнером (Spring'овским) при инициализации, или при первом обращении к такому бину из приложения (когда у него стоит lazyInit)
Это раз. 
И второе: то ты не видел как именно выполняется операция инициализации, когда у тебя поле помечено как @Autowired
Ты же видел сколько работы выполнил человек, чтобы хоть как-то удовлетворить твое (или таких как ты) желание.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
isabsent
Дата 15.6.2011, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(MisterCleric @ 18.5.2011,  18:26)
Я бы предложил вариант вынести получение dao в какой-нибудь @PostConstruct метод, который из BeanFactory по твоему type буедт доставать соответствующий bean.
Это то, что быстрей всего реализовать.

Придумал еще один вариант - без "сильной связи" через контекст Spring'a, что как-то больше соответствует идеям, заложенным в Spring. Если нельзя для GenericService в @Autowired указать нужный в данный момент конкретный DAO, то можно указать их все, а потом по type выбрать нужный. Таким образом получим один абстрактный GenericService и все остальные сервисы пронаследуем от него. 
Реализовал это в виде отдельного бина, в котром в Map собраны все DAO (как value) и их .class.getName() (как key). Его и @Autowire в GenericService.

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

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

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


 




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


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

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