Tôi đã viết một gói OSGi để sử dụng nó trong ứng dụng nhật thực 4 rcp của tôi. Việc sử dụng các dịch vụ hoạt động tốt nếu tôi thêm các phụ thuộc, đăng ký các dịch vụ này trong activator của tôi và tiêm nó trong lớp học của tôi.Eclipse RCP 4 sử dụng gói thông qua dịch vụ khai báo
Trong activator
IUserService service = new TestUserService();
context.registerService(IUserService.class.getName(), service, null);
Trong lớp học của tôi
@Inject
IUserService service;
service.getSth();
tôi đọc rằng việc sử dụng các gói dịch vụ thông qua khai báo nên là cách tốt hơn. Vì vậy, thay đổi thực hiện của tôi. Tôi tạo ra một định nghĩa thành phần trong gói của tôi để cung cấp dịch vụ của tôi:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="usermanagement.test">
<implementation class="usermanagement.test.TestUserService"/>
<service>
<provide interface="usermanagement.IUserService"/>
</service>
</scr:component>
Sau đó, tôi bỏ việc đăng ký dịch vụ từ hoạt của tôi và tạo ra một lớp dịch vụ tiêu dùng:
public class UserServiceConsumer {
private IUserService service;
public synchronized void setQuote(IUserService service) {
this.service = service;
}
public synchronized void unsetQuote(IUserService service) {
if (this.service == service) {
this.service = null;
}
}
}
và một định nghĩa thành phần:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="UserServiceConsumer">
<implementation class="services.UserServiceConsumer"/>
<reference bind="setService" cardinality="1..1" interface="usermanagement.IUserService" name="IUserService" policy="static" unbind="unsetService"/>
</scr:component>
Sau khi sửa đổi, việc tiêm dịch serivce của tôi không còn hoạt động nữa. Vấn đề là tham chiếu dịch vụ được tiêm là NULL mọi lúc.
Có ai biết tại sao không? Tôi đã quên một cái gì đó?
Cảm ơn rất nhiều!
Bạn suy ra rằng OP muốn sử dụng dịch vụ trong lớp UI như thế nào? – tkotisis
Tôi sử dụng DI để tạo một thể hiện của lớp của tôi bằng cách sử dụng chú thích @Creatable trên hàm tạo của lớp. – roschulze
@tkotsis nếu bạn sử dụng RCP Eclipse sau đó thường để xây dựng một GUI –