Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring配置将属性传递给引用的bean_Java_Spring_Jakarta Ee_Javabeans - Fatal编程技术网

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>