我正在开发一个基于Spring的应用程序,它注册一个自定义范围"任务".我们的想法是,当一个新的Task启动时,Spring应该提供任务范围的对象.
该任务在运行时中实例化.它以Properties对象的形式提供一些配置.我想ApplicationContext在任务范围内注册该对象,以便该范围内的所有bean都可以引用该特定任务的配置.
这是代码中的粗略思想:
public class MyTask extends SourceTask {
@Override
public void start(Map<String, String> props) {
context = ContextProvider.getApplicationContext();
// Initialize the scope
ConnectorTaskScope scope = context.getBean(ConnectorTaskScope.class);
scope.startNewTask();
// TODO register the props object in the context
// get an object which requires the properties and work with it
context.getBean(SomeScopedBean.class);
}
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何在ApplicationContext适当范围内注册bean .
谢谢
更新:
这里有一些代码可以更好地解释这个问题.SomeScopedBean应该使用bean提供的配置做一些事情,看起来像这样:
public class SomeScopedBean {
@Autowire
public SomeScopedBean (Properties configuration) {
// do some work with the configuration
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序的想法是它应该有多个MyTask运行不同配置的实例,每个任务都是自己的范围.在每个任务的范围内,应该有1个SomeScopedBean使用任务配置初始化的实例.
public class MyApplication {
public static void main (String[] args) {
// ...
Properties config1 = loadConfiguration1();
Properties config2 = loadConfiguration2();
MyTask task1 = new MyTask();
MyTask task2 = new MyTask();
task1.start(config1);
task2.start(config2);
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
如果我接受你的最后评论:
我想要的是在每个作用域内(在每个 MyTask 内)有 1 个 SomeScopedBean 实例,但每个实例都配置有不同的配置属性(这些属性由部署框架在实例化每个任务时提供,
尤其within each MyTask是如果它仅限于MyTask.
你可以:
SomeScopedBean为原型bean@Configuration,它将SomeScopedBean使用提供的属性配置进行实例化首先是配置:
@Configuration
public class SomeScopedBeanFactoryConfiguration {
@Bean
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public SomeScopedBean create(Properties configuration) {
return new SomeScopedBean(configuration);
}
}
Run Code Online (Sandbox Code Playgroud)
然后自动装配SomeScopedBeanFactoryConfiguration并MyTask创建SomeScopedBean:
public class MyTask extends SourceTask {
@Autowired
private SomeScopedBeanFactoryConfiguration someScopedBeanFactoryConfiguration;
@Override
public void start(Map<String, String> props) {
SomeScopedBean scopedBean = someScopedBeanFactoryConfiguration.create(props);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:如果必须使用/范围SomeScopedBean注入多个 bean ,您可以将其范围更改为您的线程范围之一,例如:taskthread
@Bean
@Scope("thread")
public SomeScopedBean create(Properties configuration) {
return new SomeScopedBean(configuration);
}
Run Code Online (Sandbox Code Playgroud)