注入被注入class
Inject into a being injected class
我在我的应用程序中使用 Google guice 进行依赖注入。
我有一个这样的 class 结构,
例子取自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 class 看起来像这样,
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。
你需要看看这些 - https://github.com/google/guice/wiki/InstanceBindings and 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 如下所示。
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;
}
}
我在我的应用程序中使用 Google guice 进行依赖注入。 我有一个这样的 class 结构,
例子取自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 class 看起来像这样,
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。
你需要看看这些 - https://github.com/google/guice/wiki/InstanceBindings and 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 如下所示。
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;
}
}