2017-04-18 15 views
2

私はアプリケーションに依存性注入のためにGoogle guiceを使用しています。 私はこのようなクラス構造を持っている、注射用クラスに注入

例はこれが、私がここに

package com.journaldev.di.services; 

import javax.inject.Singleton; 

//import com.google.inject.Singleton; 

@Singleton 
public class EmailService implements MessageService { 

    public boolean sendMessage(String msg, String receipient) { 
     //some fancy code to send email 
     System.out.println("Email Message sent to "+receipient+" with message="+msg); 
     return true; 
    } 
} 
を実装します

package com.journaldev.di.services; 

@ImplementedBy(EmailService.class) 
public interface MessageService { 

    boolean sendMessage(String msg, String receipient); 
} 

私のインタフェースであるhere


から取られます

もし私がinjec電子メールサービスはこちら。

package com.journaldev.di.consumer; 

import javax.inject.Inject; 

import com.journaldev.di.services.MessageService; 

public class MyApplication { 

    private MessageService service; 

    @Inject 
    public void setService(MessageService svc){ 
     this.service=svc; 
    } 

    public boolean sendMessage(String msg, String rec){ 
     //some business logic here 
     return service.sendMessage(msg, rec); 
    } 
} 

私EmailServiceクラスはこのように見えたと仮定した場合、

package com.journaldev.di.services; 

import javax.inject.Singleton; 

//import com.google.inject.Singleton; 

@Singleton 
public class EmailService implements MessageService { 
    public EmailService(int someValue) { 
     FancyEmailService fancyEmailService = new FancyEmailService(someValue); 
    } 
    public boolean sendMessage(String msg, String receipient) { 
     fancyEmailService.doSomething(); 
     System.out.println("Email Message sent to "+receipient+" with message="+msg); 
     return true; 
    } 
} 

上記EmailServiceコードをテストするために、私は、コンストラクタからインスタンス化するよりも、FancyEmailServiceを注入する必要があります。 FancyEmailServiceをEmailServiceコードに挿入するにはどうすればよいですか?引き続きEmailServiceをMyApplicationに挿入することができます。あなたはこれらを見てみる必要がある

答えて

2

- 下記のよう​​とhttps://github.com/google/guice/wiki/ProvidesMethods

public class GuiceTestModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     bind(Integer.class) 
     .annotatedWith(Names.named("fancy")) 
     .toInstance(10); 
    } 

    @Provides 
    FancyEmailService fancyEmailServiceProvider(@Named("fancy") int i){ 
     return new FancyEmailService(i); 
    } 

} 

マイFancyEmailService & EMailServiceです。 EmailServiceも@Provides

@Singleton 
public class EmailService implements MessageService { 

    private FancyEmailService fancyEmailService; 

    @Inject 
    public EmailService(FancyEmailService fes){ 
     fancyEmailService = fes; 
    } 

    public boolean sendMessage(String msg, String receipient) { 
     //some fancy code to send email 
     System.out.println("Email Message sent to "+receipient+" with message="+msg); 
     fancyEmailService.doSomething(); 
     return true; 
    } 
} 
を使用してこのように書くことができる

Email Message sent to guru with message=msg 
i is injected with 10 

public class FancyEmailService { 

    private final int i; 

    public FancyEmailService(int i){ 
     this.i = i; 
    } 

    public void doSomething(){ 
     System.out.println("i is injected with " + i); 
    } 

} 

@Singleton 
public class EmailService implements MessageService { 

    private FancyEmailService fancyEmailService; 

    @Inject 
    public EmailService(@Named("fancy") int someValue){ 
     fancyEmailService = new FancyEmailService(someValue); 
    } 

    public boolean sendMessage(String msg, String receipient) { 
     //some fancy code to send email 
     System.out.println("Email Message sent to "+receipient+" with message="+msg); 
     fancyEmailService.doSomething(); 
     return true; 
    } 
} 

試験

public class GuiceTest { 

    public static void main(String[] args) { 


     Injector injector = Guice.createInjector(new GuiceTestModule()); 

     MyApplication appn = injector.getInstance(MyApplication.class); 
     appn.sendMessage("msg", "guru"); 
    } 

} 

出力できるようにします