2012-12-04 27 views
9

Có bất kỳ thực tiễn tốt/tốt nhất nào về kết hợp cấu hình Spring và Kế hoạch chi tiết OSGi (ví dụ: Blueprint Gemini) không? Bạn sử dụng tệp XML nào? Bạn đặt chúng trong các gói OSGi của bạn ở đâu (META-INF/spring, OSGi-INF)? Phương pháp nào trong số những thực tiễn này sẽ cho phép bạn sử dụng lại các gói của mình kết hợp với triển khai Blueprint không thuộc Gemini?Kết hợp kế hoạch chi tiết OSGi và cấu hình mùa xuân

Bối cảnh: Chúng tôi đang trong quá trình chuyển từ Spring/Spring DM sang Spring/Blueprint. Tôi biết Blueprint xác định phần tử <bean>. Tuy nhiên, đôi khi chúng tôi phải đối mặt với tình huống rằng các khả năng định nghĩa bean giới hạn của đặc tả Blueprint không đáp ứng tất cả các nhu cầu của chúng tôi. Vì vậy, nó có vẻ là một lựa chọn tốt để sử dụng cấu hình Spring trong gói của chúng tôi và Blueprint cho các gói dây thông qua các dịch vụ OSGi.

Trả lời

5

Tệp kế hoạch chi tiết phải đi theo OSGI-INF/kế hoạch chi tiết/và được đặt tên * .xml (thường là blueprint.xml). Vị trí này theo thông số kỹ thuật BluGirint của OSGi 4.2 và sẽ hoạt động với Aries hoặc Gemini.

file mùa xuân-DM (như bạn có thể biết) đi theo META-INF/mùa xuân/và cũng được đặt tên * .xml (thường beans.xml)

Cả hai tập tin nên có thể một cách hòa bình cùng tồn tại. Họ sẽ chỉ làm việc, tuy nhiên, nếu bạn có hỗ trợ cho mỗi container được cài đặt.

Việc kết nối phải được thực hiện thông qua Đăng ký dịch vụ OSGi.

Để di chuyển, chúng tôi đã ở lại Spring-DM cho các khả năng mà chúng tôi không thể thực hiện trong Kế hoạch chi tiết. Mọi thứ khác đã được di chuyển sang Blueprint.

+0

Tôi không nghĩ rằng nó hoạt động trong JBoss Fuse. Dịch vụ đã nhập trong Aries OSGi xml không thể được nhận diện trong Spring DM xml. – sancho21

+0

Tôi không nghĩ rằng bạn có thể phơi bày và sử dụng dịch vụ từ cùng một gói. Đây không phải là một vấn đề về khả năng tương tác với kế hoạch chi tiết/mùa xuân. Cùng một vấn đề sẽ xảy ra chỉ với mùa xuân hoặc chỉ là bản thiết kế. – mjmeno

10

Bạn sử dụng tệp XML nào? Bạn đặt chúng trong các gói OSGi của bạn (META-INF/spring, OSGi-INF) ở đâu? Phương thức nào trong số những thực tiễn này sẽ cho phép bạn sử dụng lại các gói của bạn kết hợp với triển khai không phải Gemini của Blueprint?

Gemini Blueprint xử lý cả hai thư mục này như nhau, nhưng OSGI-INF/blueprint/*.xml là chỉ được chỉ định trong đặc tả chung chi tiết OSGi.

Một gợi ý thực hành từ the Gemini Blueprint documentation là:

[...] Một gợi ý thực hành là để phân chia các cấu hình bối cảnh ứng dụng thành ít nhất hai tập tin, đặt tên theo quy ước modulename-context.xml và modulename-osgi-context.xml. Tệp modulename-context.xml chứa định nghĩa bean thông thường độc lập với bất kỳ kiến ​​thức nào về OSGi. Tệp modulename-osgi-context.xml chứa các định nghĩa bean để nhập và xuất các dịch vụ OSGi. Nó có thể (nhưng là không bắt buộc) sử dụng lược đồ OSGi Gemini Blueprint làm tên miền cấp cao nhất thay vì không gian tên Spring 'beans'.

Tôi đã thử điều này và nó hoạt động tốt. Tôi sử dụng Kế hoạch chi tiết Gemini cho một trong các dự án của tôi có các tệp META-INF/spring/context.xml, xác định hạt của tôi và mối quan hệ của chúng và META-INF/spring/osgi-context.xml, xác định những hạt nào để lộ ra/nhập từ dịch vụ OSGi và cách thực hiện.context.xml trông giống như

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> 
    <bean id="myOrdinarySpringBean" class="com.acme.impl.Foo"/> 
</beans> 

và thường là bối cảnh ứng dụng Spring thông thường không có cấu hình Blueprint/OSGi. osgi-context.xml trông giống như

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> 
    <service id="myOsgiService" ref="myOrdinarySpringBean" interface="com.acme.Foo"/> 
</blueprint> 

Bạn có thể, tất nhiên, sử dụng các yếu tố <beans> namespace và rễ ở đây là tốt, nhưng bạn phải xác định một xmlns:osgi và tiền tố dịch vụ như vậy: <osgi:service .../> cho rằng để làm việc. Trong trường hợp của tôi, tôi không cần công cụ Blueprint cụ thể của Gemini, vì vậy tôi hài lòng với cấu hình Blueprint chung này. Tương tự như vậy, tôi cũng có thể sử dụng không gian tên <blueprint> trong context.xml, nhưng ứng dụng cụ thể này là một ứng dụng cũ được chuyển sang OSGi, vì vậy tôi muốn giữ cấu hình cụ thể cho Spring bây giờ.

Một ứng dụng lần lượt có riêng của mình osgi-context.xml như

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> 
    <reference id="myOrdinarySpringBeanImportedFromOsgi" interface="com.acme.Foo" availability="mandatory"/> 
</blueprint> 

và vào thời điểm này không, nhưng có thể, có nó riêng context.xml như

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> 
    <bean id="myOrdinaryOtherSpringBean" class="com.acme.impl.Bar"> 
     <property name="foo" ref="myOrdinarySpringBeanImportedFromOsgi"/> 
    </bean> 
</beans> 

và có thể không thực sự quan tâm ít liệu myOrdinarySpringBeanImportedFromOsgi được nhập từ một dịch vụ OSGi hay được định nghĩa là một bean Spring thông thường trong cùng một ngữ cảnh ứng dụng.

Các cấu hình META-INF/osgi-context.xml này có thể được di chuyển đến OSGI-INF/blueprint/ nếu tôi muốn tách riêng mình khỏi triển khai Blueprint Gemini, nhưng hiện tại tôi muốn giữ hai nửa ở cùng một nơi để tránh làm lộn xộn cấu trúc thư mục .

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