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>
- 创建实现
的factory类FactoryBean
- 定义名为
(使用setter/getter)的属性c
- 定义类型为
的属性,称为a
,用于examleinstance
- 在
方法中,实例化调用afterPropertieSet
,然后this.a=newa()
a.getB().setC(this.c)代码>
- 在
方法(BeanFactory接口需要)中添加getObject()
李>返回实例
- 使
返回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()。我在发布答案之前做了一个快速测试,所以是的。感谢各位的回复,我必须在接受答案之前尝试一下,项目的另一个部分出现了问题,所以稍后再发布。敬请期待。。。