我是 Spring 新手。我发现有时我们需要使用运行时数据构造一个对象,但是在Spring的构造函数注入(inject)中使用固定值。我知道我可以创建一个 setter 方法并用它更改值,但我认为这不是一个优雅的解决方案。谁能告诉我怎么做?
最佳答案
使用 SpEL => 通过另一个 Bean
<bean id="bank" class="UsBank">
<property name="moneyLeft" value="100"/> <!-- initial value -->
</bean>
<bean id="bet" class="UsDollars" scope="prototype">
<constructor-arg value="#{ bank.moneyLeft }"/>
</bean>
假设 bank
bean 被注入(inject)到某个地方,所以您可以访问它:
bank.setMoneyLeft( 100 )
Bet currentBet = appContext.getBean( "bet" )
使用 SpEL => 通过表达式
如果这个参数可以用任意表达式计算:
<bean id="bet" class="UsDollars" scope="prototype">
<constructor-arg value="#{ T(java.lang.Math).random() * 100.0 }"/>
</bean>
使用 SpEL => 通过系统属性
如果您的用例允许使用系统属性:
<bean id="bet" class="UsDollars" scope="prototype">
<constructor-arg value="#{ systemProperties['moneyLeft'] }"/>
</bean>
获取bean:
System.setProperty( "moneyLeft", "5000" )
Bet currentBet = appContext.getBean( "bet" )
您可以阅读有关 SpEL 的更多信息.
关于制作 bet
bean 的注意事项 prototype => 如果它被注入(inject)到另一个 bean 中,它(另一个 bean)也需要是一个原型(prototype),或者可以使用一些 AOP 魔法,但在你的情况下它可能并不那么重要。
如果上面的 bean 不必是 prototype
(这意味着您只需要这个 bean 的单个实例,但不需要在应用程序上下文创建时时间),你可以删除 scope="prototype"
并添加一个 lazy="true"
。这将告诉 Spring 仅在首次引用时尝试创建此 bean。
关于java - 注入(inject)运行时值的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9497038/