当前位置: 首页 > 知识库问答 >
问题:

通过辅助注入将创建上下文注入到 guice 托管实例中

经兴安
2023-03-14

我希望能够通过辅助注入创建的对象来发现/注入创建对象的方法的名称。

我想做的一个例子:

// what I want guice to create the implementation for this
interface Preferences {
  Preference<String> firstName();
  Preference<String> lastName();
  // other preferences possibly of other types
}

// my interfaces and classes
interface Preference<T> {
  T get();
  void set(T value);
}
class StringPreference implements Preference<String> {
  private final Map<String, Object> backingStore;
  private final String key;
  @Inject StringPreference(@FactoryMethodName String key, 
                           Map<String, Object> backingStore) {
    this.backingStore = backingStore;
    this.key = key;
  }

  public String get() { return backingStore.get(key).toString(); }
  public void set(String value) { backingStore.put(key, value); }
}

// usage
public void exampleUsage() {
  Injector di = // configure and get the injector (probably somewhere else)
  Preferences map = di.createInstance(Preferences.class);
  Map<String, Object> backingStore = di.createInstance(...);

  assertTrue(backingStore.isEmpty()); // passes

  map.firstName().set("Bob");
  assertEquals("Bob", map.firstName().get());
  assertEquals("Bob", backingStore.get("firstName"));

  map.lastName().set("Smith");
  assertEquals("Smith", map.lastName().get());
  assertEquals("Smith", backingStore.get("lastName"));
}

不幸的是,到目前为止,我想到的实现这一点的唯一方法是

  1. 扩展辅助注射(通过复制和粘贴)以添加我的功能
  2. 写一些与辅助注射非常相似的东西,为我做这件事
  3. 写很多样板,在没有guices帮助的情况下做到这一点

我正在寻找一个解决方案,大致如下:

    < li >实现这一点的一些guice配置或模式 < li >实现此功能的一些扩展 < li >文档/我可以查找的位置示例,这些文档/示例将帮助我自己编写此文档 < li >示例应用程序的替代模式以完成我想要做的事情

共有1个答案

卢骏俊
2023-03-14

您真正的请求,关于注入创建上下文,是不可能的,并且在Guice中也不可能。(直接链接到错误)

其他一些想法:

>

  • 如果您的用例可以满足只读属性,请使用Names.bind属性,这将允许整个属性实例(或Map

    如果您只是为每个注入类寻找单独的 Map,请不要忘记您可以编写自己的工厂。

    class PreferenceMapOracle {
      private static final Map<Class<?>, Map<String, String>> prefMap =
          Maps.newHashMap();
    
      public Map<String, String> mapForClass(Class<?> clazz) {
        if (prefMap.contains(clazz)) {
          return prefMap.get(clazz);
        }
        Map<String, String> newMap = Maps.newHashMap();
        prefMap.put(clazz, newMap);
        return newMap;
      }
    }
    
    class GuiceUser {
      private final Map<String, String> preferences;
    
      @Inject GuiceUser(PreferenceMapOracle oracle) {
        preferences = oracle.mapForClass(getClass());
      }
    }
    

    Guice中内置的任何内容都不会自动反映您的Preferences接口,并在没有的地方创建bean样式的实现。您可能可以通过自由使用动态代理对象,或者使用一个像GSON这样提供出色反射支持的包来编写自己的聪明框架。您仍然需要以某种方式提供这些反射式创建的接口,但我可以很容易地想象这样的调用:

    preferences = oracle.getPrefs(Preferences.class);
    

  •  类似资料:
    • 假设有一个类A,它的构造函数是这样的: 还有AFactory: 所以要创建一个A的实例,我显然需要做这样的事情: 但是,假设我有其他类:例如,B类、C类和D类具有类型为A的成员(带有字段注入,但也可以是ctor): 我希望将 A 的相同实例注入到这些类中。但仍然可以选择将 A 的另一个实例注入其他类(假设 E 类和 F 类)。 正确的做法是什么?我就是想不出一个干净的方法来做到这一点。

    • 我有一个工厂是这样的: 这样的类: 如何正确使用Google Guice来做同样的事情?我尝试了辅助注射,但我不确定如何创建“UrlBuilder”。谁能帮忙?

    • 我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con

    • 看来Guice正在尝试使用不同于预期的创建方法。你知道怎么解决这个问题吗?如有任何指示,将不胜感激! 谢谢!

    • 我一直在用guice做一个项目。 我有一个抽象类,它有很多实现。为了使用正确的实现,我使用一个工厂,它接收参数,然后返回正确的实例。 演示代码 我想知道的是,如果我可以用替换工厂,直接注入的实现(请注意,它们应该使用辅助注入)? 谢谢你。

    • 主要内容:实例,运行测试结果以下代码显示了如何进行bean注入。 我们先定义一个消息bean,它有一个字符串属性来存储消息。 然后我们再定义另一个托管bean,并使用注解注入。 实例 打开 NetBean8.2,创建一个名为: InjectManagedBeans 的工程,并加入以下文件代码。 以下是文件:UserBean.java 中的代码 - 以下是是文件:index.xhtml 中的代码 - 以下是文件:Message