Java Spring:在声明性SpringXML配置中实现命令式连接的习惯用法?

Java Spring:在声明性SpringXML配置中实现命令式连接的习惯用法?,java,spring,Java,Spring,我是a类的用户,该类别作为库提供给我 在我的Spring配置中,我指定了一个bean,Spring很乐意为我实例化它 作为副作用,a创建自己的B实例,并通过a.getB()公开该实例 B公开了一个set()方法,我希望用我在Spring中配置的C调用该方法 我该怎么做 我已经查看了util:property路径来引用B,但这不允许我在其中放入任何内容 我也研究了代理,但似乎没有办法在我被困在声明式世界中的时候抓住B并对其做些什么 重复,我无法创建B 它仅作为创建a的副作用而创建 A上没有方便的方

我是
a类
的用户,该类别作为库提供给我

在我的Spring配置中,我指定了一个
bean
,Spring很乐意为我实例化它

作为副作用,
a
创建自己的
B
实例,并通过
a.getB()
公开该实例

B
公开了一个
set()
方法,我希望用我在Spring中配置的
C
调用该方法

我该怎么做

我已经查看了util:property路径来引用
B
,但这不允许我在其中放入任何内容

我也研究了代理,但似乎没有办法在我被困在声明式世界中的时候抓住
B
并对其做些什么

重复,我无法创建
B

它仅作为创建
a
的副作用而创建


A
上没有方便的方法允许我调用
A.setC()

看看。它们允许您告诉Spring通过另一条路径而不是使用构造函数(在您的示例中是通过a)获得B。

Spring提供了允许一个Spring bean充当另一个Spring bean的工厂的机制,但是,当你开始将工厂链接在一起时,这种方法很快就会遇到困难——声明式方法在那里不太管用

当您有了如上所述的非平凡的安排时,通常更容易实现自己的安排,这将负责实例化非bean友好的对象图。
FactoryBean
中注入了所有必要的协作者,然后为您提供了所需的命令式方法

此模式通常用于配置没有IoC友好签名的旧组件,但对于构建交互对象的完整图形同样有用。

您可以使用

FactoryBean的方案如下:

  • 使用

    <bean id="myBean" class="myFactoryClass">
          <property name="c" ref="yourObjectToBeInjectedInC" />
    </bean>
    
    
    
  • 创建实现
    FactoryBean
    的factory类
  • 定义名为
    c
    (使用setter/getter)的属性
  • 定义类型为
    a
    的属性,称为
    instance
    ,用于examle
  • afterPropertieSet
    方法中,实例化调用
    this.a=newa()
    ,然后
    a.getB().setC(this.c)
  • getObject()
    方法(BeanFactory
    接口需要)中添加
    返回实例
  • 使
    isSingleton()
    返回
    true
    (当然,如果您不希望它成为原型)
  • 使
    getObjectClass()
    返回
    A.class

您现在可以自由地注入
myBean
(类型
A
)。

假设在构造A时B被实例化,您考虑过这一点吗

<bean id="a" class="com.example.A">
    <property name="b.c" ref="c"/>
</bean>

<bean id="c" class="com.example.C" />   


这表示“使用实例工厂方法的实例化是调用容器中现有bean的非静态方法来创建新bean的地方。”如果库提供了a.createB()方法,这将起作用。但事实并非如此。B已经被创建了,作为一个副作用,我所能得到的只是a.getB()。我在发布答案之前做了一个快速测试,所以是的。感谢各位的回复,我必须在接受答案之前尝试一下,项目的另一个部分出现了问题,所以稍后再发布。敬请期待。。。