我需要在没有构造函数参数的情况下创建一个完整的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?
答案 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);
...
}
}