【问题标题】:Create Beans in Spring dynamiclly在 Spring 中动态创建 Bean
【发布时间】:2012-07-08 14:10:04
【问题描述】:

我使用的是 Spring3.1

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

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

参数将通过请求方法检索。

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

此外,我还想拥有销毁 bean 的选项。

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

我知道我必须创建某种 bean-list 或 bean 池并使用某种管理器对其进行管理。

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

知道如何实现这样的事情吗?

【问题讨论】:

  • 它们需要成为 Spring bean 有什么原因吗?为什么不只是应用程序中的常规对象?
  • 因为我希望那些对象参与到“Spring 框架”中来考虑 aop/transaction/wiring。我还想控制会话池并控制我不想自己实现的实例的数量。否则我不需要 Spring。

标签: java spring session asynchronous


【解决方案1】:

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

StaticApplicationContext innerContext = new StaticApplicationContext(parentContext);

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

innerContext.registerSingleton("beanName", beanClass);

注册后你可以像这样实例化bean:

innerContext.getBean(beanClass);

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

【讨论】:

  • 嗨,你说我应该使用原型。但原型等于有状态。我的案子似乎是一个有状态的案子吗?谢谢。
  • 我刚刚评论了原型,因为我不知道你想如何存储它,如果它在用户的会话中......
  • 当您说用户会话时 - 它在用户会话中,但不是通过 web/http。用户将通过某种协议连接到其他地方,我将不得不创建一个新会话并管理它,直到用户自己注销为止。
  • 我明白了,我想多了,原型没有多大意义,因为这取决于你如何创建StaticApplicationContext,如果你有每个用户,你可以持有你的用户-该上下文中的特定 bean 并在会话结束时终止它。
  • 你能编辑一下你的答案并给我看例子吗?你是什​​么意思持有用户特定的bean?对于所有具有不同状态的用户,我都有相同的 bean。每次用户登录时,我都必须创建一个新的 bean,并且该 bean 将保持活动状态并异步工作,直到我杀死它(这将在用户注销时发生)
【解决方案2】:

我还发现在运行时动态创建 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2017-11-19
    • 2013-11-16
    • 2012-08-18
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多