Java 在模块项目中插入和重写相同bean id的bean属性
我的问题是,对于在集群环境中运行多线程的JavaSpring应用程序,应该使用哪种配置策略 应用程序的层次结构如下所示: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
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的内容之前设置该配置)。创建单独的应用程序不在合理的范围内。请求范围的配置太昂贵。出于性能原因,必须在启动时加载配置。太糟糕了