0

我是春天的新手。只是想知道,是否可以按如下方式检查“ref”属性中的条件?

<bean id="dbInfo" class="DatabaseProperties" factory-method="initDatabaseInformation"/>

<bean id="b1" class="someClass" >
    <property name="prop1" ref="#{ dbInfo.isValidUser? 'bean2' : 'bean3' }"/>
</bean>

<bean id="bean2" class="SomeClass1"/>

<bean id="bean3" class="SomeClass2"/>

通过上面的操作,我得到了 BeanCreationException。这样做的最佳做法是什么?

4

1 回答 1

1

我会建议 4 种方法中的 1 种(选项 2、3 和 4 都是一样的,只是代码放在哪里的问题):

1.弹簧型材,例如:

<beans profile="valid">
  ...
  define 'b1' using 'bean2'
  ...
</beans>
<beans profile="invalid">
  ...
  define 'b1' using 'bean3'
  ...
</beans>

然后在您的代码中的某个地方,您必须根据情况启用正确的配置文件dbInfo.isValidUser- 这是在 Spring Context 引导时完成的。

2.使用工厂方法创建需要注入的bean:

<bean id="b1" class="someClass" factory-method="createDependingUponValidUser">
    <property name="validbean" ref="bean2"/>
    <property name="invalidbean" ref="bean3"/>
    <property name="dbinfo" ref="dbinfo"/>
</bean>

使用工厂方法:

public static SomeClass createDependingUponValidUser(DatabaseProperties dbinfo, SomeClass1 bean2, SomeClass2 bean3) {
        SomeClass b1 = new SomeClass();
        b1.setProp1(dbInfo.isValidUser() ? bean2 : bean3);
        return b1;
}

3.使用基于 Java 的 Spring Context Config

@Configuration
public class AppConfig {

    @AutoWired
    @Bean(name="b1")
    public SomeCLass b1(DatabaseProperties dbinfo, SomeClass1 bean2, SomeClass2 bean3) {
        SomeClass b1 = new SomeClass();
        b1.setProp1(dbInfo.isValidUser() ? bean2 : bean3);
        return b1;
    }
}

(Java 风格的配置和 XML 风格的配置可以混合使用 :-)

4.在构造函数(或方法)中做switchSomeClasssetProp1()'b1'

public SomeClass(DatabaseProperties dbinfo, SomeClass1 bean2, SomeClass2 bean3) {
    this.prop1 = dbInfo.isValidUser() ? bean2 : bean3;
}
于 2013-09-17T21:14:30.590 回答