Я столкнулся с любопытным сценарием, в котором любая попытка использования CDI для управления синглтоном приводила к сбою независимо от того, какие решения я пробовал, и я даже не уверен на данный момент, является ли это чем-то осуществимым / что готово, поэтому я и публикую здесь причину.
Я постараюсь объяснить, насколько это возможно, текущий сценарий, и я хотел бы знать, может ли мое намерение быть выполнено, и если да, то каким образом, и если нет, есть ли альтернатива «обновлению» экземпляров синглтона в этом банке. Если я пропустил детали / части кода, пожалуйста, дайте мне знать, поскольку это что-то немного необычное, и я этого не сделаю, если предоставлю все необходимое.
Фон :
- EAP JBoss 7.2 используется в качестве сервера;
- Один большой проект Maven, родительский файл pom действует только как pom для предоставления зависимостей / конфигураций в maven для всех других подпроектов. , которые имеют тип ejb / ear / war в основном.
- Пользовательский модуль, используемый в JBoss, который предоставляет ряд зависимостей для некоторых проектов это просто папка, содержащая файлы jar, включая пользовательские файлы jar, которые используются в других проектах.
- testing-целях-ear.ear , развертываемых в сервер, содержащий проекты testing-ejb и testing-war .
- Военный проект имеет обеспеченную зависимость от одного из jar файлы из пользовательского модуля (на самом деле баночка просто это подпроект основного проекта), и во время компиляции и выполнения он решался нормально, и проблем не было (по моему мнению, точно так же, как использование зависимостей maven);
- До сих пор, военный проект вызывал синглтон-экземпляры из этого jar (действуя исключительно как бизнес-логика c) методом getInstance (), и все работало нормально.
Intention :
- Удаление всех приватных конструкторов / getInstance () из jar для синглтон-классов и аннотирование их с помощью @ Singleton в надежде изменить все вызовы в военном проекте на другой путь с помощью @ Inject вместо использования метода getInstance ().
Предпринятые шаги :
Для одного отдельного класса был удален закрытый конструктор getInstance (), создан новый интерфейс для класса, позволяющий отображать только определенные методы, а синглтон-класс реализовывал новый интерфейс и был помечен как w ih аннотация @ Singleton из javax.inject .
В военном проекте удалили вызов getInstance () и установите переменную с @ Inject в качестве поля в классе, который его использовал, например:
@Inject
private Management managementInterface;
...
void someMethod(){
managementInterface.performBusinessLogic();
}
Это приводило к выбрасыванию NPE при вызове executeSomeBusinessLogi c (), для которого я нашел несколько ответов, поэтому я добавил bean-компоненты. xml в эту банку с discovery-mode = all , пробовал @ Singleton из javax.ejb , но ничто не помогло внедрить этот синглтон.
Я довольно долго искал, чтобы понять, как это может быть готово, но большая часть сценария ios, изображенного здесь / на google, связана с меж-ejb-связью между приложениями, развернутыми в одном и том же контейнере, но это не одно и то же: мы пытаемся использовать CDI для внедрения синглтона из файла jar это не проект ejb / war, а простая библиотека java. * 108 2 *
На что следует обратить внимание :
Этот синглтон-класс ранее использовался в нескольких проектах ejb / war без проблем, поэтому тот факт, что он был задан как пользовательский модуль в JBoss и как отдельный jar, означает, что на самом деле существует только один экземпляр этого класса для всех вызывающих проектов ejb / war, и мы избегаем типичных проблем загрузки контекста / класса, которые связаны с этот материал.
Этот синглтон предоставил довольно много методов, некоторые из которых на самом деле лучше не показывать, поэтому я хотел бы поставить перед ним интерфейс, чтобы вызывающие клиенты имели доступ только к некоторым методам, но не ко всем их.
JAR-файл имеет доступ ко многим библиотекам / зависимостям из-за структуры проекта и способа управления зависимостями, поэтому было намерение отказаться от старого способа создания и использования синглетонов и их переноса на что-то более современное.
Среда IDE (Intellij) способна разрешать зависимость без проблем, как можно увидеть в следующем приложении, при нажатии синий значок метки ведет к классу, помеченному @ Singleton и реализующему этот интерфейс.
Вопрос :
- Можно ли изменить синглтоны из этого проекта jar из classi c способ использования CDI с сервера? В этом отношении лучше всего использовать аннотации, но если есть другие доступные решения, я открыт для них.