2009-07-29 2 views
5

Недавно я опубликовал question относительно способа определения реализации абстрактной службы на стороне клиента.JAVA 6 ServiceLoader

dfa упомянуто java.util.ServiceLoader как решение для моей проблемы.

Я закончил тем же способом, хотя напрямую не использовал ServiceLoader, главным образом потому, что я использовал JDK 5. Но еще один SOer jut впал в панику, когда dfa упомянул ServiceLoader.

Мне интересно, каковы основные проблемы с реализацией ServiceLoader. Несмотря на ограниченность, кажется, что это хороший способ решить эту проблему, не останавливаясь на какой-либо сторонней библиотеке, например Guice

+2

Этот вопрос немного старый, но если кто-нибудь в будущем, считает, что это, этот ответ на другой вопрос может пролить некоторый свет на то, почему ServiceLoader не очень хорошо: HTTP://stackoverflow.com/questions/7039467/java-serviceloader-with-multiple-classloaders/7237152#7237152 – Dogmatixed

ответ

2

ServiceLoader менее общий, чем полная инфраструктура инъекций зависимостей, такая как Spring или Guice. Он предназначен для ленивой загрузки сервисов, которые могут быть развернуты во время выполнения. Поэтому ServiceLoader особенно полезен для плагинов.

Для получения полного ответа вы должны запросить у Tom Hawtin Tackline.

+0

Мои чувства в точности, вот почему я разместил этот вопрос. Чтобы понять, если таковые имеются, причины, лежащие в основе неприятия этой функции –

4

ServiceLoader был добавлен в java.util в JDK6, до этого базовая технология использовалась в классе Service.

Рациональные устройства ServiceLoader и DI решают подобные проблемы, но не являются эквивалентными технологиями. ServiceLoader загружает реализации определенного интерфейса, найденного в пути к классам. Например, если у вас есть программа, которая читает электронные таблицы Excel, и вы обнаружите, что читатель способен считывать CSV-файлы (которые реализуют один и тот же интерфейс), вы можете отбросить читателя в путь к классам и сделать его доступным и выбранным в качестве опции в вашей программе. (Это означает, что ваш код по своей сути более гибкий).

Инъекция зависимостей (по крайней мере, с точки зрения весны) требует априорного знания о классах, найденных в его пути к классам, чтобы его вводить. Ваши конфигурационные файлы Spring необходимо изменить, чтобы использовать любые дополнительные реализации, которые вы добавляете в путь к классам. Он не может просто выбрать их, перезапустив сервер.

1

sun.misc.Service

http://www.docjar.com/docs/api/sun/misc/Service.html

Осторожно, это не является частью стандартной J2SE API! Это нестандартная часть Sun JDK. Поэтому вы не можете полагаться на него, если используете, скажем, JRockit.

1

Игнорирование различной performance complaints and class loader issues проблемы с реальной архитектурой с помощью ServiceLoader в основном вырождается в Service locator pattern и все общие проблемы, связанные с шаблоном локатора сервисов (статические инициализаторы). Следовательно, есть некоторые, которые считают, что шаблон локатора сервисов является злым и лучше использовать полную базу данных DI или плагинов, поскольку в настоящее время стандартизован @Inject.

Таким образом, некоторые альтернативы: