Definiowanie beanów w różnych modułach projektu springowego

0

Mój projekt zawiera trzy moduły:

  1. koty-application (klasy DAO)
  2. koty-domain (klasy domenowe)
  3. koty-webapp (kontrolery, Spring MVC)
    Do budowania projektu używam Gradle'a - koty-application produkuje koty-application.jar, koty-domain produkuje koty-domain.jar, a koty-webapp produkuje koty-webapp.war (który zawiera dwa pozostałe jary).

Jak dotąd, zdefiniowałem beany tylko dla modułu koty-webapp. Struktura tego modułu jest następująca:
user image

web.xml

<web-app id="WebApp_ID" version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Baza danych kotow</display-name>

    <servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

</web-app>

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
 http://www.springframework.org/schema/mvc 
 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
 http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
 http://www.springframework.org/schema/context 
 http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:component-scan base-package="pl.kobietydokodu" /> 
    <context:annotation-config /> 
    <mvc:annotation-driven />

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

</beans>

Zdefiniowałem beany dla modułu koty-webapp i to działa bardzo dobrze! Chciałbym jednak zdefiniować beany także dla pozostałych modułów - na przykład KotyDAO dla modułu koty-application. Jak powinienem poprawnie zdefiniować beany dla modułu koty-application? Jako, że nie jest to projekt stricte webowy (jest to niższa warstwa nie związana z webem) to raczej konwencja będzie inna - nie będzie tu definiowania folderu webapps itd, jak miało to miejsce w przypadku modułu koty-webapp ? Co zrobić żeby Spring widział beany w tym module i nimi zarządzał?

Pełny kod mojego testowego projektu: https://github.com/evodv5/cats

0

Nic nie musisz robić o ile pakiety będą spójne. Masz przecież <context:component-scan base-package="pl.kobietydokodu" /> więc każdy bean w pakiecie z tej serii będzie wykryty.

0

Rozumiem, a co z beanami, które chciałbym zadeklarować nie adnotacjami, ale w XML'u, np. DataSource który byłby wykorzystywany właśnie przez KotDAO:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/koty" />
    <property name="username" value="login" />
    <property name="password" value="haslo" />
</bean>

Oczywiście ten DataSource byłby wykorzystywany bezpośrednio tylko przez klasy DAO a więc w module koty-application - gdzie powinienem dodać tę defnicję beana dataSource, bo raczej nie w:
koty-webapp/src/main/webapp/WEB-INF/applicationContext.xml ? Nie powinno być w module koty-application osobnego xml'a, który definiowałby beany używane tylko i wyłącznie w tym module?

0

A czemu nie? I tak pewnie nie będziesz tego modułu używał "samodzielnie", niemniej jak bardzo chcesz to nic nie stoi na przeszkodzie żeby zrobić kilka xmli z kontekstami.

0

No właśnie bym wolał mieć osobne xml'e dla każdego modułu, wydaje mi się to przejrzystsze i bardziej uporządkowane ...
Tylko co dokładnie powinienem zrobić, żeby taki xml w projekcie koty-application był traktowany jako kontekst aplikacji?

W projekcie koty-webapp w pliku web.xml mam powiązanie:

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

które informuje, że kontekst modułu powinien być szukany w lokalizacji /WEB-INF/applicationContext.xml.
Jak sprawić, żeby dodatkowy xml, ale tym razem w innym module - koty-application był traktowany również jako kontekst?

0

Możesz zrobić sobie w tym głównym kontekscie import z * po prostu i załadować wszystkie konteksty ;]

0
Shalom napisał(a):

Możesz zrobić sobie w tym głównym kontekscie import z * po prostu i załadować wszystkie konteksty ;]

W XML'u (głównym kontekście) import z * ?
Domyślam się, że to tylko skrót myślowy, ale nie bardzo rozumiem - mógłbyś pokazać przykład jak to miałoby wyglądać?

1
<import resource="classpath*:config.xml"/>

;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1