2014-03-03 3 views
1

나는 넥서스 OSS 코드이 줄을 ...모든 구현이 자동으로 통과됩니까? 누가이 짓을?

@Inject 
public ReleaseRemoverTask(final ReleaseRemover releaseRemover) 
{ 
    this.releaseRemover = checkNotNull(releaseRemover); 
} 

위의 인터페이스입니다 https://github.com/sonatype/nexus-oss/blob/master/components/nexus-core/src/main/java/org/sonatype/nexus/maven/tasks/ReleaseRemoverTask.java

그러나 ReleaseRemover.java에서 발견 보았다.

여기에는 인터페이스가 사용되지 않으므로 런타임 동안에 만 구현을 전달해야합니다.이 의미가 있습니다. 그래서 디버깅을 통해 구현이 호출됨을 확인했습니다. 구현 클래스는 DefaultReleaseRemover.java입니다.

내 주장을 뒷받침하기 위해 넥서스 용 플러그인을 작성했으며 ReleaseRemover 구현을 작성했습니다.

심지어 픽업되었습니다 ...

어떻게 처리하나요? 내부적으로 Google Guice를 사용 중입니다.

Guice가이 기능 내에서 구현을 전달하는 업무를 수행하고 있습니까? Google Guice와 같은 프레임 워크의 속성입니까?

모든 구현이 이와 같이 전달되면 구현이 통과되지 않도록 할 수 있습니까?

+0

Guice의 Inject보다는 javax.Inject 인 것 같습니다. 구체적인 클래스를 인스턴스화해야하는 것을 정의하는 어딘가의 구성 파일이 있어야합니다. – assylias

+0

하지만 플러그인으로 쓰는 클래스도 호출됩니다 .... 그들은 내 클래스 이름을 모릅니다. 이것은 나에게 그들이 모든 구현을 찾아 하나씩 전달할 무언가가 있다는 인상을 준다. –

답변

0

당신이 나에게 명확하지 않은 질문이 있습니다. 달성하고자하는 것은 무엇입니까? 대신 무엇을 전달하고 싶은지 can I prevent an implementation from being passed ?을 의미합니까? Null 또는 구현?

Nexus OSS가 Google Guice를 의존성 주입 프레임 워크로 사용하는 것이 맞습니다. 당신은 당신이 뭔가 같은 말 모듈을 만들 필요가 일부 인터페이스 구현을 결합하려면 :

bind(ReleaseRemover.class).to(DefaultReleaseRemover.class); 

당신이 다른 주사는 그들이 매우 가능성이 붙어 DefaultReleaseRemover에서 볼 수있다. 따라서 DefaultReleaseRemover의 주입 된 구현에는 다른 주입이 포함됩니다.

DefaultReleaseRemover@Singleton으로 주석 처리됩니다. 즉, 전체 인젝터에 대해 DefaultReleaseRemover 클래스의 인스턴스가 하나만 있음을 의미합니다.

글쎄, 당신은 귀하의 인터페이스와 구현 및 귀하의 모듈 바인딩 있습니다. 이제 Guice Injector를 만들어서 그것을 사용하여 모든 객체를 생성해야합니다. 넥서스 OSS를 들어 당신이 https://github.com/sonatype/nexus-oss/blob/de6a606372349283f78aeaa498e9a70d4dd967b1/components/nexus-webapp/src/main/java/org/sonatype/nexus/webapp/WebappBootstrap.java 라인 (118)

Guice.createInjector(your modules...); 

페이지에서 Guice 사출 진입 점을 찾을 수 , 당신은 Guice 인젝터를 설치하려는 모든 모듈을 제공합니다. 일부 하위 모듈이 모듈 안에 설치되어있을 수 있습니다. 당신은 명시 적으로 그것을 createInjector 함수로 전달하지 않아도됩니다. 그래서, 당신이 Guice 구속력을 바꾸고 싶다면 거기에서 파기 시작하는 것이 좋습니다.


UPDATE :

나는 메커니즘을 모른다.하지만 당신은하지 그런 PrivateModule :

당신은 내가 더 똑바로 직접 것

@Inject 
public ReleaseRemoverTask(final @Named("custom") ReleaseRemover releaseRemover) 

당신에게 CustomReleaseRemover을 통과 할 모듈이 있어야 할

bind(ReleaseRemover.class).annotathedWith(Names.named("custom")).to(MyCustomReleaseRemover.class); 

일부 Module.configuration()의 구현을 바인드 할 필요가 앞으로도 Nexus OSS에서 어떻게 작동하는지 전혀 모르겠습니다. 어쩌면 누군가가 그 부분을 도울 수 있습니다.

+0

ok. to clear "특정 구현 만 전달되는 것을 막을 수 있습니까? 예를 들어 플러그인 내에서 구현 된 내용을 전달하고 DefaultReleaseRemover는 구현이 아니라 핵심 중첩 내부를 통과하는 등의 작업을 수행 할 수 있습니까? –

+0

기본 Nexus 플러그인을 살펴보면 Guice 모듈이 포함되어 있습니다. 그래서 플러그인에 대해 Guice가 어떻게 작동하는지 확인할 수 있습니다. –