2009-03-01 30 views
55

Cách chính xác để chia cấu hình của Spring thành nhiều tệp xml là gì?Tách ứng dụngTiếp theo nhiều tệp

Tại thời điểm này tôi có

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

My web.xml có sau đây:

<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> 

Những câu hỏi thực tế:

  • Là cách tiếp cận này đúng/tốt nhất?
  • Tôi có thực sự cần chỉ định vị trí cấu hình cả trong các phần DispatcherServlet các phần context-param không?

Tôi cần lưu ý điều gì để có thể tham chiếu các hạt được xác định trong foo-servlet.xml từ foo-service.xml? Điều này có liên quan đến việc chỉ định contextConfigLocation trong web.xml không?

Cập nhật 1:

Tôi đang sử dụng Xuân khuôn khổ 3.0. Tôi hiểu rằng tôi không cần phải nhập tài nguyên như thế này:

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

Đây có phải là giả định chính xác không?

Trả lời

47

Tôi tìm thấy thiết lập sau dễ nhất.

Sử dụng cấu hình mặc định cơ chế tập tin tải DispatcherServlet:

Khung sẽ, trên khởi của một DispatcherServlet, tìm kiếm một tập tin tên [servlet-name] -servlet.xml trong WEB -INF thư mục web của bạn ứng dụng và tạo hạt đậu được định nghĩa ở đó (ghi đè các định nghĩa của bất kỳ hạt nào được xác định với cùng tên trong phạm vi toàn cầu).

Trong trường hợp của bạn, bạn chỉ cần tạo một file intrafest-servlet.xml trong WEB-INF dir và không cần phải xác định thông tin gì cụ thể trong web.xml.

Trong intrafest-servlet.xml tệp bạn có thể sử dụng import để soạn cấu hình XML của mình.

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

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

Lưu ý rằng nhóm Spring thực sự thích tải nhiều tệp cấu hình khi tạo (Web) ApplicationContext.Nếu bạn vẫn muốn làm theo cách này, tôi nghĩ bạn không cần phải chỉ định cả tham số ngữ cảnh (context-param) thông số khởi tạo servlet (init-param). Một trong hai người sẽ làm. Bạn cũng có thể sử dụng dấu phẩy để chỉ định nhiều vị trí cấu hình.

+0

+1 - thiết lập của tôi trông giống như thế này. Mặc dù tôi không nghĩ rằng thực sự có bất kỳ lợi thế/nhược điểm thực tế nào với thiết lập này so với chỉ định nhiều tệp cấu hình trong web.xml - nó có vẻ như ngữ nghĩa –

+1

Tôi chắc chắn rằng cấu hình mặc định là thuận lợi: quy ước trên cấu hình. Thay vì chỉ định nhiều tệp cấu hình với * cấu hình phụ *, bạn chỉ có một tệp cấu hình * mặc định * "cấp cao nhất" sẽ nhập các tệp tương tự mà bạn sẽ phải chỉ định. – eljenso

+1

Khi bạn đang sử dụng nhập khẩu, hãy cẩn thận không nhập cùng một tệp nhiều lần, (nhập vào bên trong nhập và vv) vì nó sẽ khiến nhiều hạt được tạo và sẽ dẫn đến lỗi khó tìm. –

6

@eljenso: ngữ cảnh ứng dụng web intrafest-servlet.xml xml sẽ được sử dụng nếu ứng dụng sử dụng SPRING WEB MVC.

Nếu không cấu hình @kosoant là tốt.

dụ đơn giản nếu bạn không sử dụng SPRING WEB MVC, nhưng muốn utitlize SPRING IOC:

Trong web.xml:

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

Sau đó, ứng dụng context.xml của bạn sẽ chứa: <import resource="foo-services.xml"/> các câu lệnh nhập này để tải các tệp ngữ cảnh ứng dụng khác nhau và đưa vào ứng dụng chính-context.xml.

