Я начал со следующей цели — создать веб-приложение с использованием некоторого сервиса, определенного моим собственным модулем JBoss. Служба, подготовленная мной, была довольно простой. Я назвал это Echo Service:
1
2
3
4
5
6
7
|
package warlock.echo; public interface EchoService { String echo(String param); } |
и помещен в отдельный файл jar с именем echo-api. Затем я реализовал этот сервис:
01
02
03
04
05
06
07
08
09
10
11
|
package warlock.echo.impl; import warlock.echo.EchoService; public class DefaultEchoService implements EchoService { public String echo(String param) { return param; } } |
и поместил реализацию в новый файл jar с именем echo-module. Учитывая, что мое веб-приложение должно знать только API службы, а не конкретную реализацию, я решил пойти по пути, описанному в разделе Создание расширяемых приложений на платформе Java — этот выбор требовал добавления в специальный файл jar echo-module в разделе : META-INF / services / warlock.echo.EchoService, содержащий «указатель» на реализацию службы (полное имя реализующего класса).
На этом этапе я получил и распаковал JBoss Application Server 7 , вошел в распакованный JBoss, а затем в каталог модулей. В этом каталоге я добавил следующую структуру:
Выше были упомянуты два jar-файла, упомянутых выше, файл module.xml является определением моего модуля JBoss с именем ‘warlock.echo’ и имеет следующее содержимое:
01
02
03
04
05
06
07
08
09
10
|
<? xml version = "1.0" encoding = "UTF-8" ?> < module xmlns = "urn:jboss:module:1.0" name = "warlock.echo" > < resources > < resource-root path = "echo-module-1.0.0-SNAPSHOT.jar" /> < resource-root path = "echo-api-1.0.0-SNAPSHOT.jar" /> </ resources > </ module > |
После завершения определения модуля JBoss я подготовил простое приложение на основе Spring Framework (которое использует echo-api jar только во время компиляции проекта и вообще не использует echo-module jar) только с одним контроллером:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package warlock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import warlock.echo.EchoService; @Controller @RequestMapping ( "/echo.html" ) public class EchoController { @Autowired private EchoService service; @RequestMapping (method = RequestMethod.GET) @ResponseBody public String handleGet() { return service.echo( "It workzzzzz!" ); } } |
Как видите, Контроллер возвращает в качестве тела ответа результат вызова Echo Service для некоторой строки. Теперь самое важное — определение Echo Service в веб-приложении:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
<? xml version = "1.0" encoding = "UTF-8" ?> xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" > ... < bean class = "org.springframework.beans.factory.serviceloader.ServiceFactoryBean" > < property name = "serviceType" value = "warlock.echo.EchoService" /> </ bean > ... </ beans > |
Я знаю, одна вещь беспокоит вас — как, черт возьми, будет найдена реализация Echo Service, если мы не добавим jar-файлы echo-api и echo-module в веб-приложение ?!
Ну, это сама прелесть;) — Нам просто нужна еще одна вещь — файл WEB-INF / jboss-deploy-structure.xml:
1
2
3
4
5
6
7
|
< jboss-deployment-structure > < deployment > < dependencies > < module name = "warlock.echo" services = "export" /> </ dependencies > </ deployment > </ jboss-deployment-structure > |
Таким образом, мы сообщаем JBoss, что это приложение зависит от модуля ‘warlock.echo’ и сервисов, определенных в этом модуле. Все остальное — магия JBoss Module;)
Лекции на десерт:
Ссылка: Модульное веб-приложение на основе модулей JBoss от нашего партнера JCG Warlock в блоге «Мысли чернокнижника» .
Статьи по Теме :