Статьи

Пример модулей JBoss — модульное веб-приложение

Недавно я прочитал Почему нет стандарта для разработки реальных модульных веб-приложений? Патроклос Папапетру ( также представлен в Java Code Geeks ). Вдохновленный этой статьей, я решил проверить JBoss Modules в действии. Этот пост описывает мой эксперимент шаг за шагом.

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

Статьи по Теме :