【问题标题】:Inject into a being injected class注入一个被注入的类
【发布时间】:2017-04-19 05:25:46
【问题描述】:

我在我的应用程序中使用 Google guice 进行依赖注入。 我有这样的类结构,

示例取自here


这是我的界面,

package com.journaldev.di.services;

@ImplementedBy(EmailService.class)
public interface MessageService {

    boolean sendMessage(String msg, String receipient);
}

我将在这里实现

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;
    }
}

如果我在这里注入 EmailService。

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。

【问题讨论】:

    标签: java dependency-injection guice


    【解决方案1】:

    你需要看看这些 - https://github.com/google/guice/wiki/InstanceBindingshttps://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 如下所示。

    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");
        }
    
    }
    

    输出:

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

    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-16
      • 2014-11-14
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 2019-06-01
      相关资源
      最近更新 更多