java - 注入(inject)运行时值的更好方法

标签 java spring dependency-injection

我是 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/

相关文章:

java - 正则表达式分组和匹配

Java 对象是我类(class)的 super 对象吗?

Spring Boot - 不再在配置上调用 destroy()

c# - 使用 TinyIoC 进行构造函数注入(inject)

java - 如何修复外部 jar 导入中的 Autowiring

java - 读取 .xlsx 文件时出现 "Your InputStream was neither an OLE2 stream, nor an OOXML stream"

java - NoClassDefFoundError 在java中使用蓝牙

java - Spring 启动: Json Response is not Mapping to Entity

java - 如何做进程异步?

c# - .NET Core 2.2 DI 容器中的上下文绑定(bind)?