Spring - 在运行时注册scoped bean

art*_*emb 14 java spring

我正在开发一个基于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)

Nic*_*rot 5

如果我接受你的最后评论:

我想要的是在每个作用域内(在每个 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)

然后自动装配SomeScopedBeanFactoryConfigurationMyTask创建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)