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

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

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

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

   

但是我的bean需要超时才能作为动态值传递 – 有没有办法创建一个弹簧托管bean,其动态值在构造函数中被注入?

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

     

接着:

 getBean("myBean", myTimeoutValue); 

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

PS scope="prototype"现在比singleton="false"更好,这是不推荐的语法 – 它更明确,但做同样的事情。

两个选项spring(没有双关语)想到:


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

这是一个例子: http : //www.java2s.com/Code/Java/Spring/SpringFactoryBeanDemo.htm


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


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

明确地做:

 interface Bean { void setTimeout(int timeout); } 

 class BeanImpl implements Bean { private int timeout; @Override public void setTimeout(int timeout) { this.timeout = timeout; } ... } 

  ...  ...  

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