【问题标题】:Best way to manually pull a spring bean?手动拉弹簧豆的最佳方法?
【发布时间】:2009-08-11 21:15:06
【问题描述】:

如何手动拉一个spring bean?我有一个相当大的 Web 应用程序,在给定的服务中,瞬态对象需要访问特定于机器的 bean(数据库连接信息)。由于应用程序在集群中运行,所以这个瞬态对象(可以在服务器之间反弹)总是需要从当前的 spring 上下文和服务器中获取正确的连接。

那么,手动将 bean 从弹簧中拉出的最佳方法是什么?

【问题讨论】:

    标签: java spring tomcat javabeans


    【解决方案1】:
    WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
    
    Object o = ctx.getBean("dataSource");
    

    当然你可以像这样转换 bean:

    DataSource d = (DataSource) ctx.getBean("dataSource");
    

    【讨论】:

    • 我在域模型中,但它是一种服务/域混合体,可以满足我的特定需求。有什么方法可以在不通过我的深层服务层的情况下获取 ServletContext?
    【解决方案2】:

    您可以让您的服务实现 ApplicationContextAware,这样您就可以访问 ApplicationContext 本身并可以直接在其上调用 getBean()。

    【讨论】:

      【解决方案3】:

      我建议将您尝试在“创建时”拉入域对象的对象注入。这意味着每当您的域对象在特定服务器上创建时,它将被注入正确的(特定于机器的)bean。

      【讨论】:

      • 虽然这并没有真正的帮助,因为当域对象移动到另一台服务器时信息会发生变化。
      • 是的...当 bean 被“移动”到另一个服务器时,它会在那里重新创建。一旦它创建,它将被注入另一个 bean。了解 Spring 和 AOP
      【解决方案4】:

      需要获取数据库连接信息吗?将连接存储在JNDI and look it up in the bean 中怎么样?假设您的服务器提供它。

      【讨论】:

      • 那将是不必要的网络流量。所有信息在域对象所在的服务器上都是已知的
      • JNDI 与网络无关......它基本上是以您可以在服务器上查找的已知名称存储一个对象。
      • 这是我所说的一个例子 - javapractices.com/topic/TopicAction.do?Id=127
      猜你喜欢
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多