LINUX.ORG.RU

Инъекции зависимостей (@Inject) в Java EE

 ,


0

1

Доброго времени суток. На сколько я понял, инъекции призваны динамически выбирать нужную реализацию интерфейса. Один вопрос, на который я за 3 дня гугления так и не смог найти ответ: по какому нахрен признаку он их должен отличать (без квалификаторов)? По набору входных параметров, по возвращаемому значению? Спасибо



Последнее исправление: cetjs2 (всего исправлений: 1)

Так ведь если нельзя однозначно определить, что инжектить, DI-фреймворк обычно ругается, а приложение рушится через небольшое время после запуска. Никакой магии нет и быть не может, контейнер мысли программиста угадывать не может.

CARS ★★★★
()
Последнее исправление: CARS (всего исправлений: 1)

Это немножко магия, но посмотри реализации IoC, DI. Например можно через Reflection, аннотации (хотя это несколько пошловато)

swwwfactory ★★
()
Ответ на: комментарий от CARS

Так ведь если нельзя однозначно определить, что инжектить

контейнер мысли программиста угадывать не может

Значит, нужно указать ему? Так вот это и есть вопрос темы: как? Явно-преявно или как его сориентировать?

WennY
() автор топика
Ответ на: комментарий от swwwfactory

swwwfactory

Это немножко магия, но посмотри реализации IoC, DI

Ну спасибо, осталось совсем уж в конец вывихнуть мозг и уехать на карете скорой помощи :) Я топ создавал в надежде, что без потрошения имеющихся продуктов получится фишку просечь

WennY
() автор топика

В каких-то фреймворках это делается через конфиг в xml, в каких-то - через аннотации, в каких-то надо отнаследовать класс-конфигурялку, в котором все это прописывается... Зависит от.

ovk48 ★★★
()
Последнее исправление: ovk48 (всего исправлений: 1)
Ответ на: комментарий от WennY

Ну спасибо, осталось совсем уж в конец вывихнуть мозг

не стоит так отчаиваться :) Чтение мантры SOLID помогает.

просечь

фантомы неизбежны - пока нет ясной картины. Иногда помогает выбор какой-то реализации, даже неправильной, чтобы прояснить общую картину.

swwwfactory ★★
()

Имеется в виду JavaEE?

Сервер приложений ищет их по типу, потом (если их много) по имени класса, потом (если даже так много) по параметрам квалификатора.

Насколько я помню, конечно...

Adonai ★★★
()

Замутил такой код:

public class Exec
{
    @Inject
    Generator generator;

    public void go()
    {
        new GeneratorClient( generator.gen() );
    }
}

Реализация GeneratorClient:

public class GeneratorClient
{
    GeneratorClient( Integer i )
    {
        System.out.println( i );
    }
}



Выплевывает NullPointerException при обращении к переменной generator. Шозафегня? Почему не инстанцирует объект? :(
WennY
() автор топика
Ответ на: комментарий от WennY

Generator - интерфейс, имеющий одну единственную реализацию IntGenerator, просто в конструкторе принимающую Integer, которую он и должен вроде как вызывать.

WennY
() автор топика
Ответ на: комментарий от WennY

Шозафегня?

Никакой фигни.
NPE - одна из лучших ошибок
1. Инжектор может заинжектить реализацию только если она существует
2. Инжектор может заинжектить реализацию только если он о ней знает
3. Инжектор может заинжектить реализацию в объект только если он прожевал его после создания.

Проверьте выполнение условий 1-3.

ya-betmen ★★★★★
()
Ответ на: комментарий от Adonai
public class IntGenerator implements Generator
{
    public Integer gen()
    {
        return 321;
    }
}

Делаю, в Beginning Java EE 7. Там никаких аннотаций в классе.

WennY
() автор топика
Ответ на: комментарий от Adonai

Да все уже пробовал. НИГДЕ по-людски не описано, зачем оно и как работает. В Beginning Java EE 7 тупо: «ололо тут мы инжектнули этагавно в вотэтагавно, все просто и понятно, а теперь - про квалификаторы». Видимо предполагается, что новичек, впервые узнавший про инжекты, сразу озаряется слепящим светом понимания (хоть бы один пример рабочий был), а все остальные сворачивают за угол и тихо встрывают там вены во имя генофонда. Что за люди, как для себя пишут.

P.S. Залил мой пример, я сдаюсь.

WennY
() автор топика
Ответ на: комментарий от WennY

Вот и ответ тебе.

Видишь ли, всё, что привносит в джаву EE, работает только если развертываешь своё приложение на серверах приложений (GlassFish или JBoss, например)

Рекомендую почитать, как создаются EAR-архивы (Enterprise Application aRchive) и как их разворачивать на серверах приложений.

Если у тебя Idea Ultimate, то там при создании проекта уже имеются готовые скелеты.

Если тебе _действительно_ нужно это всё/нужно это всё выучить, могу подкинуть пару быстрых гайдов.

Adonai ★★★
()
Ответ на: комментарий от WennY

Ага, скилл, значит, поднимаешь.

Вот гайд.

Вместо EJB делаешь свои инъекции. Всё остальное - точно так же. Для дополнительного изучения советую пооткрывать архиватором полученные EAR-файлы и посмотреть их структуру.

Adonai ★★★
()
Ответ на: комментарий от Adonai

Супер, ещё и под идею, спасибо :) Видимо, Beginning Java EE мальца рановато, там с места в каньон как я понял

WennY
() автор топика
Ответ на: комментарий от WennY

Меня тоже это удивляло всегда. Это, видимо, сродни «очевидно, что <5 страниц формул>» у математиков.

Обращайтесь. ЛОР-аналитики всегда к вашим услугам.

Adonai ★★★
()
Последнее исправление: Adonai (всего исправлений: 1)
Ответ на: комментарий от Adonai

Не признаюсь, потому что привык использовать ejb бины, которым нужно @Stateless, @Statefull, @Singleton и квалифаеры, если выделяются интерфейсы. А тс вон хочет без всякого этого :)

f1xmAn ★★★★★
()
Ответ на: комментарий от Adonai

Привет. Все сделал по ману, но вылезла старая-добрая фигня под названием «дебаг работает, ран отваливается»: клац.

Я в упор не понимаю, что ему не хватает. В конфиге урл стоит http://127.0.0.1:8080/webWeb/, все остальное по дефолту.

Спасибо заранее, гугл воды в рот набрал.

WennY
() автор топика
Ответ на: комментарий от Adonai

Все точно по ману, жбосс разворачивается, все настроено, в дебаг режиме все работает абсолютно корректно, урл открывается.

WennY
() автор топика
Ответ на: комментарий от WennY

А перед тем как после дебага запускаешь Run, JBoss останавливаешь?

Если да, то какие ошибки в консоли Application Servers?

Adonai ★★★
()

Аффтар, посмотри Google Guice, Picocontainer и Spring IoC и до поры не слушай россказней про сервера приложений и пр.

ovk48 ★★★
()
Ответ на: комментарий от Adonai

Не знаю, да и какая разница, надо ран запустить для начала.

WennY
() автор топика
Ответ на: комментарий от WennY

Проблема решена. Прозевал запись в логе «Could not reserve enough space for object heap». Решилось дописыванием -Xmx512m. Один минус: стартует уж больно долго. Я слышал где-то недавно, что можно как-то без перезапуска работать при модификации исходов.. Что можно тут сделать?

WennY
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.