Java WAR - Заредете Spring beans от външен JAR

Бих искал да заредя в моето Spring MVC уеб приложение (опаковано като WAR) някои компоненти на Spring framework, анотирани с @Service от външен буркан, който отговаря за достъп до база данни и намиращ се в classpathпод /WEB-INF/lib. Ако е възможно, би било желателно да се зареждат автоматично с помощта на анотацията @Autowired.

Следвам успешно решението в този връзка1:

this.ctx = new ClassPathXmlApplicationContext("services-context.xml");
this.myAService = ctx.getBean("myAService");

Това решение обаче използва Spring API функцията getBean, която се счита за лоша практика (вижте link2).

Също така опитах, без късмет, още две неща за зареждане на приложението Context на външния буркан:

  • appContext.xml на WAR:

    <import resource="classpath*:/WEB-INF/lib/pathToExternalJar/applicationContext.xml">
    
  • Уеб xml на WAR -> заредете appContext на jar, както е описано тук (link3). (напр. *applicationContext.xml):

        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                classpath:localSpringContext.xml
                classpath:*applicationContext.xml
            </param-value>
        </context-param>
    

Какъв е най-добрият подход за правилно зареждане на тези зърна и как трябва да се направи?


person aloplop85    schedule 10.07.2013    source източник


Отговори (1)


AppContext.xml на WAR и web xml на WAR са осъществими. Ако трябва често да изпълнявате интеграционни тестове, базирани както на localSpringContext.xml, така и на applicationContext.xml на външен jar, препоръчвам подхода appContext.xml на WAR.

Актуализирано1:

appContext.xml на WAR:

<import resource="classpath:{classpath}/applicationContext.xml"/>

Уеб xml на WAR:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:localSpringContext.xml
        classpath:{classpath}/applicationContext.xml
</param-value>
</context-param>

Например, ако вашето приложениеContext.xml е под пакет :com/gmail/hippoom

можете да го получите чрез classpath:com/gmail/hippoom/applicationContext.xml или classpath*:applicationContext.xml със заместващ знак.

person Yugang Zhou    schedule 10.07.2013
comment

Поставянето на вашия текст в квадратни скоби създава клас знаци, съответстващ на всеки един знак измежду тези между скобите. Освен това кавичките не са специални в синтаксиса на регулярния израз на Flex. Искате нещо по този начин:

/* definitions (for more readable rules) */

/* The \134 are octal escapes for the '/' character, for clarity: */
CMNT_START \134\134

%%

/* rules */

{CMNT_START}.*$  /* yytext automatically contains the matched text*/;
- person aloplop85; 10.07.2013
comment
Е, необходимият път наистина беше мой проблем. Най-накрая го направих благодарение на вашата помощ :) с: ‹import resource=classpath:myExternalApplicationContext.xml/› тъй като XML беше директно под JAR (в момента, не в който и да е пакет като com/gmail/ хипопотам). И така -› {classpath} = . Сега с това импортиране зареждам перфектно външното приложениеContext. Благодаря отново за помощта. - person aloplop85; 11.07.2013