具有动态构造函数值的spring bean

时间:2012-01-07 19:54:19

标签: java spring

我需要在没有构造函数参数的情况下创建一个完整的Object。像这样的东西

Class A  {
  private final int timeOut
  public A(int timeout)
  {
     this.timeOut = timeout;
   }
 //...
}

我希望这个Bean能够进行弹簧管理,以便我以后可以使用Spring AOP。

<bean id="myBean" class="A" singleton="false">
</bean>

但是我的bean需要超时才能作为动态值传递 - 有没有办法在构造函数中创建一个动态值被绑定的spring托管bean?

3 个答案:

答案 0 :(得分:25)

BeanFactory有一个getBean(String name, Object... args)方法,根据javadoc,它允许您指定用于覆盖bean定义自己的参数的构造函数参数。因此,您可以在beans文件中放置一个默认值,然后在需要时指定“实际”运行时值,例如

<bean id="myBean" class="A" scope="prototype">
   <constructor-arg value="0"/> <!-- dummy value -->
</bean>

然后:

getBean("myBean", myTimeoutValue);

我自己没试过,但它应该有用。

P.S。 scope="prototype"现在优于singleton="false",这是不推荐的语法 - 它更明确,但做同样的事情。

答案 1 :(得分:1)

两种选择春天(没有双关语):


<强> 1。创建一个超时工厂,并将其用作构造函数参数。 您可以创建一个实现 FactoryBean 的bean,它的工作是创建其他bean。因此,如果你有一些产生加密盐的东西,你可以让它从 getObject()返回一个EncryptionSalt对象。在你的情况下,你想要生成整数。

以下是一个示例:http://www.java2s.com/Code/Java/Spring/SpringFactoryBeanDemo.htm


<强> 2。创建一个包装动态设置的int的超时bean,并将其保留为“原型”状态,以便每次都创建 而不是去创建工厂的麻烦,EncryptionSalt对象可以被声明为原型bean,因此当它被注入时,每次都会创建一个新对象。将逻辑放入构造函数或其他位置。


在某种程度上取决于您希望实际超时的值。

答案 2 :(得分:1)

明确地做:

interface Bean {
    void setTimeout(int timeout);
}

class BeanImpl implements Bean {
    private int timeout;

    @Override
    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }
    ...
}

<bean id="bean" class="BeanImpl" scope="prototype">
    ...
    <!-- Nothing about timeout here -->
    ...
</bean>

class Client {
    private Bean bean;
    public void setBean(Bean bean) {
        this.bean = bean;
    }
    ...
    public void methodThatUsesBean() {
        int timeout = calculateTimeout();
        bean.setTimeout(timeout);
        ...
    }
}