Если вы используете установщик для зависимости от сервиса, как вы показали, он может работать и за пределами OSGi. Вам просто нужно использовать какой-то другой механизм внедрения зависимостей. Если его нет, вы можете предоставить подкласс, который инициализирует сервлет с помощью поиска JNDI или из контекста сервлета.
public class MyServlet_AdapterForMissingDI extends MyServlet{
public void init(ServletConfig config){
setFooService(getItFromSomewhere());
}
}
Дело в том, что если у вас есть возможности DI, которые могут вводить setFooService
, вы можете просто использовать один и тот же сервлет в OSGi и в других местах, если вы этого не делаете (и все еще хотите поддерживать этот случай), вы предоставляете адаптер.
В соответствующей заметке посмотрите Felix SCR для настройки зависимостей вашего объекта и Pax Web Extender Whiteboard, которая заботится о подключении вашего сервлета к HttpService.
В частности, без SCR и Whiteboard вам нужно подумать о случае, когда fooService станет недоступным позже или HttpService запускается после вашего сервлета.
В этих случаях ваш сервлет будет иметь ссылку на неработающую службу, которая препятствует сборке мусора в пакете, иначе ваш сервлет не будет зарегистрирован в HttpService.
Обновление: Вот дескриптор SCR, который я использую для одного из моих сервлетов. SCR обрабатывает создание экземпляров сервлетов, жизненный цикл, регистрацию (через доску) и зависимости. В сервлете нет специфичного для OSGi кода. Больше нет необходимости в BundleActivator (SCR регистрирует все службы):
<component name="oracle.statusServlet" >
<implementation class="mypackage.DataSourceStatusServlet"/>
<property name="service.description" value="Oracle DataSource status servlet" />
<property name="alias" value="/OracleDataSourceStatus" />
<property name="servlet-name" value="Oracle DataSource status servlet" />
<service>
<provide interface="javax.servlet.Servlet" />
</service>
<reference name="DATASOURCES"
interface="javax.sql.DataSource"
cardinality="0..n" policy="dynamic"
bind="bindDataSource" unbind="unbindDataSource"/>
</component>
Зависимости для сервлета указаны в теге reference
. SCR выполнит поиск и привязку службы.