Java 在模块项目中插入和重写相同bean id的bean属性

Java 在模块项目中插入和重写相同bean id的bean属性,java,spring-mvc,overriding,spring-bean,Java,Spring Mvc,Overriding,Spring Bean,我的问题是,对于在集群环境中运行多线程的JavaSpring应用程序,应该使用哪种配置策略 应用程序的层次结构如下所示: Main application files & config | |__Parent module files & config | |__Child module files & config <bean id="dataProvider" abstract="true" class="com.main.DataProvider

我的问题是,对于在集群环境中运行多线程的JavaSpring应用程序,应该使用哪种配置策略

应用程序的层次结构如下所示:

Main application files & config
|
|__Parent module files & config
   |
   |__Child module files & config
<bean id="dataProvider" abstract="true" class="com.main.DataProvider">
        <constructor-arg ref="child-configuration"/>
        <!-- arg1 inherited from parent and/or main configuration -->
        <!-- arg2 inherited from parent and/or main configuration-->
</bean

<bean id="child-Configuration" class="com.child.Configuration" /> 
@Component
public class DataProvider {
    @Inject private Configuration conf;
    @Inject private OtherData otherData;
    @Inject private MoreData moreData;
}
我有一个@Transactional的数据提供程序:

@Transactional
public class DataProvider {

    protected Configuration configuration;

    public DataProvider(Configuration configuration, DummyArg1 arg1, DummyArg2 arg2) {
        this.configuration = configuration;
        createResult();
        addMoreStuffFromModules();
    }

    private void createResult() {
        this.result.setSomeStuff = "someStuff";
    }

    private void addMoreStuffFromModules() {
        this.result.setSomeMoreStuff = configuration.getModuleDataProvider.getData();
    }
}
主要应用程序配置:

<bean id="dataProvider" abstract="true" class="com.main.DataProvider">
        <constructor-arg ref="main-configuration"/>
        <constructor-arg ref="main-dummyArg1"/>
        <constructor-arg ref="main-dummyArg2"/>
</bean

<bean id="main-Configuration" class="com.main.Configuration" /> <!-- just an empty class in main application -->
<bean id="dataProvider" abstract="true" class="com.main.DataProvider">
        <constructor-arg ref="parent-configuration"/>
        <constructor-arg ref="parent-dummyArg1"/>
        <constructor-arg ref="main-dummyArg2"/>
</bean

<bean id="parent-Configuration" class="com.parent.Configuration" /> 


如果将
配置
设置为bean,则可以在子模块中覆盖该bean,而不覆盖
数据提供程序
bean

更新

基于Java的配置示例,因为我不使用XML配置:

假设您有DataProvider需要的3个bean:

@Component
public class Configuration {
    // main config here
}

@Component
public class OtherData {
}

@Component
public class MoreData {
}
和这样的数据提供者:

Main application files & config
|
|__Parent module files & config
   |
   |__Child module files & config
<bean id="dataProvider" abstract="true" class="com.main.DataProvider">
        <constructor-arg ref="child-configuration"/>
        <!-- arg1 inherited from parent and/or main configuration -->
        <!-- arg2 inherited from parent and/or main configuration-->
</bean

<bean id="child-Configuration" class="com.child.Configuration" /> 
@Component
public class DataProvider {
    @Inject private Configuration conf;
    @Inject private OtherData otherData;
    @Inject private MoreData moreData;
}
然后在其他模块中执行以下操作:

@Component @Primary
public class ChildConfiguration extends Configuration {
    // different config here
}

。。。您将只覆盖配置部分,而不更改其他两部分。

我不完全理解。你能添加一个例子吗?@Component注释是现成的吗?或者我是否需要以某种方式启用注释扫描?如果父模块和子模块都希望覆盖配置,该怎么办?他们能在他们的课堂上提供@Primary吗?如果是,将选择哪一个?@Primary在每个spring上下文中每个bean只能使用一次。您应该创建单独的应用程序,或者可以使用请求范围的配置(这意味着当请求传入时,您确定需要哪种配置,并在调用任何需要DataProvider的内容之前设置该配置)。创建单独的应用程序不在合理的范围内。请求范围的配置太昂贵。出于性能原因,必须在启动时加载配置。太糟糕了