具有动态构造函数值的弹簧豆

2022-09-03 00:48:07

我需要创建一个没有构造函数参数的完全对象。类似的东西

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 managed bean?


答案 1

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

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

然后:

getBean("myBean", myTimeoutValue);

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

P.S. 现在比 不推荐使用的语法更可取 - 它更明确,但做同样的事情。scope="prototype"singleton="false"


答案 2

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


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

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


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


这在一定程度上取决于您希望超时的实际值。


推荐