Cảm ơn và hy vọng điều này sẽ hữu ích.

25

Mike Nereson có này để nói trên blog của mình tại địa chỉ:

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

Có một vài cách để làm điều này.

1. web.xml contextConfigLocation

tùy chọn đầu tiên của bạn là để nạp tất cả chúng vào ứng dụng web của bạn bối cảnh thông qua các yếu tố ContextConfigLocation. Bạn đã và đang để có ứng dụng chính của mìnhTiếp tục tại đây, giả sử bạn đang viết một ứng dụng web. Tất cả những gì bạn cần làm là đặt một khoảng trắng giữa tuyên bố ngữ cảnh tiếp theo.

<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> 

Sử dụng trên sẽ trả về vận chuyển. Ngoài ra, yo chỉ có thể đặt trong một không gian .

<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. tài nguyên applicationContext.xml nhập khẩu

tùy chọn khác của bạn là chỉ cần thêm applicationContext.xml chính của bạn vào web.xml và sau đó sử dụng các báo cáo nhập khẩu trong bối cảnh chính.

Trong applicationContext.xml bạn có thể có ...

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

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

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

Chiến lược bạn nên sử dụng?

1. Tôi luôn muốn tải lên thông qua web.xml.

Bởi vì, điều này cho phép tôi giữ tất cả các ngữ cảnh được tách biệt với từng số khác.Với các thử nghiệm, chúng tôi chỉ có thể tải các ngữ cảnh mà chúng tôi cần chạy các thử nghiệm đó. Điều này làm cho việc phát triển thêm mô-đun cũng như các thành phần giữ nguyên loosely coupled, vì vậy trong tương lai tôi có thể trích xuất gói hoặc lớp dọc và di chuyển nó sang mô-đun riêng của nó.

2. Nếu bạn đang tải ngữ cảnh vào non-web application, tôi sẽ sử dụng tài nguyên import.

+10

Sao chép bài viết http://blog.codehangover.com/load-multiple-contexts-into-spring/ mà không trích dẫn. –

11

Có hai loại bối cảnh chúng ta đang đối phó với:

: (. Bối cảnh cha mẹ thường bao gồm tất cả jdbc (ORM, Hibernate) khởi động và mùa xuân khác an ninh liên quan đến cấu hình) bối cảnh gốc

: bối cảnh servlet cá nhân (ngữ cảnh con. Phân phối Servlet Ngữ cảnh và khởi tạo tất cả các bean liên quan đến spring-mvc (bộ điều khiển, ánh xạ URL, v.v.)).

Dưới đây là một ví dụ về web.xml trong đó bao gồm nhiều ứng dụng tập tin bối cảnh

<?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>

+0

Câu trả lời hay. Sự phân biệt giữa gốc và con là chìa khóa. – MrKiller21

1

Tôi là tác giả của modular-spring-contexts.

Đây là thư viện tiện ích nhỏ để cho phép tổ chức mô đun có nhiều bối cảnh mùa xuân hơn là đạt được bằng cách sử dụng Composing XML-based configuration metadata. modular-spring-contexts hoạt động bằng cách xác định các mô-đun, về cơ bản là bối cảnh ứng dụng độc lập và cho phép các mô-đun nhập đậu từ các mô-đun khác, được xuất ín mô-đun nguồn gốc của chúng.

Những điểm quan trọng sau đó là

  • kiểm soát phụ thuộc giữa các module
  • kiểm soát mà đậu được xuất khẩu và nơi chúng được sử dụng
  • giảm khả năng đặt tên va chạm của đậu

Một ví dụ đơn giản sẽ trông giống như sau:

Tệp 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> 
+0

cảm ơn @SpaceTrucker! có vẻ như bạn đã tạo ra chính xác những gì chúng tôi cũng cần. không chắc tại sao cộng đồng giàu mùa xuân lại không tạo ra thứ gì đó tương tự trước ... – ashirman

Các vấn đề liên quan