2013-05-29 4 views
1

저는 Play의 열렬한 팬입니다. 저는 요즘 내 모든 프로젝트에서 이걸 사용합니다. 내 프로젝트 중 하나가 커지면서 DI 솔루션을 포함하기로 결정했습니다. 봄과 Guice 사이에 짧은 고려 후에, 나는 Guice에 멈추고 놀이를위한 Guice 단위를 추가했다 (http://www.playframework.com/modules/guice-1.0/home).Play with Guice 사용 : 정적 필드에만 주입 가능

문제는 주입이 정적 필드에서만 작동한다는 것 같습니다. 이 테스트에 관해서 특히, (http://java.dzone.com/articles/dependency-injection-play)

나에게 조금 겁

에서

@InjectSupport 
public class MyService { 

    @Inject 
    static MyBean myBean; 

} 

: 이것은 내가 좋아하는 물건을해야 할 것을 의미합니다. 대부분의 DI 솔루션은 항상 싱글 톤을 주입하려고합니다. 예를 들어, Spring은 모든 빈의 단일 인스턴스를 생성하고 삽입합니다. 이것은 끝 부분에서 동일하지만 여전히 그렇습니다. 이러한 우려가 있어야합니까?

+0

일반 회원 필드를 삽입 할 수도 있습니다. * 단골 회원 필드 만 삽입한다면'@ InjectSupport'는 필요하지 않습니다 (그러나 그것도 혼합 할 수 있습니다). 그래서 당신은 이러한 걱정을해서는 안됩니다. 당신은 무엇을하고 싶습니까? – MartinGrotzke

답변

2

당신은 확실히 플레이로 Guice 주입을 할 수 있습니다.

  • 이전 Guice 모듈 (버전 1.0)을 사용하지 마십시오. 당신은 또한 이전 Guice, 오래된 재생을 사용하고 언급 된 튜토리얼 (버전 1.2!)

    새로운 Guice 모듈의 봐 주시기 바랍니다 (버전 3.0) & 재생 (버전 2.1.1)

    http://www.playframework.com/documentation/2.1.1/JavaInjection 당신이 인스턴스 변수에 주입하면

  • , 당신은 경로 파일에서 컨트롤러를 동적으로

    을 만들어야합니다

    GET /    @controllers.Application.index() 
    
    당신의 Global.java에서

    , 당신은 getControllerInstance를 오버라이드 (override) 할 필요가 : 재생 1에서

    @Override 
    public <A> A getControllerInstance(Class<A> controllerClass) throws Exception { 
        return INJECTOR.getInstance(controllerClass); 
    } 
    
+0

저는 Play 1.25를 사용하고 있습니다. 따라서 기존 모듈에만 의존 할 수 있습니다. – preslavrachev

1

, 당신은 쉽게 정적으로 주입 컨트롤러 필드 정상 Guice의 싱글을 결합 할 수 있습니다, 트릭이 올바른 주석 수입을 얻고있다.

import javax.inject.Inject; 
public class Application extends Controller { 
    @Inject private static MyService myService; 
    .... 
} 

및 @InjectSupport는 JSR330/모듈 수입 사용할 필요가 다른 클래스 :

import play.modules.guice.InjectSupport; 
import javax.inject.Inject; 
@InjectSupport 
public class AnotherClass { 
    @Inject private static MyService myService; 
} 
정적 주입이 JSR330 주석 버전을 사용할 필요가

당신의 플레이 컨트롤러에서

, 작업 & 테스트 클래스

Guice 라이브러리에 의해 인스턴스화 된 실제 (비 정적) 서비스의 경우 Guice 주석 버전 (com.google.inject 패키지 참고)을 사용해야합니다.

import com.google.inject.Inject; 
import com.google.inject.Singleton; 
@Singleton 
public class MyService { 
    @Inject private AnotherService anotherService; // note non-static injection 
} 
또한 물건을 킥오프 빈 모듈이 필요합니다

:

import com.google.inject.AbstractModule; 
public class MainModule extends AbstractModule { 
    @Override 
    protected void configure() {} 
} 

이 또한 @Provides 같은 @Singleton에서 떨어져 다른 방법에서 만든 Guice 클래스에 대한 작동합니다, 나는 천국 비록 ' t는 이것을 아직 시도했다.