У меня есть традиционное корпоративное приложение Java, которое регистрирует кучу сервисов как Spring beans и регистрирует их с помощью JNDI. Я хотел бы преобразовать это, чтобы вместо этого использовать Spring с OSGi.Устранение экземпляра службы OSGi из статического метода
Ранее класс обслуживания был просто включен в пути к классам любого другого класса, который в ней нуждается, и имел статический метод ищет что-то вроде этого:
public class SomeService {
// private fields...
public static SomeService getInstance() {
SomeService svc = null;
try {
InitialContext ctx = new InitialContext();
svc = (SomeService)ctx.lookup("java:/SomeService");
} catch (NamingException ex) {
logger.info("Exception in getNamedObject", ex);
}
return svc;
}
// Setters and getters, some of which are filled-in with Spring beans
// Other methods etc...
}
Везде, где используется служба, у нас есть такой код это:
SomeService svc = SomeService.getInstance();
// or even
SomeObject results = SomeService.getInstance().getSomeObject();
Теперь я понимаю, «правильный» способ преобразовать это было бы удалить getInstance()
полностью и заставить всех пользователей интерфейс, чтобы иметь свои собственные ссылки на реализацию, поставляемой весной и сконфигурированной в xml-файлы в M ETA-INF. Однако это изменение было бы слишком большим, чтобы сделать все сразу, поскольку система уже находится в производстве).
Есть ли способ получить экземпляр службы OSGi, аналогичный приведенному выше подходу JNDI?
Обновление: некоторые разъяснения
Просто быть очень ясно, на моих целей здесь - я знаю, что это не очень хороший подход в целом. Это, однако, крупное корпоративное приложение, которое находится в производстве, и изменение всего в одном направлении, чтобы приспособиться к «идеальной» структуре OSGi, - просто слишком большое изменение, чтобы сделать все сразу.
То, что я пытаюсь сделать здесь, состоит в том, чтобы вырвать небольшую часть приложения и сделать его готовым к использованию в качестве отдельного пакета OSGi. Но так как остальная часть приложения - «код клиента», если вы еще не готовы к этому изменению, у меня должен быть промежуточный шаг, который позволяет мне использовать этот код как по-старому, , так и as служба OSGi. Со временем остальная часть appilcation также будет модульной и OSGi-ified, и в конечном итоге эти статические заводские методы будут полностью удалены.
До тех пор, однако, отмечает, что «это неправильный способ сделать OSGi» не очень полезно для меня - я знаю, что это не так, но это даже не моя окончательная форма ...
В конце концов мы перенесем весь код, чтобы ввести услугу, но на данный момент это не вариант - не потому, что было бы сложно переписать код, а потому, что было бы невозможно развернуть код в производство в непротиворечивое будущее, так как для этого требуется перезапуск систем, которые невозможно отключить по своему усмотрению. Если я могу найти промежуточное решение, в котором служба экспортируется как служба osgi, но при этом позволяет использовать старый способ доступа к ней, мы можем перезаписать эту часть системы, развернуть пакет услуг и внести изменения в другие места, когда возможное. –
Кроме того, в отношении статики: нет фактического требования о том, что 'getInstance()' возвращает * тот же * экземпляр каждый раз - просто что API для получения * a * экземпляра службы не изменился. –
Но вы можете справиться с тем, что нет экземпляра. Про -1 вы можете раздражать то, что мир не работает, как вы думаете, что нужно, но стрельба по посланнику - это нечто противоположное. –