Я начал со следующей цели — создать веб-приложение с использованием некоторого сервиса, определенного моим собственным модулем 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 в блоге «Мысли чернокнижника» .
Статьи по Теме :
