大佬教程收集整理的这篇文章主要介绍了是否可以使用不完整的依赖树创建 Java Guice 依赖注入器?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我能否让注入器稍后使用其提供程序并在 createChildInjector
之后请求?
举个例子:
class App {
public static voID main(String[] args) {
Injector injector = Guice.createInjector(new UserPropertIEs());
User user = new User("Some name");
injector.createChildInjector(new MyUserModule(user));
String myname = injector.geTinstance(Key.get(String.class,names.named("Myname")));
System.out.println(myName);
}
}
@Value
class User {
String name;
}
class UserPropertIEs extends AbstractModule {
@ProvIDes
@Singleton
@named("Myname")
public String myname(User user) {
return user.getname();
}
// won't be used because we aren't interested Now in getTing TargetUser
// List<User> Could also be in a separated module that get all users from database
@ProvIDes
@Singleton
@named("TargetUser")
public User targetname(@named("TargetUsername") String name,List<User> users) {
return users.stream().filter(user -> user.getname().equals(Name)).findAny().get();
}
}
@AllArgsConstructor
class MyUserModule extends AbstractModule {
private final User user;
@Singleton
@ProvIDes
public User user() {
return user;
}
}
@AllArgsConstructor
class TargetUserModule extends AbstractModule {
private final String name;
@ProvIDes
@Singleton
@named("TargetUsername")
public String targetUsername() {
return name;
}
}
我认为 UserPropertIEs 模块知道如何根据目标用户名和用户列表提供目标用户是公平的,但我在此示例中的应用程序不需要目标用户,它只是想知道“我的名字”。
所以基本上,我想要一个模块,如果我的应用程序要求此信息,它会知道如何表现,但如果没有,它仍然能够编译和运行我提供的尽可能多的信息.
有意义吗?
您可以使用 OptionalBinder
(javadoC) 执行此操作:
import javax.inject.Qualifier;
/** Binding Annotation for the name (a String) of the current User. */
@Qualifier
@Target({ FIELD,PARAMETER,METHOD })
@Retention(RUNTIME)
@interface UserName {}
class App {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new UserPropertymodule());
User user = new User("Some Name");
Injector childInjector = injector.createChildInjector(new MyUserModule(user));
String myName = childInjector.geTinstance(Key.get(String.class,UserName.class));
System.out.println(myName);
}
}
@Value
class User {
String name;
}
class UserPropertymodule extends AbstractModule {
@Override
protected void configure() {
OptionalBinder.newOptionalBinder(binder(),User.class)
.setDefault().toProvider(DefaultUserProvider.class);
}
@Provides @UserName String provideUserName(User user) {
return user.getName();
}
}
class DefaultUserProvider implements Provider<User> {
@Override
public User get() {
// Called to get the default user
}
}
@AllArgsConstructor
class MyUserModule extends AbstractModule {
private final User user;
@Override
protected void configure() {
OptionalBinder.newOptionalBinder(binder(),User.class)
.setBinding().toInstance(user);
}
}
注意事项:
Optional<User>
@Named
相比,它的类型更安全(而且它允许添加 Javadoc)以上是大佬教程为你收集整理的是否可以使用不完整的依赖树创建 Java Guice 依赖注入器?全部内容,希望文章能够帮你解决是否可以使用不完整的依赖树创建 Java Guice 依赖注入器?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。