有意将 Spring Bean 设置为 null

2022-09-01 04:56:22

我正在使用Spring将JMS连接工厂注入到我的Java应用程序中。由于这个工厂只在生产环境中是必需的,而不是在我开发的时候,所以我把bean定义放到一个单独的XML中,我把它包含在我的主应用程序Context.xml中。在生产环境中,此额外文件包含常规 Bean 定义。在我的本地开发环境中,我希望这个bean为空。试图简单地删除豆定义all-toghether显然会导致一个错误,当Spring遇到一个它不知道的引用ID时。

所以我尝试创建一个工厂bean,它只会返回null。如果我这样做,Spring(2.5.x)抱怨工厂返回null,尽管基于FactoryBean接口的Spring API文档,我希望这能起作用(参见Spring API文档)。

XML 如下所示:

<bean id="jmsConnectionFactoryFactory" class="de.airlinesim.jms.NullJmsConnectionFactoryFactory" />

<bean id="jmsConnectionFactory" factory-bean="jmsConnectionFactoryFactory" factory-method="getObject"/>

什么是“正确”的方法?


答案 1

我很确定Spring不会允许你与bean id或别名相关联。您可以通过将属性设置为 null 来处理此问题。null

以下是您在春季 2.5 中执行此操作的方式

<bean class="ExampleBean">
    <property name="email"><null/></property>
</bean>

在Spring 3.0中,您还应该能够使用Spring表达式语言(SpEL);或者例如:

<bean class="ExampleBean">
    <property name="email" value="#{ null }"/>
</bean>

或任何计算结果为 的 SpEL 表达式。null

如果您使用的是占位符配置器,您甚至可以这样做:

<bean class="ExampleBean">
    <property name="email" value="#{ ${some.prop} }`"/>
</bean>

其中,可以在属性文件中定义为:some.prop

some.prop=null

some.prop=some.bean.id

答案 2

factory-bean/factory-method不适用于 ,但自定义实现工作正常:nullFactoryBean

public class NullFactoryBean implements FactoryBean<Void> {

    public Void getObject() throws Exception {
        return null;
    }

    public Class<? extends Void> getObjectType() {
        return null;
    }

    public boolean isSingleton() {
        return true;
    }
}
<bean id="jmsConnectionFactory" class = "com.sample.NullFactoryBean" />

推荐