تقسيم applicationContext إلى ملفات متعددة
-
03-07-2019 - |
سؤال
ما هي الطريقة الصحيحة لتقسيم تكوين 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:
سوف يبحث الإطار ، عند تهيئة مرسلات Servatcherservlet ، عن ملف يسمى [servlet-name] -servlet.xml في دليل تطبيق الويب الخاص بك وإنشاء الفاصوليا المحددة هناك (تجاوز تعريفات أي حبوب محددة مع نفس الاسم في النطاق العالمي).
في حالتك، ما عليك سوى إنشاء ملف intrafest-servlet.xml
في ال WEB-INF
dir ولا تحتاج إلى تحديد أي معلومات محددة فيه 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
) و معلمات تهيئة servlet (init-param
).واحد من الاثنين سيفعل.يمكنك أيضًا استخدام الفواصل لتحديد مواقع تكوين متعددة.
نصائح أخرى
يقول مايك نيرسون هذا في مدونته على:
http://blog.codehangover.com/load-multiple-contexts-into-spring/
هناك عدة طرق للقيام بذلك.
1.web.xml contextConfigLocation
الخيار الأول هو تحميلها جميعًا في سياق تطبيق الويب الخاص بك عبر عنصر ContextConfigLocation.سيكون لديك بالفعل Application Context هنا ، على افتراض أنك تكتب تطبيق ويب.كل ما عليك فعله هو وضع مسافة بيضاء بين إعلان السياق التالي.
<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 ثم استخدام عبارات الاستيراد في هذا السياق الأساسي.
في
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:سياق servlet فردي (سياق فرعي. عادةً ما يتم إرسال سياق Servlet وتهيئة جميع الفاصوليا المتعلقة بـ 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>
@الجينسو :سيتم استخدام intrafest-servlet.xml سياق تطبيق الويب xml إذا كان التطبيق يستخدم SPRING WEB MVC.
وإلا فإن تكوين @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 الرئيسي.
شكرا ونأمل أن يساعد هذا.
أنا مؤلف سياقات الربيع المعيارية.
هذه مكتبة أدوات مساعدة صغيرة للسماح بتنظيم أكثر نمطية لسياقات الربيع مما يتم تحقيقه باستخدام إنشاء بيانات تعريف التكوين المستندة إلى XML. modular-spring-contexts
يعمل عن طريق تعريف الوحدات، والتي هي في الأساس سياقات تطبيق قائمة بذاتها والسماح للوحدات باستيراد الوحدات من الوحدات الأخرى، والتي يتم تصديرها في الوحدة الأصلية الخاصة بها.
النقاط الرئيسية إذن هي
- السيطرة على التبعيات بين الوحدات
- السيطرة على الحبوب التي يتم تصديرها وأين يتم استخدامها
- تقليل إمكانية تسمية اصطدامات الفول
مثال بسيط سيبدو كما يلي:
ملف 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>
ملف 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>
ملف 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>