动态创建Spring中的Bean

时间:2012-07-08 14:10:05

标签: java spring session asynchronous

我正在使用Spring3.1

我的应用程序将有一种bean-manager。

该经理将能够检索请求,并且在每个请求中我需要动态创建新的bean实例,该实例将使用它自己的唯一参数启动。

将通过请求方法检索params。

这个bean必须是活动的并且异步工作。 (例如,它将监听jms调用,按需执行方法等等。)

此外,我想要选择销毁豆类。

这些bean可能类似于会话,因此当用户注销时,我将销毁这些bean。

我知道我必须创建某种bean-list或bean池并使用某种管理器来管理它。

如何动态创建这些bean并让它们保持活着直到我销毁它们?

任何想法我怎么能实现这样的东西?

2 个答案:

答案 0 :(得分:3)

从这个意义上说,最简单的方法是创建一个StaticApplicationContext设置其父上下文作为公共上下文(持有您想要共享所有bean的bean)。这可以通过以下方式达到:

StaticApplicationContext innerContext = new StaticApplicationContext(parentContext);

在此之后,您可能希望声明要在Spring上实例化的bean,以便附加所有AOP内容,自动装配和其他功能,因此您需要执行以下操作:

innerContext.registerSingleton("beanName", beanClass);

注册后,您可以实例化bean:

innerContext.getBean(beanClass);

当然有spring的范围Session的实现,因此我建议你检查WebApplicationContext文档,方法loadParentContext,你基本上将ServletContext作为参数传递。

答案 1 :(得分:0)

我在运行时动态创建bean并在应用程序的任何地方使用它时也遇到了很多麻烦。

这是完整的代码

static ApplicationContext appContext = new ClassPathXmlApplicationContext(
            new String[] { "Spring-Question.xml" });
    static StaticApplicationContext innerContext = new StaticApplicationContext(appContext);

创建bean并设置值,例如

innerContext.registerSingleton("beanName", Test.class);
        Test test = innerContext.getBean(Test.class);
        test.setA(3);
        test.setB(4);

然后在应用程序的任何地方重新使用bean ....

Test test = innerContext.getBean(Test.class);
        System.out.println(test.setB(4));