将Spring bean设置为null

发布于 2021-02-02 18:10:43

我正在使用Spring将JMS连接工厂注入到我的Java应用程序中。由于仅在生产环境中才需要该工厂,但是在开发过程中却不需要,因此我将Bean定义放入单独的XML中,并将其包含在主applicationContext.xml中。在生产环境中,此额外文件包含常规bean定义。在我的本地开发环境中,我希望此bean为null。当Spring遇到一个未知的引用ID时,试图完全完全删除Bean定义显然会导致错误。

因此,我尝试创建仅返回null的工厂bean。如果我这样做,Spring(2.5.x)会抱怨工厂返回了null,尽管基于FactoryBean接口的Spring API文档,我希望它可以正常工作(请参见Spring API doc)。

XML看起来像这样:

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

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

这样做的“正确”方法是什么?

关注者
0
被浏览
102
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    factory-bean/ factory-method不适用于null,但自定义FactoryBean实现的效果很好:

    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" />
    


  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    Spring不允许你将其null与bean id或别名关联。你可以通过将属性设置为null来处理此问题。

    这是你在Spring 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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看