首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注入正在被注入的类

注入正在被注入的类
EN

Stack Overflow用户
提问于 2017-04-18 17:21:06
回答 1查看 103关注 0票数 2

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

示例取自这里

这是我的界面

代码语言:javascript
复制
package com.journaldev.di.services;

@ImplementedBy(EmailService.class)
public interface MessageService {

    boolean sendMessage(String msg, String receipient);
}

我将在这里实施

代码语言:javascript
复制
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。

代码语言:javascript
复制
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类是这样的,

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-18 21:25:46

你需要看看这些- https://github.com/google/guice/wiki/InstanceBindingshttps://github.com/google/guice/wiki/ProvidesMethods

代码语言:javascript
复制
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如下所示。

代码语言:javascript
复制
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;
    }
}

让我们来测试

代码语言:javascript
复制
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");
    }

}

产出:

代码语言:javascript
复制
Email Message sent to guru with message=msg
i is injected with 10

EmailService也可以使用@Provides这样编写

代码语言:javascript
复制
@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;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43478508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档