代码之家  ›  专栏  ›  技术社区  ›  Brian Laframboise

如何自动创建和注入缺少依赖项的代理?

  •  4
  • Brian Laframboise  · 技术社区  · 16 年前

    package com.acme;
    
    public class Foo {
      private Bar bar;
      public void setBar(Bar newBar) {
        this.bar = newBar;
      }
    }
    
    @AcmeService
    public interface Bar {}
    

    以及Spring配置文件:

    <beans>
      <bean id="foo" class="com.acme.Foo">
        <property name="bar" ref="bar" />
      </bean>
    </beans>
    

    1. 捕获缺失的依赖异常(或检测是否会有)
    2. 发现bean“foo”缺少的依赖项“bar”的类型是com.acme。酒吧
    3. Acme服务 ,所以我们将处理它。否则,错误可能被视为致命的
    4. 生成com.acme类型的代理。酒吧

    我最初被吸引到 BeanFactory后置处理器

    • 将所有Spring上下文文件替换为我的服务层bean定义,并使用一个生成以下代理的上下文文件@ Acme服务 bean接口。

    除了整个“动态生成代理”部分,我所有这些都在工作。目前,我在上下文文件中定义了我的服务接口的空实现,这样它们就可以被注入和建议——但我宁愿不生成和签入那么多空接口类。最后,我假设我需要生成这些代理,因为我不知道如何建议对空依赖项的尝试调用。

    1 回复  |  直到 16 年前
        1
  •  2
  •   skaffman    16 年前

    好吧,这里有很多事情要谈。

    <property name="bar" ref="bar"/> 并且没有bean定义 bar BeanFactory

    最接近您所要求的现有机制是自动布线 AutowiredAnnotationBeanPostProcessor 。你可以把它作为自己写作的指南 BeanPostProcessor 它查看容器实例化的每个bean,查找具有以下类型的属性 @AcmeService 注释。当它找到一个代理时,它可以为该类型生成一个代理并注入它。

    这就引出了代理生成本身。寻找它的地方是 ProxyFactory 。这允许您在运行时生成实现任何接口或扩展任何类的对象,同时附加顾问/拦截器。这些拦截器可以完成所有的工作——如果你不想的话,代理不必在它后面有任何东西。

    <属性name=“bar”ref=“bar“/> 配置中的条目-属性在中的存在 Foo 将足以触发该过程。