【问题标题】:Spring Dependency Injection - Using instantiated objectSpring 依赖注入 - 使用实例化对象
【发布时间】:2011-12-14 18:39:58
【问题描述】:

在 Spring DI 中,你可以在它自己的定义中“使用”你的 bean 吗?例如,如果我有一个名为 getTest1 的 bean,其中声明了一个内部 bean,我可以将 getTest1 传递给该内部 bean 的构造函数吗?

我想知道是否可以在工作项目中使用 Spring DI 实现类似装饰器模式的解决方案,但没有太多时间来玩弄它。谢谢!

【问题讨论】:

    标签: java spring design-patterns dependency-injection


    【解决方案1】:

    尚未测试,但我认为您需要这样的东西

    <bean id="a" class="com.AClass">
       <property name="aProperty" value="y">
       <property name="bean2">
          <bean class="com.BClass">
            <constructor-arg ref="a"/>
          </bean>
       </property>
    </bean>
    

    查看here 以获取有关在另一个 bean 中引用一个 bean 的更多帮助

    【讨论】:

    • 默认情况下“a”的范围是单例。因此,我认为不会创建全新的“A”bean。有关此问题的讨论,请参见 here
    【解决方案2】:

    decorator 模式可以使用 XML 以如下方式表示:

    <bean id="decorated" class="Outer">
        <constructor-arg>
            <bean class="Middle">
                <constructor-arg>
                    <bean class="Inner"/>
                </constructor-arg>
            </bean>
        </constructor-arg>
    </bean>
    

    这相当于下面的 Java 代码:

    Common decorated = new Outer(new Middle(new Inner()));
    

    考虑使用@Configuration 方法来使其对Java 更友好:

    @Bean
    public Common outer() {
      return new Outer(middle());
    }
    
    @Bean
    public Common middle() {
      return new Middle(inner());
    }
    
    @Bean
    public Common inner() {
      return new Inner();
    }
    

    【讨论】:

    • 这看起来也适用于我正在做的事情,但我正在寻找一种捷径,让 Spring 让我的具体类被装饰而不是编码。感谢您的回答!
    猜你喜欢
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2012-02-26
    • 1970-01-01
    相关资源
    最近更新 更多