Java Spring配置将属性传递给引用的bean
我有以下设置:Java Spring配置将属性传递给引用的bean,java,spring,jakarta-ee,javabeans,Java,Spring,Jakarta Ee,Javabeans,我有以下设置: <bean id="b1" class="SomeClass"> <property name="foo" ref="foo1"/> </bean> <bean id="b2" class="SomeClass"> <property name="foo" ref="foo2"/> </bean> <bean id="foo1" class="FooClass"> &l
<bean id="b1" class="SomeClass">
<property name="foo" ref="foo1"/>
</bean>
<bean id="b2" class="SomeClass">
<property name="foo" ref="foo2"/>
</bean>
<bean id="foo1" class="FooClass">
<constructor-arg index="0"><ref bean="dataSource1"/></constructor-arg>
...other constructor args
</bean>
<bean id="foo2" class="FooClass">
<constructor-arg index="0"><ref bean="dataSource2"/></constructor-arg>
...other constructor args
</bean>
…其他构造函数参数
…其他构造函数参数
有没有办法避免重复FoooClass?我想在BeanB1和b2中添加对FooClass的引用,但指定数据源所有其他构造函数参数都是相同的
谢谢
Jim如果希望在每次调用相应的getter时动态初始化\填充类的某些成员,可以尝试查找方法注入。阅读第3.3.4.1页 因此,即使每次访问分配了查找方法的字段时,包含动态成员的类都是在scope=singletone(SpringBean容器的默认值)中创建的,也会根据查找方法内部实现的业务逻辑获得适当的对象
另外,我在Spring文档中发现了一个很好的例子——我认为它非常清楚。请看“3.4.6.1查找方法注入”您在这里所做的是,使用构造自动连接类,正如aviad所说,您可以使用setter和getter方法进行数据源注入
<bean id="foo" class="FooClass">
<constructor-arg index="0">datasource</constructor-arg>
...other constructor args
</bean>
<bean>your datasource bean1</bean>
<bean>your datasource bean2</bean>
你在上课吗
public void FooClass(Datasource datasource){
private Datasource datasource;
public void setDatSource(Datasource datasource);
public Datasource getDataSource();
}
编辑-根据spring文档,如果构造函数参数的值不变,则可以传递构造函数参数。但对于FooClass,您希望在不同的场合传递不同的数据源(希望我能正确地理解),所以在这种情况下,您需要在spring初始化期间传递datasource实例datasource 1或datasource 2,因为spring在初始化FooClass时会期望构造函数参数。稍后在运行时传递不同的数据源,并使用setter方法设置数据源
bean-spring配置
<bean id="foo" class="FooClass">
<constructor-arg index="0" ref="datasource1"></constructor-arg>
...other constructor args
</bean>
public class FooClass(){
// on spring initialization, it will inject datasource1
public void FooClass(DataSource dataSource){
}
have your setter and getter method for datasource
}
使用抽象bean
<bean id="foo" class="FooClass">
// Set all properties except datasoure
<property name="..." />
</bean>
<bean id="foo1" parent="foo">
<property name="datasource" ref="ds1" />
</bean>
<bean id="foo2" parent="foo">
<property name="datasource" ref="ds2" />
</bean>
//设置除数据源之外的所有属性
当然,您必须使用空构造函数实例化并使用访问器公开FooClass属性。如果您在其他地方不需要
foo1
和foo2
,请使用内部Bean。考虑到您的实现,您可能需要使用Bean定义继承
从春天开始:
bean定义可以包含很多配置信息,
包括构造函数参数、属性值和
特定于容器的信息,如初始化方法、静态
工厂方法名称,等等。子bean定义继承
来自父定义的配置数据。子定义可以
根据需要覆盖某些值或添加其他值。使用父级和子级
bean定义可以节省大量的输入。实际上,这是一种形式
模板制作
基本上,它说的是,您可以有一种“Bean定义模板”,将其标记为抽象,并在其他兼容Bean中使用它作为父级来继承这些配置
该样本取自spring:
还有一点,我目前无法使用注释——配置必须在XML中——我不确定这是如何工作的。在您的示例中,您将向FooClass构造函数传递什么?我认为您必须传递对数据源bean的引用。此外,我无法使用@Autowire。感谢您的回复。我认为这对我的处境没有帮助。从我所看到的,方法注入用于混合单例bean和原型bean。我所有的bean都是单例的,我想做的是,当我只想使用不同的数据源时,尽量避免对同一个类使用几乎相同的配置。如果我真的使用了方法注入,我怎么知道返回哪个数据源呢?谢谢Francisco,我已经使用了您建议的方法,我认为这是实现我想要的而不需要太多重复配置的最佳方法。
public class dataBaseInvoke(){
public Datasource datasource2
public FooClass fooClass;
inside method{
fooClass.setDatasource(datasource2);
fooClass.addFoo();
}
}
<bean id="foo" class="FooClass">
// Set all properties except datasoure
<property name="..." />
</bean>
<bean id="foo1" parent="foo">
<property name="datasource" ref="ds1" />
</bean>
<bean id="foo2" parent="foo">
<property name="datasource" ref="ds2" />
</bean>
<bean id="inheritedTestBean" abstract="true"
class="org.springframework.beans.TestBean">
<property name="name" value="parent"/>
<property name="age" value="1"/>
</bean>
<bean id="inheritsWithDifferentClass"
class="org.springframework.beans.DerivedTestBean"
parent="inheritedTestBean" init-method="initialize">
<property name="name" value="override"/>
<!-- the age property value of 1 will be inherited from parent -->
</bean>
<!-- the way you are already using it -->
<bean id="b1" class="SomeClass">
<property name="foo" ref="foo1"/>
</bean>
<!-- if you use it just once, you could declare it inside the bean that uses it -->
<bean id="b2" class="SomeClass">
<property name="foo">
<bean id="foo1" class="FooClass" parent="foo">
<constructor-arg index="0"><ref bean="dataSource1"/></constructor-arg>
</bean>
</property>
</bean>
<!-- here no class definition, only the default configuration -->
<bean id="foo" abstract="true">
<!-- constructor arg 0 is defined only on child beans -->
<constructor-arg index="1" value="whatever1" />
<constructor-arg index="2" value="whatever2" />
<constructor-arg index="3" value="whatever3" />
<constructor-arg index="4" value="whatever4" />
</bean>
<bean id="foo2" class="FooClass">
<constructor-arg index="0"><ref bean="dataSource2"/></constructor-arg>
</bean>