我想學習HK2使用服務定位器模式。以下是我寫的一些代碼:HK2使用@Named注入實現不工作
package org.swx.nursing.ccquerytool.file;
import org.jvnet.hk2.annotations.Contract;
@Contract
public interface FileReader {
public void test();
}
以上是一個界面。以下兩個測試實現如下所示: package org.swx.nursing.ccquerytool.file;
import javax.inject.Singleton;
import org.jvnet.hk2.annotations.Service;
@Service (name="org.swx.nursing.ccquerytool.file.OcxReaderImpl")
@Singleton
class OcxReaderImpl implements FileReader{
public void test() {
// TODO Auto-generated method stub
System.out.println("OCX HelloWorld!!!!"+ ", ");
}
}
而下面是第二實施: 包org.swx.nursing.ccquerytool.file;
import javax.inject.Singleton;
import org.jvnet.hk2.annotations.Service;
@Service (name="org.swx.nursing.ccquerytool.file.RarReaderImpl")
@Singleton
class RarReaderImpl implements FileReader{
public void test() {
// TODO Auto-generated method stub
System.out.println("RAR HelloWorld!!!!"+ ", ");
}
}
並與主()方法中測試該下面的類:
package org.swx.nursing.ccquerytool.file;
import javax.inject.Inject;
import javax.inject.Named;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.utilities.ServiceLocatorUtilities;
public class Hk2Test {
private static ServiceLocator SERVICELOCATOR = ServiceLocatorUtilities.createAndPopulateServiceLocator();
@Inject @Named ("org.swx.nursing.ccquerytool.file.OcxReaderImpl")
public static FileReader fr =SERVICELOCATOR.getService(FileReader.class);
@Inject @Named ("org.swx.nursing.ccquerytool.file.RarReaderImpl")
public static FileReader fr2 =SERVICELOCATOR.getService(FileReader.class);
public static void main(String argv[]) {
//FileReader ocxReaderService = SERVICELOCATOR.getService(FileReader.class);
//ocxReaderService.test();
fr.test();
fr2.test();
}
}
當運行此,以下是輸出:
OCX HelloWorld!!!!,
OCX HelloWorld!!!!,
其中i正在等
OCX HelloWorld!!!!,
RAR HelloWorld!!!!,
請指教一下我在這裏做錯了嗎?謝謝!
用['的getService(FileReader.class,姓名);'](https://hk2.java.net/hk2-api/apidocs/org/glassfish/hk2/api/ServiceLocator.html#getService %28java.lang.Class,%20java.lang.String,%20java.lang.annotation.Annotation ...%29)。您的班級'Hk2Test'不受管理。注射不起作用。無論如何,你自己實例化,擊敗注入的目的 –
我改變使用getService(FileReader.class,名稱),但得到了相同的結果。你能否詳細說明'不管理'部分 – Rookie
對不起,我沒有機會測試。但是您可能需要使用'@Named(「...」)'註釋。似乎服務中的「名稱」不適用於此。我的意思是,它不是由DI容器管理的。您用其他類進行管理,因爲它們使用@ @ Service註釋。但我不認爲只是在這種情況下注釋'Hk2Test'類會起作用。不知道原因,可能是靜態問題,主要類問題,誰知道。但創建另一個服務類,並嘗試注入它(不要實例化,只是聲明)和注入應該工作 –