programing

applicationContext를 여러 파일로 분할

nasanasas 2020. 12. 12. 11:05
반응형

applicationContext를 여러 파일로 분할


Spring의 구성을 여러 XML 파일로 분할하는 올바른 방법은 무엇입니까?

내가 가진 순간

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

내에 web.xml는 다음이 있습니다.

<servlet>
    <description>Spring MVC Dispatcher Servlet</description>
    <servlet-name>intrafest</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/foo-*.xml
        </param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

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


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

실제 질문 :

  • 이 접근 방식이 정확하고 / 최선 입니까?
  • 정말 모두에서 설정 위치를 지정해야합니까 DispatcherServlet context-param 섹션을?

나는 무엇에 정의 된 참조 콩에 할 수 명심해야합니까 foo-servlet.xml에서 foo-service.xml? 이것은 지정 contextConfigLocation과 관련이 web.xml있습니까?

업데이트 1 :

내가 사용하고 스프링 프레임 워크 3.0. 다음과 같이 리소스 가져 오기를 수행 할 필요가 없다는 것을 이해합니다.

 <import resource="foo-services.xml"/> 

이것이 올바른 가정입니까?


다음 설정이 가장 쉽습니다.

DispatcherServlet 의 기본 구성 파일로드 메커니즘을 사용합니다 .

프레임 워크는 DispatcherServlet을 초기화 할 때 웹 애플리케이션의 WEB-INF 디렉토리에서 [servlet-name] -servlet.xml이라는 파일을 찾고 거기에 정의 된 Bean을 생성합니다 ( 전역 범위에서 동일한 이름).

귀하의 경우 intrafest-servlet.xml에는 WEB-INF디렉토리에 파일 을 만들고 .NET Framework에서 특정 정보를 지정할 필요가 없습니다 web.xml.

에서 intrafest-servlet.xml파일 당신이 사용할 수있는 가져 오기를 XML 설정을 구성 할 수 있습니다.

<beans>
  <bean id="bean1" class="..."/>
  <bean id="bean2" class="..."/>

  <import resource="foo-services.xml"/>
  <import resource="foo-persistence.xml"/>
</beans>

Spring 팀은 실제로 (Web) ApplicationContext를 만들 때 여러 구성 파일을로드하는 것을 선호합니다. 그래도이 방법을 사용하려면 컨텍스트 매개 변수 ( context-param) 서블릿 초기화 매개 변수 ( )를 모두 지정할 필요가 없다고 생각합니다 init-param. 둘 중 하나가 할 것입니다. 쉼표를 사용하여 여러 구성 위치를 지정할 수도 있습니다.


Mike Nereson은 그의 블로그에서 다음과 같이 말했습니다.

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

이를 수행하는 몇 가지 방법이 있습니다.

1. web.xml contextConfigLocation

첫 번째 옵션은 ContextConfigLocation 요소를 통해 웹 애플리케이션 컨텍스트에 모두로드하는 것입니다. 웹 애플리케이션을 작성한다고 가정하면 이미 여기에 기본 applicationContext가있을 것입니다. 다음 컨텍스트의 선언 사이에 공백을두기 만하면됩니다.

  <context-param>
      <param-name> contextConfigLocation </param-name>
      <param-value>
          applicationContext1.xml
          applicationContext2.xml
      </param-value>
  </context-param>

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

위는 캐리지 리턴을 사용합니다. 또는 그냥 공간에 넣을 수 있습니다.

  <context-param>
      <param-name> contextConfigLocation </param-name>
      <param-value> applicationContext1.xml applicationContext2.xml </param-value>
  </context-param>

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

2. applicationContext.xml 가져 오기 리소스

다른 옵션은 기본 applicationContext.xml을 web.xml에 추가 한 다음 해당 기본 컨텍스트에서 import 문을 사용하는 것입니다.

에서 applicationContext.xml당신은 할 수 있습니다 ...

  <!-- hibernate configuration and mappings -->
  <import resource="applicationContext-hibernate.xml"/>

  <!-- ldap -->
  <import resource="applicationContext-ldap.xml"/>

  <!-- aspects -->
  <import resource="applicationContext-aspects.xml"/>

어떤 전략을 사용해야합니까?

1. 항상 web.xml 을 통해로드하는 것을 선호합니다 .

