2015-05-09 38 views
4

我想學習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!!!!, 

請指教一下我在這裏做錯了嗎?謝謝!

+0

用['的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'不受管理。注射不起作用。無論如何,你自己實例化,擊敗注入的目的 –

+0

我改變使用getService(FileReader.class,名稱),但得到了相同的結果。你能否詳細說明'不管理'部分 – Rookie

+0

對不起,我沒有機會測試。但是您可能需要使用'@Named(「...」)'註釋。似乎服務中的「名稱」不適用於此。我的意思是,它不是由DI容器管理的。您用其他類進行管理,因爲它們使用@ @ Service註釋。但我不認爲只是在這種情況下注釋'Hk2Test'類會起作用。不知道原因,可能是靜態問題,主要類問題,誰知道。但創建另一個服務類,並嘗試注入它(不要實例化,只是聲明)和注入應該工作 –

回答

0

或許,如果你把這個XML到你的pom.xml:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.glassfish.hk2</groupId> 
      <artifactId>hk2-inhabitant-generator</artifactId> 
      <version>2.4.0-b20</version> 
      <executions> 
       <execution> 
        <id>generate-inhabitants</id> 
        <goals> 
         <goal>generate-inhabitants</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
+0

我已經做了這個XML,它並沒有生成meta-inf文件夾 – Rookie

+0

你的java文件在src/main/java或者src/test/java下?另一個要嘗試的是將依賴關係放入您的正常依賴關係部分中的hk2-metadata-generator。也許這會給你更好的運氣 – jwells131313

0

樣品與Hk2Utilities。實時省錢!

package org.swx.nursing.ccquerytool.file; 

import javax.inject.Inject; 
import javax.inject.Named; 

import org.glassfish.hk2.api.ServiceLocator; 
import org.glassfish.hk2.api.ServiceLocatorFactory; 
import org.jvnet.hk2.annotations.Service; 

import gov.va.oia.HK2Utilities.HK2RuntimeInitializer; 


@Service 
public class Hk2Test { 

    @Inject 
    @Named("org.swx.nursing.ccquerytool.file.OcxReaderImpl") 
    FileReader fr; 

    @Inject 
    @Named("org.swx.nursing.ccquerytool.file.RarReaderImpl") 
    FileReader fr2; 

    public void test() { 
     fr.test(); 
     fr2.test(); 
    } 

    public static void main(String argv[]) throws Exception { 
     HK2RuntimeInitializer.init("Test", false, "org.swx.nursing.ccquerytool.file"); 
     ServiceLocator locator = ServiceLocatorFactory.getInstance().create("Test"); 
     Hk2Test app = locator.getService(Hk2Test.class);   
     app.test(); 
    } 
}