gpt4 book ai didi

spring - 在spring中覆盖bean配置

转载 作者:行者123 更新时间:2023-12-04 03:33:16 27 4
gpt4 key购买 nike

假设我有两个模块。一个是核心,另一个是核心依赖的实现模块。
Core 是该依赖实现模块 war 的 jar 文件。

在核心中,我定义了一个 bean,例如

<bean id="x" class="com.pokuri.X">
<property name="y" ref="y"/>
<property name="z" ref="z"/>
</bean>

该类有一个方法如下
public class X{

public void doSomeJob(){
.......
}

}

这个方法是从一些核心类中调用的。现在我需要根据我的核心相关实现来更改 X 的 doSomeJob() 方法中的逻辑。所以,我创建了一个这样的类
public class ExtX extends X{

@override
public void doSomeJob(){
// changed logic
}

}

并像这样在另一个应用程序上下文 xml 文件中定义了具有相同 id 的 bean。
<bean id="x" class="com.pokuri.ExtX">
<property name="y" ref="y"/>
<property name="z" ref="z"/>
</bean>

我们正在使用 contextConfigLocation 构建应用程序上下文 web.xml 中的上下文参数将值指定为 classpath:springfolder .

但在核心逻辑中,我只得到核心 bean 实例(即 X 实例)而不是 ExtX .我们如何覆盖该 bean 定义并让系统开始使用新的扩展 bean 定义?

而且我听说在不同的应用程序上下文文件中具有相同的 ID 将用稍后加载的 bean 定义覆盖第一次加载的 bean 定义。有没有 priority bean 定义上的一种属性,当找到具有相同 ID 的 bean 时,让 ApplicationContext 使用最高优先级的优先级来考虑低优先级的优先级。

最佳答案

覆盖 bean 定义的一种方法是您所指示的 - 多次使用相同的 id 定义它,并且具有相同 id 的最后一个 bean 定义是生效的。因此,如果您确保 ExtX是最后一个加载的,它应该可以正常工作,并且为了确保这一点,您可以在您的 war 文件中执行此操作,而不是通过说 classpath:springfolder 来加载,您可以在您的 war 的 Spring 配置文件中显式导入核心配置,然后以这种方式覆盖 bean:

<import resource="core-resource.xml"/>
<bean id="x" class="com.pokuri.ExtX">
<property name="y" ref="y"/>
<property name="z" ref="z"/>
</bean>

这将确保您覆盖的 bean 是生效的。

但是,这里没有可以使用的优先级/顺序字段 - 如果您愿意,可以通过提供 Map<String,X> 来加载一个类型的所有 bean 定义。作为参数,并通过期望 order 属性对其进行排序并以这种方式使用它,但是还有很多工作要做。

此处描述了第二种方法: Overriding the bean defined in parent context in a child context

关于spring - 在spring中覆盖bean配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11833804/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com