【问题标题】:Spring and delaying Bean Init to after properties have been setSpring 并将 Bean Init 延迟到属性设置后
【发布时间】:2013-02-14 11:15:29
【问题描述】:

我有一些代码只有在运行时才知道属性。

在这种情况下,用户可以输入 URL 以及用户名和密码。

ConnectionFactory cf = (ConnectionFactory) this.factory.getBean(
            "topicConnectionFactory", <URL which is entered at runtime>)
final UserCredentialsConnectionFactoryAdapter connectionFactory = this.factory
            .getBean(UserCredentialsConnectionFactoryAdapter.class);

    connectionFactory.setTargetConnectionFactory(cf);

UserCredentialsConnectionFactoryAdapter 没有构造函数基础设置,因此唯一的方法是使用无参数构造函数创建并设置属性,但是 spring 运行 InitializingBean 会引发 TargetConnectionFactory 的错误未设置。

有没有办法在 spring 创建期间传递此信息,或者为 spring 延迟 Bean 的初始化。

为了理解范围,下面是spring的配置部分。

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"
    scope="prototype" />


<bean id="userCredentialsConnectionFactory"     class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"
    scope="prototype" >
</bean>

<bean id="cachingFactory"
    class="org.springframework.jms.connection.CachingConnectionFactory"
    scope="prototype" />

<bean id="tibcoTopicConnectionFactory" class="com.tibco.tibjms.TibjmsTopicConnectionFactory"
    scope="prototype" />

如前所述,url、用户名和密码直到运行时才知道,并且可以更改。该应用程序是多线程的。想法是连接到某个地方,发送消息,断开连接

【问题讨论】:

  • 你能提供更多关于 bean 声明(bean 范围)的细节吗?你的应用是多用户的吗?
  • 添加了额外的 - 原型范围和多线程(多用户请求)。它不是 Web 应用程序,而是单独的标准。

标签: java spring


【解决方案1】:

您可以执行以下操作:

编写您自己的 UserCredentialsConnectionFactoryAdapter 扩展,将 ConnectionFactory 作为构造函数参数:

public class CustomUserCredentialsConnectionFactoryAdapter extends UserCredentialsConnectionFactoryAdapter {

    public CustomUserCredentialsConnectionFactoryAdapter(ConnectionFactory target){
        super();
        setTargetConnectionFactory(target);
    }

}

然后像这样使用它:

ConnectionFactory cf = (ConnectionFactory) this.factory.getBean(
        "topicConnectionFactory", <URL which is entered at runtime>)
final UserCredentialsConnectionFactoryAdapter connectionFactory = this.factory
        .getBean("userCredentialsConnectionFactory", cf);

不要忘记更改您的 bean 声明:

      <bean id="userCredentialsConnectionFactory"
       class="com.company.CustomUserCredentialsConnectionFactoryAdapter"
scope="prototype" >
    </bean>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2020-04-27
    • 2019-03-19
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多