,이를 통해 모든 컨텍스트를 서로 격리 할 수 ​​있습니다. 테스트를 사용하면 해당 테스트를 실행하는 데 필요한 컨텍스트 만로드 할 수 있습니다. 이렇게하면 구성 요소가 유지됨에 따라 개발이 더욱 모듈화 loosely coupled되므로 나중에 패키지 또는 수직 레이어를 추출하여 자체 모듈로 이동할 수 있습니다.

2. 컨텍스트를으로로드 non-web application하는 경우 import리소스를 사용합니다 .


우리가 다루는 두 가지 유형의 컨텍스트가 있습니다.

1 : 루트 컨텍스트 (부모 컨텍스트. 일반적으로 모든 jdbc (ORM, Hibernate) 초기화 및 기타 스프링 보안 관련 구성 포함)

2 : 개별 서블릿 컨텍스트 (자식 컨텍스트, 일반적으로 디스패처 서블릿 컨텍스트 및 spring-mvc와 관련된 모든 빈 (컨트롤러, URL 매핑 등) 초기화).

다음은 여러 애플리케이션 컨텍스트 파일을 포함하는 web.xml의 예입니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                            http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <display-name>Spring Web Application example</display-name>

    <!-- Configurations for the root application context (parent context) -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/jdbc/spring-jdbc.xml <!-- JDBC related context -->
            /WEB-INF/spring/security/spring-security-context.xml <!-- Spring Security related context -->
        </param-value>
    </context-param>

    <!-- Configurations for the DispatcherServlet application context (child context) -->
    <servlet>
        <servlet-name>spring-mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/spring/mvc/spring-mvc-servlet.xml
            </param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>/admin/*</url-pattern>
    </servlet-mapping>

</web-app>


@eljenso : 응용 프로그램이 SPRING WEB MVC를 사용하는 경우 intrafest-servlet.xml 웹 응용 프로그램 컨텍스트 xml이 사용됩니다.

그렇지 않으면 @kosoant 구성이 좋습니다.

SPRING WEB MVC를 사용하지 않고 SPRING IOC를 사용하려는 경우 간단한 예 :

web.xml에서 :

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-context.xml</param-value>
</context-param>

그런 다음 application-context.xml에는 <import resource="foo-services.xml"/>다양한 애플리케이션 컨텍스트 파일을로드하고 기본 application-context.xml에 넣는 이러한 import 문 이 포함됩니다 .

감사합니다. 도움이되기를 바랍니다.


저는 module-spring-contexts 의 저자입니다 .

This is a small utility library to allow a more modular organization of spring contexts than is achieved by using Composing XML-based configuration metadata. modular-spring-contexts works by defining modules, which are basically stand alone application contexts and allowing modules to import beans from other modules, which are exported ín their originating module.

The key points then are

  • control over dependencies between modules
  • control over which beans are exported and where they are used
  • reduced possibility of naming collisions of beans

A simple example would look like this:

File moduleDefinitions.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:module="http://www.gitlab.com/SpaceTrucker/modular-spring-contexts"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.gitlab.com/SpaceTrucker/modular-spring-contexts xsd/modular-spring-contexts.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <module:module id="serverModule">
        <module:config location="/serverModule.xml" />
    </module:module>

    <module:module id="clientModule">
        <module:config location="/clientModule.xml" />
        <module:requires module="serverModule" />
    </module:module>

</beans>

File serverModule.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:module="http://www.gitlab.com/SpaceTrucker/modular-spring-contexts"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.gitlab.com/SpaceTrucker/modular-spring-contexts xsd/modular-spring-contexts.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <bean id="serverSingleton" class="java.math.BigDecimal" scope="singleton">
        <constructor-arg index="0" value="123.45" />
        <meta key="exported" value="true"/>
    </bean>

</beans>

File clientModule.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:module="http://www.gitlab.com/SpaceTrucker/modular-spring-contexts"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.gitlab.com/SpaceTrucker/modular-spring-contexts xsd/modular-spring-contexts.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <module:import id="importedSingleton" sourceModule="serverModule" sourceBean="serverSingleton" />

</beans>

참고URL : https://stackoverflow.com/questions/600095/splitting-applicationcontext-to-multiple-files

반응형