Dividindo applicationContext para vários arquivos

Qual é a maneira correta de dividir a configuração do Spring em vários arquivos xml?

No momento eu tenho

  • /WEB-INF/foo-servlet.xml
  • /WEB-INF/foo-service.xml
  • /WEB-INF/foo-persistence.xml

Meu web.xml tem o seguinte:

  Spring MVC Dispatcher Servlet intrafest  org.springframework.web.servlet.DispatcherServlet   contextConfigLocation  /WEB-INF/foo-*.xml   2   contextConfigLocation  /WEB-INF/foo-*.xml     org.springframework.web.context.ContextLoaderListener   

As questões reais:

  • Esta abordagem é correta / melhor ?
  • Eu realmente preciso especificar os locais de configuração nas seções DispatcherServlet e context-param ?

O que preciso ter em mente para poder referenciar beans definidos em foo-servlet.xml de foo-service.xml ? Isso tem algo a ver com a especificação de contextConfigLocation no web.xml ?

Atualização 1:

Estou usando o Spring framework 3.0. Entendo que não preciso fazer importação de resources como esta:

   

Será esta uma suposição correta?

Eu acho a seguinte configuração mais fácil.

Use o mecanismo de carregamento de arquivo de configuração padrão do DispatcherServlet :

O framework irá, na boot de um DispatcherServlet, procurar por um arquivo chamado [servlet-name] -servlet.xml no diretório WEB-INF do seu aplicativo web e criar os beans definidos lá (sobrescrevendo as definições de quaisquer beans definidos com o mesmo nome no escopo global).

No seu caso, basta criar um arquivo intrafest-servlet.xml no WEB-INF e não precisa especificar nada específico em web.xml .

No arquivo intrafest-servlet.xml você pode usar a importação para compor sua configuração XML.

       

Observe que a equipe do Spring realmente prefere carregar vários arquivos de configuração ao criar o ApplicationContext (Web). Se você ainda quiser fazer desta forma, eu acho que você não precisa especificar tanto os parâmetros de context-param ( context-param ) quanto os parâmetros de boot do servlet ( init-param ). Um dos dois fará. Você também pode usar vírgulas para especificar vários locais de configuração.

Mike Nereson tem isto a dizer em seu blog:

http://blog.codehangover.com/load-multiple-contexts-into-spring/

Há algumas maneiras de fazer isso.

1. web.xml contextConfigLocation

Sua primeira opção é carregá-los em seu contexto de aplicativo da Web por meio do elemento ContextConfigLocation. Você já terá seu applicationContext primário aqui, supondo que esteja escrevendo um aplicativo da web. Tudo o que você precisa fazer é colocar algum espaço em branco entre a declaração do próximo contexto.

    contextConfigLocation   applicationContext1.xml applicationContext2.xml     org.springframework.web.context.ContextLoaderListener   

O acima usa retornos de carro. Alternativamente, você poderia simplesmente colocar em um espaço.

    contextConfigLocation   applicationContext1.xml applicationContext2.xml     org.springframework.web.context.ContextLoaderListener   

2. Recurso de importação applicationContext.xml

Sua outra opção é apenas adicionar seu applicationContext.xml primário ao web.xml e, em seguida, usar instruções de importação nesse contexto primário.

Em applicationContext.xml você pode ter…

        

Qual estratégia você deve usar?

1. Eu sempre prefiro carregar via web.xml .

Porque isso me permite manter todos os contextos isolados uns dos outros. Com os testes, podemos carregar apenas os contextos que precisamos para executar esses testes. Isso torna o desenvolvimento mais modular, já que os componentes ficam loosely coupled , de modo que, no futuro, eu possa extrair um pacote ou camada vertical e movê-lo para seu próprio módulo.

2. Se você estiver carregando contextos em um non-web application , utilizaria o recurso de import .

Existem dois tipos de contextos com os quais estamos lidando:

1 : contexto raiz (contexto pai. Geralmente inclui toda a boot jdbc (ORM, Hibernate) e outras configurações relacionadas à segurança de mola)

2 : contexto de servlet individual (contexto filho.Tipicamente Dispatcher Servlet Contexto e inicializar todos os beans relacionados a spring-mvc (controladores, mapeamento de URL, etc.)).

Aqui está um exemplo de web.xml que inclui vários arquivos de contexto de aplicativos

   Spring Web Application example   org.springframework.web.context.ContextLoaderListener   contextConfigLocation  /WEB-INF/spring/jdbc/spring-jdbc.xml  /WEB-INF/spring/security/spring-security-context.xml      spring-mvc org.springframework.web.servlet.DispatcherServlet  contextConfigLocation  /WEB-INF/spring/mvc/spring-mvc-servlet.xml     spring-mvc /admin/*   

@eljenso: intrafest-servlet.xml contexto de aplicação da web xml será usado se o aplicativo usar o SPRING WEB MVC.

Caso contrário, a configuração do @kosoant está bem.

Exemplo simples se você não usa o SPRING WEB MVC, mas quer usar o SPRING IOC:

No web.xml:

  contextConfigLocation classpath:application-context.xml  

Em seguida, seu application-context.xml conterá: estas instruções de importação para carregar vários arquivos de contexto de aplicativo e colocar em main application-context.xml.

Obrigado e espero que isso ajude.

Eu sou o autor de contextos de mola modular .

Essa é uma pequena biblioteca de utilitários para permitir uma organização mais modular dos contextos de primavera do que a obtida usando a composição de metadados de configuração baseados em XML . modular-spring-contexts funcionam definindo módulos, que são basicamente contextos de aplicativos independentes e permitindo que os módulos importem beans de outros módulos, que são exportados em seu módulo de origem.

Os pontos-chave são então

  • controle sobre dependencies entre módulos
  • controle sobre quais beans são exportados e onde eles são usados
  • possibilidade reduzida de nomear colisões de feijões

Um exemplo simples ficaria assim:

Arquivo moduleDefinitions.xml :

            

Arquivo serverModule.xml :

         

Arquivo clientModule.xml