代码之家  ›  专栏  ›  技术社区  ›  Matt

Guice自定义范围和Spring管理的bean

  •  1
  • Matt  · 技术社区  · 15 年前

    (X-发布到Guice邮件列表)

    我正在试用一个新库上的Guice,该库将位于现有应用程序中。我们现在所有的应用程序都是Spring应用程序,我们有一些绑定到Spring的公共代码,主要与我们倾向于使用的线程模型有关。它基本上给了我们 逻辑线程。

    所以我们可以向它抛出作业,这样可以确保具有给定键的作业总是以提交它们的顺序结束在同一管道上。通常情况下,这是应用程序生命周期中的一个线程,但是如果发生了错误的事情,那么工作线程(支持管道的线程)就会被丢弃、管道被停用、新创建的工作线程以及在该工作线程上重新激活的管道。这里所有的电线都是由弹簧提供的。

    我的新lib需要将其用于线程模型,我计划在逻辑和域方面使用guice,即构建管道上的工作以及它所代表的逻辑。这对我来说很简单,除了一件事 相当粗糙,也就是说我想用“pipe”(也称为逻辑线程)范围注入某些东西。我已经阅读了自定义范围(和SimpleScope实现)wiki页面,但有些事情对我来说不太清楚,请澄清…

    1. 管道在JVM的生命周期中是可以生存的,因此我似乎需要进入一个范围,但永远不会退出,这有什么缺点吗?
    2. 对于在Spring管理的bean中触发作用域条目,我有哪些选择?它只是一个创建Spring上下文然后使用SpringIntegration将SpringBeans吸进一个Guice上下文的例子吗?
    3. 这听起来真的很奇怪吗?我应该用一个单件包裹它,而不是用我的管道ID键?

    干杯 马特

    1 回复  |  直到 15 年前
        1
  •  0
  •   Matt    15 年前

    我已经实现了一些有用的东西,但涉及一些稍微丑陋的设置…仍然对这方面的任何改进感兴趣,可能有太多的代码需要发布,所以只需在其中放入一些片段,希望能有所启发。

    它是simplescope示例的一个变体,涉及到:

    • 启动弹簧CTX
    • 从中获取特定bean(即管道键的注册表)
    • 把它和beanfactory一起传递给guice模块
    • 将该注册表赋予scope impl,以便在激活管道时输入作用域(稍后在初始化某些Spring bean时发生)

    似乎我必须抓取特定的bean,而不是通过在beanfactory上执行bindall之后命名的bean来访问它,因为这个范围实例在模块中是新的,也就是说。

        PipeScope<SecurityId> pipeScope = new PipeScope<SecurityId>();
        pipeScope.setPipeIdRegistry(pipeIdRegistry);
        bindScope(Pipe.class, pipeScope);
        bind(PipeScope.class)
                .annotatedWith(Names.named("pipeScope"))
                .toInstance(pipeScope);
        SpringIntegration.bindAll(binder(), beanFactory);
    

    事实上,我必须更新它意味着我需要明确地向模块提供注册表,因为这是一个鸡蛋和鸡的情况,所以看不到解决方法。

    PipeScope基本上是根据管道键(实际上是键列表)存储值,而不是根据线程本地存储值,因此我的输入如下

    public void enter(List<K> scopedKeys) {
        checkState(values.get(scopedKeys) == null, "A scoping block is already in progress");
        values.put(scopedKeys, Maps.<Key<?>, Object>newHashMap());
    }
    

    总而言之,功能似乎很好…不管怎样,至少在我快速完成的测试中